有几件事。首先,函数名的前缀必须是唯一的。WordPress是一个巨大的生态系统,其他人可能已经使用了你能想到的所有通用函数名。
第二add_rewrite_endpoint
负责为您添加查询变量。所以你不需要这个:
add_filter( \'query_vars\', \'add_query_vars\');
function add_query_vars($vars){
$vars[] = "tours";
$vars[] = "activities";
return $vars;
}
在每次加载时刷新重写规则不是一个好主意。这只需要在添加规则后执行一次。就像插件激活一样。所以你
add_endpoints
函数可以对此进行短路(根据上面的第1点使用更好的函数名称)。
<?php
add_action(\'init\', \'wpse42279_add_endpoints\');
function wpse42279_add_endpoints()
{
add_rewrite_endpoint(\'tours\', EP_PERMALINK);
add_rewrite_endpoint(\'activities\', EP_PERMALINK);
}
这对帖子很有用。如果您希望它在页面或任何其他层次结构的帖子类型上工作,则必须使用
EP_PAGES
端点掩码。
<?php
add_action(\'init\', \'wpse42279_add_endpoints\');
function wpse42279_add_endpoints()
{
add_rewrite_endpoint(\'tours\', EP_PAGES);
add_rewrite_endpoint(\'activities\', EP_PAGES);
}
但这对你来说还是不太管用。端点将其查询变量设置为其后的任何变量。所以如果你的URL是。。。
yoursite.com/some-country/some-city/activities/asdf
查询变量活动将是asdf。如果什么都没有发生
activities
, 您的查询变量将为空(但已设置),因此当您尝试捕获它时,它将始终计算为false。。。
<?php
add_action( \'template_redirect\', \'wpse42279_catch_vars\' );
function wpse42279_catch_vars()
{
if( get_query_var( \'tours\' ) )
{
// do stuff!
exit();
}
}
你可以通过过滤来解决这个问题
request
如果设置了旅行和活动变量,则将其值更改为true。
<?php
add_filter( \'request\', \'wpse42279_filter_request\' );
function wpse42279_filter_request( $vars )
{
if( isset( $vars[\'tours\'] ) ) $vars[\'tours\'] = true;
if( isset( $vars[\'activities\'] ) ) $vars[\'activities\'] = true;
return $vars;
}
你应该看看这个
guide to the Rewrite API 我写道。然而,上面总结了您问题的相关部分。