问题描述
我想知道如何使用 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 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。