在结合了许多其他答案之后,我开始工作了!因此,这也是为那些同样为此而苦苦挣扎的人提供的解决方案:
这篇文章和这篇文章帮助了我一些,所以感谢那些家伙。
请注意,所有这些代码,加上您的初始自定义帖子类型和分类注册代码都在您的functions.php
文件中。
在定义自定义帖子类型和分类法时,首先要使子标签正确:对于自定义帖子类型,分类应该是basename/%taxonomy_name%
,分类标准的子标签应该是just basename
。别忘了还添加'hierarchical' => true
到分类法重写数组中,以在URL中获得嵌套术语。还要确保在两种情况下query_var
都将其设置为true
。
您需要添加一个新的重写规则,以便WordPress知道如何解释您的url结构。在我的情况下,uri的自定义帖子类型部分将始终是uri的第5个细分,因此我相应地定义了匹配规则。请注意,如果使用更多或更少的uri细分,则可能必须更改此设置。如果您要使用不同级别的嵌套术语,则需要编写一个函数来检查最后的uri段是自定义帖子类型还是分类术语,以了解要添加的规则(如果需要帮助,请咨询我那)。
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%
自定义帖子类型中的重写段结构:
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
,所有内容都应按照我在问题中指定的方式工作。您可能需要创建一些自定义分类存档页面来控制它们的外观,并添加某种分类小部件插件以在侧边栏中显示嵌套类别。
希望对您有帮助!