web-dev-qa-db-fra.com

Types de messages personnalisés: jolies URL de recherche et has_archive

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?

1
dunc

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' );
2
Tom J Nowell

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!

1
dunc

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;
}
1
bfred.it