Ładne bezpośrednie linki do wyników wyszukiwania z dodatkowym zapytaniem var

10

Chciałbym wiedzieć, w jaki sposób mogę przepisać wyszukiwany adres URL, który zawiera również dodatkową zmienną zapytania, w całkiem bezpośredni odnośnik wp_redirecti template_redirectzaczep.

Wziąłem kod z wtyczki Nice Search, która działa dobrze, aby zmienić http://example.com?s=africana 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();
        }

    }

Ale używam rozwijanego menu w połączeniu z wtyczką Relevanssi, aby umożliwić odwiedzającym zawęzić wyszukiwanie do określonego typu postów. To dodaje post_typezapytanie var, np http://example.com?s=africa&post_type=features. Chciałbym, aby ten adres URL był podobny http://example.com/search/africa/section/features.

Kod Nice Search powoduje utratę zmiennej typu post_type. Więc wypróbowałem następujący kod:

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

}

ale WordPress uważa teraz, że to wyszukiwane hasło africa/section/features.

Czy istnieje sposób, aby zachować wyszukiwane hasło i zapytanie var wszystko w ładnym permalink?

Dzięki Simon

Simon Blackbourn
źródło

Odpowiedzi:

7

Aby zmodyfikować reguły przepisywania wyszukiwania, możesz podłączyć się do search_rewrite_rulesfiltra. Możesz albo dodać dodatkowe reguły przepisywania, które pasują do typów postów, albo możesz zmienić domyślną „strukturę przepisywania wyszukiwania”, aby uwzględnić również typ postu, a następnie ponownie wygenerować reguły (istnieją cztery reguły: jedna standardowa, jedna ze stronicowaniem i dwa dla kanałów). Ponieważ WP_Rewrite::generate_rewrite_rules() generuje reguły na każdym poziomie „Katalog” , otrzymasz zasady /search/[keyword]/section/[post_type]/, /search/[keyword]/section/i /search/[keyword]/. Nie potrzebujesz środkowej reguły, ale jej utrzymanie nie zaszkodzi.

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

Aby sprawdzić reguły, użyj mojej wtyczki analizatora Rewrite .

Jan Fabry
źródło