Permalinks bonitos para resultados de búsqueda con var extra de consulta

10

Me gustaría saber cómo puedo reescribir una URL de búsqueda que también contenga una var de consulta adicional en un enlace permanente con wp_redirect y el gancho template_redirect .

Tomé el código del complemento Nice Search que funciona bien para cambiar http://example.com?s=africa a 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();
        }

    }

Pero estoy usando un menú desplegable de selección en combinación con el complemento Relevanssi para permitir que los visitantes limiten la búsqueda para un tipo de mensaje particular. Esto agrega una var. post_type query, por ejemplo, %código%. Me gustaría que esto tuviera una URL como http://example.com?s=africa&post_type=features .

El código de Nice Search hace que se pierda la variable de consulta post_tipo. Así que probé el siguiente 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();
    }

}

pero WordPress ahora piensa que el término de búsqueda es http://example.com/search/africa/section/features .

¿Hay alguna forma de mantener el término de búsqueda y la consulta var en un buen enlace permanente?

Gracias Simon

    
pregunta Simon Blackbourn 23.04.2011 - 00:17

1 respuesta

7

Para modificar las reglas de reescritura de búsqueda, puede enlazar al filtro search_rewrite_rules . Puede agregar las reglas de reescritura adicionales que coincidan con los tipos de publicación, o puede cambiar la "estructura de reescritura de búsqueda" predeterminada para incluir también el tipo de publicación y luego volver a generar las reglas (hay cuatro reglas: una estándar, una con paginación) y dos para feeds). Porque WP_Rewrite::generate_rewrite_rules() genera reglas en cada "nivel de directorio" , obtendrás reglas para /search/[keyword]/section/[post_type]/ , /search/[keyword]/section/ y /search/[keyword]/ . No necesita la regla del medio, pero no le hará daño mantenerla.

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 las reglas, use mi complemento del analizador Rewrite .

    
respondido por el Jan Fabry 04.06.2011 - 14:10

Lea otras preguntas en las etiquetas