在综合了一堆其他答案后,我成功了!因此,这里有一个解决方案,也适用于那些正在与此斗争的人:
This post 和this one 帮了我一些忙,所以要感谢那些家伙。
注意,所有这些代码,加上您最初的自定义帖子类型和分类注册代码,都会进入您的functions.php
文件
首先,在定义自定义帖子类型和分类法时,要正确使用slug:对于自定义帖子类型,应该是basename/%taxonomy_name%
分类法的鼻涕虫应该是basename
. 别忘了还要添加\'hierarchical\' => true
到分类法重写数组,以在url中获取嵌套术语。还要确保query_var
设置为true
在这两种情况下。
您需要添加一个新的重写规则,以便WordPress知道如何解释url结构。在我的例子中,uri的自定义post类型部分将始终是第5个uri段,因此我相应地定义了匹配规则。请注意,如果使用更多或更少的uri段,则可能必须更改此设置。如果您将有不同级别的嵌套术语,那么您需要编写一个函数来检查最后一个uri段是自定义post类型还是分类术语,以了解要添加的规则(如果您需要这方面的帮助,请询问我)。
add_filter(\'rewrite_rules_array\', \'mmp_rewrite_rules\');
function mmp_rewrite_rules($rules) {
$newRules = array();
$newRules[\'basename/(.+)/(.+)/(.+)/(.+)/?$\'] = \'index.php?custom_post_type_name=$matches[4]\'; // my custom structure will always have the post name as the 5th uri segment
$newRules[\'basename/(.+)/?$\'] = \'index.php?taxonomy_name=$matches[1]\';
return array_merge($newRules, $rules);
}
然后您需要添加此代码,以便workpress能够处理
%taxonomy_name%
在自定义post type rewrite slug结构中:
function filter_post_type_link($link, $post)
{
if ($post->post_type != \'custom_post_type_name\')
return $link;
if ($cats = get_the_terms($post->ID, \'taxonomy_name\'))
{
$link = str_replace(\'%taxonomy_name%\', get_taxonomy_parents(array_pop($cats)->term_id, \'taxonomy_name\', false, \'/\', true), $link); // see custom function defined below
}
return $link;
}
add_filter(\'post_type_link\', \'filter_post_type_link\', 10, 2);
我在Wordpress自己的基础上创建了一个自定义函数
get_category_parents
:
// my own function to do what get_category_parents does for other taxonomies
function get_taxonomy_parents($id, $taxonomy, $link = false, $separator = \'/\', $nicename = false, $visited = array()) {
$chain = \'\';
$parent = &get_term($id, $taxonomy);
if (is_wp_error($parent)) {
return $parent;
}
if ($nicename)
$name = $parent -> slug;
else
$name = $parent -> name;
if ($parent -> parent && ($parent -> parent != $parent -> term_id) && !in_array($parent -> parent, $visited)) {
$visited[] = $parent -> parent;
$chain .= get_taxonomy_parents($parent -> parent, $taxonomy, $link, $separator, $nicename, $visited);
}
if ($link) {
// nothing, can\'t get this working :(
} else
$chain .= $name . $separator;
return $chain;
}
然后需要刷新永久链接(只需加载永久链接设置页面)。
现在一切都“应该”了,希望如此!制作一组分类术语并正确嵌套,然后制作一些自定义帖子类型的帖子并正确分类。您还可以使用slug创建页面basename
, 一切都应该按照我在问题中指定的方式进行。您可能希望创建一些自定义分类法归档页来控制它们的外观,并添加一些taxonomy widget 在侧栏中显示嵌套类别的插件。
希望对你有帮助!