Ceci est une question basée sur les commentaires de la réponse ici .
J'utilise le code suivant pour créer deux zones de recherche différentes pour mon site Web:
<form action="<?php echo home_url( '/glossary/' ); ?>" method="get">
<p style="font-size:12px;">SEARCH<strong class="dkblue">GLOSSARY</strong></p>
<input type="text" name="s" value="" />
<input type="submit" value="GO" class="glossary_submit" />
</form>
<form id="profilesearch" action="<?php echo home_url( '/species/' ); ?>" method="get">
<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>
Ma glossary
CPT a la création suivante $args
:
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'exclude_from_search' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'capability_type' => 'post',
'has_archive' => false,
'hierarchical' => true,
'menu_position' => 40,
'menu_icon' => $this->plugin_url . 'images/glossary.png',
'supports' => array('title','editor','thumbnail','page-attributes')
);
Et mon species
CPT a:
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'has_archive' => true,
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => 5,
'menu_icon' => $this->plugin_url . 'images/fish20.png',
'supports' => array('author','thumbnail','excerpt','comments','revisions')
);
Actuellement, lorsque je soumets une recherche à partir du formulaire de glossaire, l'URL devient: /glossary/?s=term
. Lorsque je soumets une recherche à partir du formulaire d’espèce, l’URL devient: /search/term
.
L'URL du glossaire fait ce qu'il est censé faire: recherche uniquement les types glossary
CPT. Cependant, l'URL de l'espèce cherche simplement tout.
Si je change has_archive
en false
, les recherches fonctionnent comme indiqué ci-dessus glossary
. Si je le change en true
, les recherches fonctionnent comme indiqué ci-dessus species
.
Voici ce que je veux que les deux fassent: changez l’URL en /search/cpt-slug/term
, c’est-à-dire /search/species/bettas
et recherchez uniquement les publications avec ce CPT.
Ai-je fait quelque chose de mal avec mon $args
?
Très malheureux, alors que ma solution initiale était élégante, je ne prévoyais pas cette complication et je m'excuse pour le désagrément occasionné.
Je propose donc une solution alternative.
Tout d’abord pour obtenir votre requête de recherche sophistiquée:
Votre balisage devra changer, mais cela interceptera les URL et les réécrira correctement en interne, il est similaire à l’autre réponse, mais il est plus joli, plus rapide, plus facile à lire et dans une seule fonction.
function custom_rewrite( $wp_rewrite ) {
$feed_rules = array(
'search/(.+)/(.+)' => 'index.php?post_type='.$wp_rewrite->preg_index(1).'&s=' . $wp_rewrite->preg_index(2)
);
$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', 'custom_rewrite' );
Ainsi, example.com/search/post/bannana
recherchera tous les messages de type 'post' pour bannana.
Si vous préférez ne pas "rechercher", mais plutôt afficher un terme, il vous suffit de modifier les variables de la requête dans la règle de réécriture.
Vous pouvez utiliser le plug-in d’analyseur de règles de réécriture monkeyman pour vous aider, en indiquant des URL et en indiquant la règle de réécriture qui la gère, ainsi que la priorité/l’ordre de ces règles.
MAIS
Cependant, vous ne pourrez pas utiliser le balisage HTML élégant pour utiliser ces URL, cela ne fonctionnera pas bien, vous devrez modifier l'emplacement de soumission des formulaires, ce qui peut sembler une idée merveilleuse, dans la pratique, la mise en œuvre Cela signifie que vous aurez besoin d'au moins 1 redirection pour qu'une zone de recherche fonctionne avec ces URL, ce qui n'est pas idéal du tout.
Pour votre problème de recherche d'espèces
Modifiez également l'enregistrement de votre espèce pour qu'elle soit plus spécifique/précise:
$args = array(
'labels' => $labels,
'public' => true,
'publicly_queryable' => true,
'exclude_from_search' => false, // lets not guess what this will be, lets be authorative
'show_ui' => true,
'show_in_menu' => true,
'query_var' => true,
'has_archive' => true,
'capability_type' => 'post',
'has_archive' => true,
'hierarchical' => false,
'menu_position' => 5,
'menu_icon' => $this->plugin_url . 'images/fish20.png',
'supports' => array('author','thumbnail','excerpt','comments','revisions')
);
Mais, alors que cela pourrait résoudre ce problème, je suppose que non. En relisant votre question, je vois qu'il réécrit en/search/term, mais WordPress ne le fait pas par défaut. Je suppose que vous avez un code ailleurs qui réécrit les termes de recherche dans une version plus jolie pour les recherches après publication générales, mais cela interfère, que ce soit en raison de l'ordre dans lequel il est ajouté dans le code ou de quelque chose d'autre.
Étant donné que je ne vois pas l'intégralité de votre base de code et que je ne sais pas trop à quoi ressemble cette modification du code de recherche, je ne peux pas vous aider davantage à vous indiquer ses directions (et à réécrire conditionnellement si post_type n'est pas défini que toujours).
edit: essayez ceci:
function custom_rewrite( $wp_rewrite ) {
$feed_rules = array(
'species/(.+?)(/[0-9]+)?/?$' => 'index.php?post_type=species&species='.$wp_rewrite->preg_index(1).'&page='.$wp_rewrite->preg_index(2)
);
$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', 'custom_rewrite' );
Grâce à Tom, j'ai résolu mon problème ...!
J'ai trouvé cette petite pépite dans mon functions.php
. Ca devait être littéralement il y a un an, je ne me souviens même pas de l'avoir mise!
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();
}
}
Cela causait l'échec de mon/espèce/recherche /. Le remplacer par cela a fait l'affaire:
add_action( 'template_redirect', 'my_rewrite' );
function my_rewrite() {
if ( is_search() and false === strpos( $_SERVER['REQUEST_URI'], '/search/' ) ) {
if ( strpos( $_SERVER['REQUEST_URI'], '/species/' ) )
wp_redirect( get_bloginfo( 'home' ) . '/species/search/' . str_replace( ' ', '+', str_replace( '%20', '+', get_query_var( 's' ) ) ) );
else if ( strpos( $_SERVER['REQUEST_URI'], '/glossary' ) )
wp_redirect( get_bloginfo( 'home' ) . '/glossary/search/' . str_replace( ' ', '+', str_replace( '%20', '+', get_query_var( 's' ) ) ) );
else
wp_redirect( get_bloginfo( 'home' ) . '/search/' . str_replace( ' ', '+', str_replace( '%20', '+', get_query_var( 's' ) ) ) );
exit();
}
}
Ensuite, je devais changer has_archive
en true
sur ma glossary
CPT.
Enfin, j'ai utilisé les règles de réécriture de Tom et quelques connaissances de cet excellent article pour que mes jolies URL fonctionnent:
/* --- rewrite rules for searches...*/
function custom_rewrite( $wp_rewrite ) {
$species = array(
'(species|glossary)/search/(.+?)(/page/([0-9]+))?/?$' => 'index.php?post_type='.$wp_rewrite->preg_index(1).'&s='.$wp_rewrite->preg_index(2).'&paged='.$wp_rewrite->preg_index(4)
);
$wp_rewrite->rules = $species + $wp_rewrite->rules;
}
// refresh/flush permalinks in the dashboard if this is changed in any way
add_filter( 'generate_rewrite_rules', 'custom_rewrite' );
J'ai maintenant de jolies URL de travail sur mes recherches de type d'article personnalisé, ET la pagination: /species/search/term
, /species/search/term/page/2/
et /glossary/search/term
, etc., tout fonctionne correctement.
Merci Tom, le mérite en revient!
Vous devrez travailler sur des permaliens. Je n'ai pas le temps pour le moment mais vous pouvez trouver quelques informations ici: http://shibashake.com/wordpress-theme/wordpress-permalink-add
Voici un code pour vous aider à démarrer, il est basé sur un autre article qui a été supprimé , je ne peux pas garantir que cela fonctionnera.
add_filter('wp_loaded','bfr_add_permastruct');
add_filter('rewrite_rules_array','bfr_add_permalink_rule');
function bfr_add_permastruct(){
add_permastruct('ctp_search', 'search/%post-type%/%postname%');
//Remember to flush_rules() when for the first time
//$wp_rewrite->flush_rules();
}
// Adding a new rule
function bfr_add_permalink_rule($rules)
{
$newrules = array();
$newrules['search/([^/]+)/([^/]+)?$'] = 'index.php?post_type=$matches[1]name=$matches[2]';
return $newrules + $rules;
}