web-dev-qa-db-fra.com

Jolis liens permanents pour les résultats de recherche avec une requête supplémentaire

J'aimerais savoir comment je peux réécrire une URL de recherche qui contient également une requête supplémentaire var en un lien permanent permanent à l'aide de wp_redirect et du crochet template_redirect.

J'ai pris le code de Nice Search plugin qui fonctionne très bien pour changer http://example.com?s=africa en 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 un menu déroulant de sélection en combinaison avec le plug-in Relevanssi pour permettre aux visiteurs de limiter la recherche à un type de message particulier. Ceci ajoute une variable de requête post_type, par exemple. http://example.com?s=africa&post_type=features. Je voudrais que cette URL ait quelque chose comme 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 dans un permalien niçois?

Merci simon

10
Simon Blackbourn

Pour modifier les règles de réécriture de la recherche, vous pouvez intégrer le filtre search_rewrite_rules. Vous pouvez soit ajouter vous-même les règles de réécriture supplémentaires correspondant aux types de publication, soit modifier la "structure de réécriture de la recherche" par défaut afin d'inclure également le type de publication, puis générer de nouveau les règles (il existe quatre règles: une standard, une avec pagination et deux pour les aliments). Étant donné 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 Rewrite .

7
Jan Fabry