問題描述

我想知道如何使用 wp_redirecttemplate_redirect 鈎子重寫一個包含一個額外的查詢 var 的搜索 URL 到一個漂亮的永久鏈接。

我已經從 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 。我想這樣有一個像 http://example.com/search/africa/section/features 的 URL 。

尼斯搜索代碼導致 post_type 查詢 var 丟失。所以我嘗試了以下代碼:

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 全部在一個很好的永久鏈接?

謝謝西蒙

最佳解決方案

要修改搜索重寫規則,您可以掛接到 search_rewrite_rules 過濾器。您可以自己添加匹配帖子類型的額外重寫規則,也可以將默認的 「搜索重寫結構」 更改為包含帖子類型,然後是 re-generate 規則 (有四個規則:一個標準,一個是分頁和兩個為飼料) 。因為 WP_Rewrite::generate_rewrite_rules() generates rules at every “directory level”,您將獲得/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 );
}

要檢查規則,請使用 my Rewrite analyzer plugin

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。