Довольно постоянные ссылки для результатов поиска с дополнительным запросом var

10

Я хотел бы знать, как я могу переписать поисковый URL, который также содержит дополнительную переменную запроса в довольно постоянное использование ссылки wp_redirectи template_redirectловушку.

Я взял код из плагина Nice Search, который отлично работает, чтобы перейти http://example.com?s=africaна 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();
        }

    }

Но я использую выпадающий список в сочетании с плагином Relevanssi, чтобы позволить посетителям сузить поиск до определенного типа поста. Это добавляет post_typeзапрос var, например http://example.com?s=africa&post_type=features. Я хотел бы, чтобы это было что-то вроде URL http://example.com/search/africa/section/features.

Код Nice Search приводит к потере var запроса post_type. Поэтому я попробовал следующий код:

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

}

но WordPress теперь думает, что поисковый термин africa/section/features.

Есть ли способ, которым я могу держать поисковый запрос и запрос var в хорошей постоянной ссылке?

Спасибо Саймон

Саймон Блэкборн
источник

Ответы:

7

Чтобы изменить правила перезаписи поиска, вы можете подключиться к search_rewrite_rulesфильтру. Вы можете либо добавить дополнительные правила перезаписи, соответствующие типам постов, либо изменить стандартную «структуру перезаписи поиска», включив в нее тип поста, а затем заново сгенерировать правила (существует четыре правила: одно стандартное, одно с подкачкой страниц). и два для кормов). Поскольку WP_Rewrite::generate_rewrite_rules() генерирует правила на каждом «уровне каталогов» , вы получите правила /search/[keyword]/section/[post_type]/, /search/[keyword]/section/и /search/[keyword]/. Вам не нужно среднее правило, но удержать его не повредит.

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

Чтобы проверить правила, используйте мой плагин анализатора Rewrite .

Ян Фабри
источник