wake-up-neo.net

WordPress-Suche: hübsche URLs (Permalinks), benutzerdefinierte Post-Typen und Paginierung

Ich habe drei separate Suchfelder auf meiner Website: species CPT-Suche, glossary CPT-Suche und eine allgemeine Suche, nach der ich post- und species-Beitragstypen suchen möchte.

Meine Fragen sind dreifach,

  1. Was ist der effizienteste/effektivste Code, um hübsche Such-URLs zu erstellen, und gibt es einen Grund, warum WordPress diese standardmäßig nicht aktiviert?
  2. Unter Berücksichtigung von Nummer 1, welchen Code muss ich in searchform-species, searchform-glossary, search und searchresults verwenden, um anzugeben, dass meine Artensuche nur Artenergebnisse zurückgibt, Glossar Glossarergebnisse usw.
  3. Wie binde ich die Paginierung ein?

Der Code, den ich derzeit versuche, lautet wie folgt:

CODE FÜR # 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 FÜR # 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-species.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'); ?>

Was derzeit passiert, ist dies:

Die einzelnen Suchvorgänge funktionieren, die Paginierung jedoch nicht. Wenn ich auf die Schaltfläche next/previous_posts_link klicke, wird der URL /page/2/ hinzugefügt, und es werden keine Aktionen ausgeführt. Wenn ich versuche, die get_query_var('page') auszugeben, wird NULL zurückgegeben. Wenn ich versuche, stattdessen 'paged' auszugeben, wird 0 zurückgegeben.

Wenn ein Benutzer auf diesen Link klickt, wird die Variable $search_query aus searchform.php als page/bettas angezeigt (wobei bettas die ursprüngliche Abfrage ist).


Idealerweise würde ich gerne Folgendes passieren:

  1. Bei der "allgemeinen Suche" gibt ein Benutzerbettaein. Die URL ändert sich in /search/betta, in dem alle post- oder species-Inhalte aufgeführt sind, die das Wortbettaenthalten.
  2. Bei der "Artensuche" gibt ein Benutzerbettaein. Die URL ändert sich in /search/betta/species (oder was auch immer für SEO am besten ist) und zeigt eine Liste mit nur species Inhalten an, die das Wortbettaenthalten.
  3. Derselbe Benutzer wie # 2 klickt dann auf die Schaltfläche Weiter (previous_posts_link). Die URL ändert sich in /search/betta/species/page/2 und der Benutzer sieht die nächsten 25 aufgeführten Arten.

Ich bin ein absoluter Neuling bei WP Umschreiben und Paginieren, daher wäre jede Unterstützung sehr dankbar.

4
dunc

Die Paginierung kann genauso erfolgen wie überall in der Sucharchivvorlage.

Sie brauchen auch keine benutzerdefinierte Abfrage und Typvariable in search.php. Um nach einem bestimmten benutzerdefinierten Beitrag zu suchen, können Sie entweder die Abfrage ändern oder zum Archiv dieses Beitrags gehen und die Suchabfrage anhängen, z.

example.com/event_post_type/?s=term

Dasselbe gilt für alle Kategorien- oder Taxonomie-Archive. Wenn Sie einfach? S = searchterm am Ende hinzufügen, wird dies zu einer Suchanfrage, genau wie wenn Sie/feed/am Ende der URL hinzufügen, erhalten Sie einen RSS2-Feed für diese bestimmte Seite. Inhalt archivieren.

Sie haben die Aufgabe, dies zu verschönern, indem Sie eine zusätzliche Umschreiberegel hinzufügen, um dies in etwas Schöneres umzuwandeln, z.

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' );

Würde es Ihnen ermöglichen, example.com/search/searchterm/events zu tun, obwohl ich/events/search/searchterm als bessere Möglichkeit rate.

Testen Sie Ihre Änderungen mit dem monkeyman Rewrite Rules Analyzer-Plugin. Weitere Informationen zu Rewrite Rules finden Sie in der folgenden Antwort: Hübsche URL mit add_query_var

2
Tom J Nowell