Permalinks bastante para resultados de pesquisa com consulta extra var

10

Gostaria de saber como posso reescrever um URL de pesquisa que também contenha uma consulta extra var em um link permanente usando wp_redirecte o template_redirectgancho.

Peguei o código do plugin Nice Search, que funciona bem para mudar http://example.com?s=africapara 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();
        }

    }

Mas estou usando um menu suspenso de seleção em combinação com o plug-in Relevanssi para permitir que os visitantes limitem a pesquisa a um tipo de postagem específico. Isso adiciona uma post_typeconsulta var, por exemplo http://example.com?s=africa&post_type=features. Eu gostaria que isso tivesse uma URL parecida http://example.com/search/africa/section/features.

O código Nice Search faz com que a consulta post_type var seja perdida. Então, eu tentei o seguinte código:

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

}

mas o WordPress agora acha que o termo de pesquisa é africa/section/features.

Existe uma maneira de manter o termo de pesquisa e a consulta var todos em um bom link permanente?

Obrigado Simon

Simon Blackbourn
fonte

Respostas:

7

Para modificar as regras de reescrita da pesquisa, você pode conectar-se ao search_rewrite_rulesfiltro. Você pode adicionar as regras de reescrita extras que correspondem aos tipos de postagem ou alterar a "estrutura de reescrita de pesquisa" padrão para incluir também o tipo de postagem e gerar novamente as regras (há quatro regras: uma padrão, uma com paginação e dois para feeds). Como WP_Rewrite::generate_rewrite_rules() gera regras em todos os "níveis de diretório" , você obterá regras para /search/[keyword]/section/[post_type]/, /search/[keyword]/section/e /search/[keyword]/. Você não precisa da regra do meio, mas não será demais mantê-la.

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

Para verificar as regras, use meu plug-in Rewrite Analyzer .

Jan Fabry
fonte