从固定链接中删除父类别,但保留子类别

时间:2019-06-26 作者:Dennis

我有一个url结构如下的网站

实例com/news/story-1示例。com/news/local/story-2示例。com/food/tacos/story-3

现在它已经移动到一个多站点,站点的子文件夹是/news/和/food/。

在这些子网站中,顶级类别分别是新闻或食品。因此,如果permalink设置为/%category%/%postname%/, permalink显示为

实例com/news/news/local/story title示例。com/food/food/tacos/story title

为了删除与站点子文件夹重复的类别,我将其添加到函数中。php:

add_filter( \'post_link\', \'remove_parent_category\', 10, 3 );
    function remove_parent_category( $permalink, $post, $leavename ) {
        $permalink_array = explode("/", $permalink);
        $clean_permalink = array_unique($permalink_array);
        $new_permalink = implode("/", $clean_permalink);
        return $new_permalink;
    }  
这管用,还给我

实例com/news/local/story-2示例。com/food/tacos/story-3

以及导航到

实例com/news/
示例。com/news/local等。

然而,顶级类别的帖子现在是404(我想这是意料之中的),因为它们的url现在是

实例com/news/story-1

(这就是我想要的)。

从我收集的信息来看,我认为我需要使用pre\\u post\\u链接或重写规则来处理那些顶级帖子,就像我的永久链接结构%postname%/, 但这就是我被困的地方。

更新:解决了(我想是吧?)

T.Todua\'sanswer below 让我开始:

子类别中的帖子工作,类别和子类别档案工作,页面工作,但最后一个类别被剥离的帖子(最顶层的帖子)仍然是404。

在反复尝试WP重写并发现我认为能够解决这个问题的方法行不通之后,它确实将我引向了另一条道路。

事实证明,这些没有类别的“裸体”帖子在WP Rewrite中达到了类别规则,因此查询结果是category_name = this-is-the-slug-for-a-post. 在WP重写中没有办法(至少我能弄明白)防止这种情况,因为没有办法区分使用RegEx的类别slug和后期slug。

(虽然我想知道如何,如果你的permalink结构%postname%/, Wordpress区分页面和帖子。如果有人知道,我很感兴趣。)

从那里我找到了this post 并根据我的需要进行了修改。它捕获类别请求并检查是否存在具有该名称的真实类别。如果不是,则将其转换为post查询。

整体情况如下:如果您发现这种方法有任何重大危险信号或问题,请告诉我。

add_filter(\'post_link\',\'remove_parent_category\', 10, 3 );
add_filter(\'post_type_link\',\'remove_parent_category\', 10, 3 ); 
add_filter(\'category_link\',\'remove_parent_category\', 10, 2);

function remove_parent_category($termlink, $term_id )
{
    return implode("/", array_unique(explode("/", $termlink)));
}

add_filter(\'request\', function(array $query_vars) {
    // do nothing in wp-admin
    if(is_admin()) {
        return $query_vars;
    }
    // if the query is for a category
    if(isset($query_vars[\'category_name\'])) {
        $query_cat = $query_vars[\'category_name\'];
        // if it\'s a real category do nothing
        if(term_exists($query_cat, "category")) {
            return $query_vars;
        };
        // save the slug
        $postname = $query_vars[\'category_name\'];
        // completely replace the query with a post query
        $query_vars = array(\'name\' => "$postname");
    }
    return $query_vars;
});

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

我认为,有两件事需要解决:

1) 您需要post(和其他post类型)也遵循该命令,因此请同时使用这两种命令:

add_filter( \'post_link\',      \'remove_parent_category\', 10, 3 );
add_filter( \'post_type_link\', \'remove_parent_category\', 10, 3 ); 
2)但类别也需要更改url,因此请使用:

add_filter( \'category_link\', \'remove_parent_category_2\', 10, 2);
function remove_parent_category_2($termlink, $term_id )
{
    return implode("/", array_unique(explode("/", $termlink)));
}
之后,转到“设置”>“永久链接”>“保存”,看看是否有效。

顺便说一句,我的建议是(在备份数据库之后),只需从类别中删除这些类别(从WP dashboard>categories),WP将自己完成所有事情,而不需要自定义代码。

相关推荐

使用Apply_Filters()的要点

当我试图开发一个插件时,我试图看到其他插件也能完成我的插件将要实现的功能,然后我看到开发人员在大多数功能中使用该功能apply_filters() 我不明白为什么。下面是一个示例:public static function myFunction() { return apply_filters( \'du/class/method\' array( \'index\' => \'value\', \'index\' =&g