我通过跟踪wordpress代码找到了答案,这并不容易,这段代码真的是一团糟,但见鬼,我成功了。。。
解决方案分为三个不同部分:
注册自定义帖子类型/自定义永久链接结构生成自定义规则/覆盖现有规则覆盖重定向规范筛选器,以防止在具有可选部分的自定义永久链接结构时重定向
Portion #1, custom post type/permalink registration
使用register\\u post\\u type()注册自定义帖子类型,或使用add\\u permalink()添加简单的permalink,在我的例子中,我使用自定义帖子类型将我的webservice端点存储为页面,并使用特殊的重写规则重定向那里的流量:
add_action(\'init\', \'register_cpt_jsonwebservice\');
function register_cpt_jsonwebservice() {
register_post_type( \'json\', $args ); //See the definition of $args in the codex
}
Portion #2, Generate the special rewrite rules to redirect complex traffic to my pages handled by my custom post type
使用add\\u rewrite\\u标记,我们可以创建将由请求解析器读取的jsonid rewrite标记,然后重新配置permastruct以支持额外的%jsonid%,这完全不是正统的,可能有更好的方法可以做到这一点。魔术以我添加到重写器的一个特殊规则结束,该规则允许我使用url“/数据///”调用页面,并将流量重定向到json自定义类型automaticaly。
add_action(\'generate_rewrite_rules\', \'register_crr_jsonwebservice\');
function register_crr_jsonwebservice($wp_rewrite) {
//Add the jsonid tag
add_rewrite_tag(\'%jsonid%\', \'([0-9a-zA-Z\\-]+)\', \'jsonid=\');
//Reconfigure the json permastruct to add the json id, cannot be done normaly i think, i need to investigate register_post_type function
$wp_rewrite->extra_permastructs[\'json\'][\'struct\'] = \'/json/%json%/%jsonid%/\';
//Add the special data rules at the top
add_rewrite_rule(\'data/([^/]+)(/([a-zA-Z0-9\\-]*))?$\', \'index.php?post_type=json&name=$matches[1]&jsonid=$matches[3]\', \'top\');
}
Portion #3, prevent nasty canonical redirections
Wordpress将始终尝试将用户重定向到映射到请求的页面url。因此,如果为自定义post类型配置了/data/trips/与/json/trips/不对应,它将强制重定向到正确的位置,显然会使我们的团队崩溃,因为ReST要求我们在发布、放置或删除时不要重定向。
为此,如果您过滤掉“redirect\\u canonical”,您可以拦截在自定义帖子类型上重定向的请求,从而防止这些讨厌的重定向破坏ReST接口:
add_filter(\'redirect_canonical\', array($this, \'register_crr_jsonwebservice_redirect_canonical\'));
function register_crr_jsonwebservice_redirect_canonical($redirect_url)
{
if(strpos($redirect_url, \'%jsonid%\') !== false)
{
return \'\';
}
return $redirect_url;
}
这就是所有的人。。。