Bastante permalinks 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 em um permalink bonito usando wp_redirect e o template_redirect hook.

Eu peguei o código do plug-in Nice Search , que funciona bem para alterar http://example.com?s=africa em 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 uma lista suspensa de seleção em combinação com o plug-in Relevanssi para permitir que os visitantes reduzam a pesquisa para um determinado tipo de postagem. Isso adiciona um post_type query var, por exemplo %código%. Eu gostaria que isso tivesse um URL como http://example.com?s=africa&post_type=features .

O código Nice Search faz com que a var de post_type 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 é http://example.com/search/africa/section/features .

Existe uma maneira de manter o termo de pesquisa e a consulta var tudo em um bom permalink?

Obrigado Simon

    
por Simon Blackbourn 23.04.2011 / 00:17

1 resposta

7

Para modificar as regras de reconfiguração de pesquisa, você pode conectar-se ao filtro search_rewrite_rules . Você pode adicionar as regras de regravação adicionais que correspondem aos tipos de postagens ou alterar a "estrutura de regravação de pesquisa" padrão para incluir também o tipo de postagem e gerar novamente as regras (há quatro regras: um padrão, um com paginação e dois para feeds). Porque WP_Rewrite::generate_rewrite_rules() gera regras em todos os "níveis de diretório" , você receberá regras para /search/[keyword]/section/[post_type]/ , /search/[keyword]/section/ e /search/[keyword]/ . Você não precisa da regra do meio, mas não vai doer mantê-lo.

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 o meu plug-in do analisador de reconfiguração .

    
por Jan Fabry 04.06.2011 / 14:10