自定义POST类型固定链接终结点

时间:2012-02-14 作者:Charl Pretorius

我有一个名为“destinations”的自定义帖子类型,并已将帖子类型的EP掩码设置为默认EP\\U PERMALINK。我添加了几个端点,如下所示:

add_filter( \'query_vars\', \'add_query_vars\');

function add_query_vars($vars){
    $vars[] = "tours";
    $vars[] = "activities";
    return $vars;
}

add_action(\'init\', \'add_endpoints\');

function add_endpoints(){
    global $wp_rewrite; 

    add_rewrite_endpoint(\'tours\', EP_PERMALINK);
    add_rewrite_endpoint(\'activities\', EP_PERMALINK);

    $wp_rewrite->flush_rules();
}
现在,如果我在一篇普通的帖子上测试它,它会重定向到我需要的模板(我有一个针对单个模板挂钩的模板重定向)

例如,某处。com/测试类别/测试/活动/

但是对于post类型(层次结构),它只是从url中删除端点,并停留在单个目标上。php模板

例如,某处。com/目的地/南非/克鲁格国家公园/活动/

成为

某处。com/目的地/南非/克鲁格国家公园/

任何帮助或指导都将不胜感激。我已经为此挣扎了几个小时,但没有结果:(

谢谢

1 个回复
最合适的回答,由SO网友:chrisguitarguy 整理而成

有几件事。首先,函数名的前缀必须是唯一的。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 我写道。然而,上面总结了您问题的相关部分。

结束

相关推荐

Permalinks for quote authors

What I have:引用的网站,格式为:“引用文本”-引用作者参见quotup.com 对于我的考试网站(我为考试中的亵渎行为提前道歉)。What I\'m after:单击“-Quote Author”将启动一个包含该Quote Author所有引用的页面,URL为:示例。史蒂夫·史蒂文森,其中史蒂夫·史蒂文森是引文作者。What I\'ve done:创建了一个名为wp\\u qauthor的自定义表,该表通过post\\u meta(qauthor\\u id)绑定到wp\\u posts向函数