Hübsche Permalinks für Suchergebnisse mit zusätzlicher Abfrage var

10

Ich würde gerne wissen, wie ich eine Such-URL, die auch eine zusätzliche Abfragevariable enthält, in einen hübschen Permalink mit wp_redirectund den template_redirectHook umschreiben kann .

Ich habe den Code aus der genommen Nizza Search - Plugin , die feinen Änderungen arbeitet http://example.com?s=africain http://example.com/search/africa:

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();
        }

    }

Ich verwende jedoch ein ausgewähltes Dropdown-Menü in Kombination mit dem Relevanssi- Plugin, damit Besucher die Suche auf einen bestimmten Beitragstyp eingrenzen können . Dies fügt eine post_typeAbfragevariable hinzu , z http://example.com?s=africa&post_type=features. Ich möchte, dass dies eine URL hat http://example.com/search/africa/section/features.

Der Nice Search-Code führt dazu, dass die Abfragevariable post_type verloren geht. Also habe ich folgenden Code ausprobiert:

function my_rewrite() {

    if ( is_search() and false === strpos( $_SERVER['REQUEST_URI'], '/search/' ) ) {
        if ( isset( $_GET['post_type'] ) and '' !== $_GET['post_type'] ) {
            wp_redirect( get_bloginfo( 'home' ) . '/search/' . str_replace( ' ', '+', str_replace( '%20', '+', get_query_var( 's' ) ) ) . '/section/' . str_replace( ' ', '+', str_replace( '%20', '+', get_query_var( 'post_type' ) ) ) );
        } else {
            wp_redirect( get_bloginfo( 'home' ) . '/search/' . str_replace( ' ', '+', str_replace( '%20', '+', get_query_var( 's' ) ) ) );
        }
        exit();
    }

}

aber WordPress denkt jetzt, dass der Suchbegriff ist africa/section/features.

Gibt es eine Möglichkeit, den Suchbegriff und die Abfragevariable in einem schönen Permalink zu speichern?

Danke Simon

Simon Blackbourn
quelle

Antworten:

7

Um die Regeln für das Umschreiben der Suche zu ändern, können Sie sich in den search_rewrite_rulesFilter einbinden. Sie können entweder die zusätzlichen Umschreiberegeln hinzufügen, die den Beitragstypen selbst entsprechen, oder Sie können die Standardstruktur für das Umschreiben der Suche ändern, um auch den Beitragstyp einzuschließen, und dann die Regeln neu generieren (es gibt vier Regeln: einen Standard, einen mit Paging und zwei für Feeds). Da WP_Rewrite::generate_rewrite_rules() Regeln bei jeder „Verzeichnisebene“ erzeugt , werden Sie Regeln erhalten für /search/[keyword]/section/[post_type]/, /search/[keyword]/section/und /search/[keyword]/. Sie brauchen die mittlere Regel nicht, aber es tut nicht weh, sie beizubehalten.

add_filter( 'search_rewrite_rules', 'wpse15418_search_rewrite_rules' );
function wpse15418_search_rewrite_rules( $search_rewrite_rules )
{
    global $wp_rewrite;
    $wp_rewrite->add_rewrite_tag( '%post_type%', '([^/]+)', 'post_type=' );
    $search_structure = $wp_rewrite->get_search_permastruct();
    return $wp_rewrite->generate_rewrite_rules( $search_structure . '/section/%post_type%', EP_SEARCH );
}

Verwenden Sie mein Rewrite Analyzer-Plugin, um die Regeln zu überprüfen .

Jan Fabry
quelle