Jolis permaliens pour les résultats de recherche avec une requête supplémentaire var

10

Je voudrais savoir comment je peux réécrire une URL de recherche qui contient également une var de requête supplémentaire dans un joli permalien utilisant wp_redirectet le template_redirectcrochet.

J'ai pris le code du plugin Nice Search qui fonctionne très bien pour se changer http://example.com?s=africaen 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();
        }

    }

Mais j'utilise une liste déroulante sélectionnée en combinaison avec le plugin Relevanssi pour permettre aux visiteurs de restreindre la recherche à un type de message particulier. Cela ajoute une post_typerequête var, par exemple http://example.com?s=africa&post_type=features. Je voudrais que ceci ait quelque chose comme une URL http://example.com/search/africa/section/features.

Le code Nice Search provoque la perte de la requête post_type var. J'ai donc essayé le code suivant:

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

}

mais WordPress pense maintenant que le terme de recherche est africa/section/features.

Existe-t-il un moyen de conserver le terme de recherche et la requête var dans un joli permalien?

Merci Simon

Simon Blackbourn
la source

Réponses:

7

Pour modifier les règles de réécriture de la recherche, vous pouvez vous connecter au search_rewrite_rulesfiltre. Vous pouvez soit ajouter vous-même les règles de réécriture supplémentaires qui correspondent aux types de publication, soit modifier la "structure de réécriture de recherche" par défaut pour inclure également le type de publication, puis recréer les règles (il existe quatre règles: une standard, une avec la pagination). et deux pour les flux). Parce que WP_Rewrite::generate_rewrite_rules() génère des règles à chaque "niveau de répertoire" , vous obtiendrez des règles pour /search/[keyword]/section/[post_type]/, /search/[keyword]/section/et /search/[keyword]/. Vous n'avez pas besoin de la règle du milieu, mais cela ne fera pas de mal de la garder.

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

Pour vérifier les règles, utilisez mon plugin d'analyseur de réécriture .

Jan Fabry
la source