自定义帖子类型固定链接端点


8

我有一个称为“目的地”的自定义帖子类型,并且已将帖子类型的EP掩码设置为默认EP_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();
}

现在,如果我在普通帖子上对此进行测试,它将重定向到我需要它的模板(我为单个模板挂钩提供了模板重定向)

即。somesite.com/test-category/test/activities/

但是对于帖子类型(分层的),它只是从网址中删除了端点,并停留在single-destination.php模板上

即。somesite.com/destination/south-africa/kruger-national-park/activities/

变成

somesite.com/destination/south-africa/kruger-national-park/

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

谢谢

Answers:


25

几件事。首先,您的函数名称必须带有唯一的前缀。WordPress是一个庞大的生态系统,其他人可能已经使用了您能想到的所有通用函数名称。

其次,add_rewrite_endpoint要为您添加查询变量。因此,您不需要:

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

在每个负载上刷新重写规则不是一个好主意。添加规则后,只需执行一次。就像在插件激活上一样。因此,您add_endpoints可以将函数缩写为此函数(在上面的每一点上使用更好的函数名)。

<?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);
}

但这仍然无法如您所愿。端点将其查询变量设置为等于其后的值。因此,如果您的网址是...

yoursite.com/some-country/some-city/activities/asdf

查询变量活动将为asdf。如果没有任何反应activities,则您的查询var将为空(但已设置),因此当您尝试捕获它时,它将始终评估为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;
}

您应该看一下我编写的Rewrite API指南。但是,上面总结了您问题的相关部分。


1
感谢您的好评!我已经根据您的帖子和指南进行了修改。但是,似乎WordPress在加载URL后正在重定向/删除端点和所有变量。林不知道它是否规范重定向或什么。但是它只会删除已注册的端点。如果在URL的末尾添加arb,则会得到404。但是游览或活动将被删除或重定向到单个目标URL。:(
查尔·普雷托里乌斯

1
看来我找到了问题。与永久链接设置有关。我有一个自定义设置-/%category%/%postname%/。但是,如果我将其设置为/%postname%/,那么它尚可,但不确定为什么,但是请看一下。感谢\ 0 /
查尔·普雷托里乌斯

1
您应该立即尝试将其切换回/%category%/%postname%/,然后它可能会再次起作用。我怀疑WP剥离您的内容的原因是因为您需要刷新重写规则。(也许)
chrisguitarguy 2012年

1
我也有一个自定义的永久链接设置。我只是转到“永久链接设置”,然后单击“保存更改”而不进行任何更改,然后端点正常工作。
yitwail 2013年

这对我有很大帮助!非常感谢兄弟姐妹!
fdrv
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.