我有一个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\'s
answer 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;
});
最合适的回答,由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将自己完成所有事情,而不需要自定义代码。