我想知道如何使用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
查询变量,例如。
http://example.com?s=africa&post_type=features
. 我想这有一个URL类似
http://example.com/search/africa/section/features
.
Nice搜索代码导致post\\u类型查询变量丢失。因此,我尝试了以下代码:
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
.
有没有办法让搜索词和查询变量都保持在一个好的永久链接中?
ThanksSimon公司
最合适的回答,由SO网友:Jan Fabry 整理而成
要修改搜索重写规则,可以挂接到search_rewrite_rules
滤器您可以自己添加与帖子类型匹配的额外重写规则,也可以更改默认的“搜索重写结构”,使其也包括帖子类型,然后重新生成规则(有四个规则:一个是标准规则,一个是分页规则,两个是提要规则)。因为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.