Permalink graziosi per risultati di ricerca con query extra var


10

Mi piacerebbe sapere come posso riscrivere un URL di ricerca che contiene anche una var di query extra in un bel permalink usando wp_redirecte l' template_redirecthook.

Ho preso il codice dal plug-in Nice Search che funziona bene per trasformarlo http://example.com?s=africain 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();
        }

    }

Ma sto usando un menu a discesa selezionato in combinazione con il plug-in Relevanssi per consentire ai visitatori di restringere la ricerca a un determinato tipo di post. Questo aggiunge una post_typequery var, ad es http://example.com?s=africa&post_type=features. Vorrei che questo avesse un URL simile http://example.com/search/africa/section/features.

Il codice Nice Search causa la perdita della query post_type var. Quindi ho provato il seguente codice:

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

}

ma WordPress ora pensa che il termine di ricerca sia africa/section/features.

C'è un modo per mantenere il termine di ricerca e la query var in un bel permalink?

Grazie Simone

Risposte:


7

Per modificare le regole di riscrittura della ricerca puoi agganciarti al search_rewrite_rulesfiltro. Puoi aggiungere tu stesso le regole di riscrittura aggiuntive che corrispondono ai tipi di post oppure puoi modificare la "struttura di riscrittura della ricerca" predefinita per includere anche il tipo di post e quindi rigenerare le regole (ci sono quattro regole: una standard, una con paginazione e due per i feed). Perché WP_Rewrite::generate_rewrite_rules() genera regole ad ogni "livello di directory" , si otterrà regole per /search/[keyword]/section/[post_type]/, /search/[keyword]/section/e /search/[keyword]/. Non hai bisogno della regola di mezzo, ma non ti farà male tenerlo dentro.

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

Per controllare le regole, usa il mio plug-in analizzatore Rewrite .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.