web-dev-qa-db-fra.com

Recherche WordPress: jolies URL (permaliens), types de publication personnalisés et pagination

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,

  1. Quel est le code le plus efficace pour créer de jolies URL de recherche, et y a-t-il une raison pour laquelle WordPress ne les active pas par défaut?
  2. En gardant à l’esprit n ° 1, quel code dois-je utiliser dans 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.
  3. Comment incorporer la pagination?

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:

  1. Dans la "recherche générale", un utilisateur entre betta . L'URL devient /search/betta, qui répertorie tout contenu post ou species contenant le mot betta .
  2. Dans la "recherche d'espèce", un utilisateur entre betta . L'URL devient /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 .
  3. Le même utilisateur que # 2 clique ensuite sur le bouton Suivant (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.

4
dunc

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

2
Tom J Nowell