自定义永久链接以使页面正确响应

时间:2013-01-28 作者:Mathieu Dumoulin

我构建了一个完整的MVC框架,它与Wordpress完美集成。该框架还提供了ReST接口的简单到中间的实现(真正的ReST接口具有超媒体格式以及答案和页面之间的链接,而不仅仅是GET/POST/PUT/DELETE部分)

我创建了一个自定义的帖子类型,创建后会自动绑定到我的框架,所有访问REST界面的url都可以正常工作,直到我必须摆脱传统的基于页面的url。

例如:

GET http://mysite.com/json/order/2/
这一点很好,因为%page%变量将2放入其中,因为它符合wordpress使用的常规永久链接结构。当我希望以下url响应时,它开始变得复杂:

GET http://mysite.com/json/ticket/32jrfks923841j3k/
这一次,32jrfks923841j3k不是一个数字,因此不会触发带有%page%变量的永久链接。我的目标并没有那么复杂,我只是不知道如何让它工作,但我希望我的页面(最好是json自定义帖子类型)允许第二个url工作。我不在乎这些数据去哪里,因为我有自己的自定义工具来读取框架中的URL,我会自己提取它。。。

我不被重定向是非常重要的,因此mod\\u rewrite或rewrite api可能无法使用,这是因为ReST在默认情况下使用该方法来检测要做什么,如果有人发布到url,它必须保持这样并做出响应,而不是被重定向,否则帖子就会丢失。。。

谢谢

1 个回复
SO网友:Mathieu Dumoulin

我通过跟踪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;
}
这就是所有的人。。。

结束

相关推荐

widgetlogic and permalinks

我试图使用widgetlogic在某些页面上有条件地显示菜单。每个菜单都使用如下标记is_page(array(\"Page Name\", \"Page Name 2\" ...)), 在我尝试更改permalinks之前,它一直工作得很好(因此所有菜单都会从各自的页面中消失)。我做错什么了吗?是否有解决方法?