問題描述
我想知道如何使用 wp_redirect
和 template_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 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。