J'ai trois champs de recherche distincts sur mon site Web: species
recherche CPT, glossary
recherche CPT et une recherche générale dans laquelle j'aimerais effectuer une recherche dans les types d'articles post
et species
.
Mes questions sont triples,
searchform-species
, searchform-glossary
, search
et searchresults
pour spécifier que ma recherche par espèce ne renverra que les résultats des espèces, le glossaire renverra les résultats du glossaire, etc.Le code que j'essaie actuellement est le suivant:
CODE POUR # 1
add_action( 'template_redirect', 'my_rewrite' );
function my_rewrite() {
if ( is_search() and false === strpos( $_SERVER['REQUEST_URI'], '/search/' ) ) {
wp_redirect( get_bloginfo( 'home' ) . '/search/' . str_replace( ' ', '+', str_replace( '%20', '+', get_query_var( 's' ) ) ) );
exit();
}
}
CODE POUR # 2 & # 3
searchform.php
<?php
$search_query = get_search_query();
if (!$search_query) {
$search_query = "SEARCH";
}
?>
<form id="topbar_search" action="<?php echo home_url( '/' ); ?>" method="post">
<p>SEARCH</p>
<input type="text" size="50" value="<?php echo $search_query; ?>" name="s" id="s" class="topbar_longinput default-value" />
<input type="submit" value="GO" class="topbar_submit" />
<p class="tinylinks"><a href="#1">advanced search</a></p>
</form>
searchform-espèce.php
<h1 class="profilesearch">PROFILE<span class="white">SEARCH</span></h1>
<form id="profilesearch" action="<?php echo home_url( '/' ); ?>" method="post">
<input type="hidden" name="type" value="profile" />
<input type="text" size="50" class="default-value" value="SEARCH" name="s" />
<input type="submit" value="GO" class="profilesearch_submit" />
<!-- <p class="tinysearch"><a href="/dev/advanced-search/">ADVANCED SEARCH</a></p> -->
<input type="checkbox" name="showthumbnails" id="showthumbnails" class="checkbox" <?php if ($_POST["showthumbnails"] == "on") { echo 'checked="checked" '; } ?>/><label for="showthumbnails">HIDE THUMBNAILS</label>
</form>
search.php
if (isset($_REQUEST["type"])) {
switch ($_REQUEST["type"]) {
case "profile" :
$post_type = "species";
break;
case "glossary" :
$post_type = "glossary";
break;
default :
$post_type = array( 'post', 'species' );
break;
}
} else {
$post_type = array( 'post', 'species' );
}
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
$args = array(
's' => $search_term,
'post_type' => $post_type,
'paged' => $paged
);
?>
<?php get_template_part('searchresults'); ?>
Ce qui se passe actuellement est la suivante:
Les recherches individuelles fonctionnent, mais la pagination ne fonctionne pas. Lorsque je clique sur mon bouton next/previous_posts_link
, il ajoute /page/2/
à l'URL et ne fait rien. Si j'essaie de faire écho à get_query_var('page')
, il retourne NULL
. Si j'essaie plutôt de renvoyer 'paged'
, il renvoie 0
.
De plus, lorsqu'un utilisateur clique sur ce lien, la variable $search_query
de searchform.php est affichée sous la forme page/bettas
(où bettas
est la requête d'origine).
Idéalement, ce que j'aimerais arriver, c'est ceci:
/search/betta
, qui répertorie tout contenu post
ou species
contenant le mot betta ./search/betta/species
(ou ce qui convient le mieux pour le référencement) et affiche une liste de contenu uniquement species
contenant le mot betta .previous_posts_link
). L'URL devient /search/betta/species/page/2
et l'utilisateur peut voir les 25 prochaines espèces répertoriées.Je suis un novice complet à la WP réécriture et à la pagination; toute aide serait donc la bienvenue.
La pagination peut être effectuée exactement de la même manière que dans les modèles d'archives de recherche.
Votre requête personnalisée et votre variable de type dans search.php ne sont pas non plus nécessaires. Pour rechercher une publication personnalisée particulière, vous pouvez modifier la requête ou accéder à l’archive de cette publication et ajouter la requête de recherche, par exemple.
example.com/event_post_type/?s=term
La même chose est vraie de n'importe quelle archive de catégorie ou de taxonomie, ajouter simplement? S = searchterm à la fin la transformera en une requête de recherche, tout comme ajouter/feed/à la fin de l'URL vous donnera un flux RSS2 pour cette page particulière/contenu de l'archive.
Votre tâche consiste à ajouter une règle de réécriture supplémentaire pour la convertir en quelque chose de plus agréable, par exemple:
function search_rewrite( $wp_rewrite ) {
$feed_rules = array(
'search/(.+)/events' => 'index.php?post_type=events&s='. $wp_rewrite->preg_index(1)
);
$wp_rewrite->rules = $feed_rules + $wp_rewrite->rules;
}
// refresh/flush permalinks in the dashboard if this is changed in any way
add_filter( 'generate_rewrite_rules', 'search_rewrite' );
Vous permettrait de faire exemple.com/search/searchterm/events, bien que je conseille/events/search/searchterm comme meilleur moyen de le faire.
Utilisez le plug-in d’analyseur de règles de réécriture monkeyman pour tester vos modifications. Vous trouverez plus de détails sur les règles de réécriture dans cette réponse ici: Jolie URL avec add_query_var