Enlaces permanentes para resultados de búsqueda con var de consulta adicional

10

Me gustaría saber cómo puedo reescribir una URL de búsqueda que también contiene una consulta extra var en un enlace permanente wp_redirecty el template_redirectgancho.

Tomé el código del complemento Nice Search que funciona bien para cambiarlo http://example.com?s=africaa 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 a los visitantes limitar la búsqueda a un tipo de publicación en particular. Esto agrega una post_typeconsulta var, por ejemplo http://example.com?s=africa&post_type=features. Me gustaría que esto tenga una URL similar http://example.com/search/africa/section/features.

El código Nice Search hace que se pierda la consulta post_type var. 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 africa/section/features.

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

Gracias simon

Simon Blackbourn
fuente

Respuestas:

7

Para modificar las reglas de reescritura de búsqueda, puede enganchar en el search_rewrite_rulesfiltro. Puede agregar las reglas de reescritura adicionales que coinciden con los tipos de publicación usted mismo, 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 alimentos). Debido a que WP_Rewrite::generate_rewrite_rules() genera reglas en cada "nivel de directorio" , obtendrá reglas para /search/[keyword]/section/[post_type]/, /search/[keyword]/section/y /search/[keyword]/. No necesitas la regla del medio, pero no te 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 plugin Rewrite analyzer .

Jan Fabry
fuente