it-swarm.com.de

Hübsche Permalinks für Suchergebnisse mit zusätzlichen Abfragevariablen

Ich möchte wissen, wie ich eine Such-URL, die auch eine zusätzliche Abfragevariable enthält, mit wp_redirect und dem template_redirect-Hook in einen hübschen Permalink umschreiben kann.

Ich habe den Code aus dem Nice Search Plugin genommen, der gut funktioniert, um http://example.com?s=africa in http://example.com/search/africa zu ändern:

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 Auswahlfeld in Kombination mit dem Relevanssi - Plugin, damit Besucher die Suche auf einen bestimmten Beitragstyp eingrenzen können. Dies fügt eine post_type Abfragevariable hinzu, z. http://example.com?s=africa&post_type=features. Ich hätte gerne eine URL wie http://example.com/search/africa/section/features.

Der Nice Search-Code führt dazu, dass die Abfragevariable post_type verloren geht. Also habe ich den 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 africa/section/features ist.

Gibt es eine Möglichkeit, den Suchbegriff und die Abfrage var alle in einem Nizza-Permalink zu behalten?

Danke Simon

10

Um die Umschreiberegeln für die Suche zu ändern, können Sie den search_rewrite_rules-Filter verwenden. Sie können entweder die zusätzlichen Umschreiberegeln, die den Beitragstypen entsprechen, selbst hinzufügen oder die Standard-Umschreibestruktur für die Suche ändern, um auch den Beitragstyp einzuschließen, und dann die Regeln neu generieren (es gibt vier Regeln: eine Standardregel und eine Regel mit Paging) und zwei für Feeds). Da WP_Rewrite::generate_rewrite_rules()Regeln auf jeder "Verzeichnisebene" generiert, erhalten Sie Regeln 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 zum Überprüfen der Regeln my Rewrite analyzer plugin .

7
Jan Fabry