问题描述

我一直在梳理这个网站和谷歌的答案,我已经完全空了。基本上我想要做的是什么 this post 问,但我需要一个分级分类。那个帖子中给出的答案很棒,但是只有一个级别的分类法。有可能做我想要的吗?我尝试了一百万件事情,但没有一项工作,最多只能获得 404 个固定链接。

为了直观地说明我想要的:

/basename/ - ideally a page, but I think this will cause a permalink collision
/basename/top-cat/ - top parent custom taxonomy archive
/basename/top-cat/child-cat/ - child cat custom taxonomy archive
/basename/top-cat/child-cat/grandchild-cat/ - grandchild cat custom taxonomy archive
/basename/top-cat/child-cat/grandchild-cat/post-name/ - my custom post type post

您可以使用内置的帖子和类别做到这一点,您如何使用自定义分类法和自定义帖子类型进行操作?我知道你需要使用'rewrite' => array( 'slug' => 'tax-name', 'with_front' => true, 'hierarchical' => true ), 来获得分级 s,,这在档案页面上工作得很好,但是自定义的帖子类型的帖子会出现 404. 如果我删除了'hierarchical' => true 部分,那么这些帖子就会工作,但是我丢失了层次化的 URL / basename / grandchild-cat / post-name / works) 。

那么,任何解决方案?非常感谢你,现在已经开车了约 3 个星期了。

最佳解决方案

结合了一堆其他答案后,我得到了它的工作!所以这里也是为那些也在努力的人的解决方案:

 This postthis one 帮助了我一些,所以感谢那些家伙。

注意,所有这些代码,加上您的初始自定义帖子类型和分类注册代码进入您的 functions.php 文件。

在定义您的自定义帖子类型和分类标准时,首先得到你的 s ies 声:对于自定义帖子类型,它应该是 basename/%taxonomy_name%,您的分类标准应该只是 basename 。不要忘了还要将'hierarchical' => true 添加到分类法重写数组中,以便在您的 URL 中获取嵌套的术语。还要确保 query_var 在这两种情况下都设置为 true

您需要添加新的重写规则,以便 Wordpress 知道如何解释您的网址结构。在我的情况下,uri 的自定义帖子类型部分将始终是第 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);
}

然后你需要添加这个代码让工作如何处理%taxonomy_name% 在你的自定义 post 类型重写 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;
}

然后,您需要刷新您的永久链接 (只需加载您的永久链接设置页面) 。

现在全部’should’ 有希望的工作!做一些分类术语并正确嵌套,然后制作一些自定义的帖子类型的帖子并将其正确分类。你也可以用一个 basename 的一个页面,一切都应该按照我在我的问题中指定的方式工作。您可能需要创建一些自定义分类归档页面来控制它们的外观,并添加一些 taxonomy widget 插件,以在侧栏中显示嵌套类别。

希望能帮助你!

参考文献

注:本文内容整合自 Google/Baidu/Bing 辅助翻译的英文资料结果。如果您对结果不满意,可以加入我们改善翻译效果:薇晓朵技术论坛。