我一直在梳理这个网站和google的答案,而我完全是空的。基本上,我想完全按照这篇文章的要求做,但是我需要一个层次分类法。该帖子中给出的答案很好,但仅适用于单级分类法。可以做我想做的吗?我已经尝试了上百万种方法,但没有任何效果,充其量我只能获得正确的永久链接,但它们可以显示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 ),来获取层次结构的标签,该标签在存档页面上可以正常工作,但是自定义帖子类型的帖子出现404。如果我删除'hierarchical' => true部分,则帖子可以工作,但是我会丢失层次结构的网址(仅/ basename / grandchild-cat / post-name /可以)。

那么,有什么解决方案吗?非常感谢,这已经让我发疯了大约三个星期。

#1 楼

在结合了许多其他答案之后,我开始工作了!因此,这也是为那些同样为此而苦苦挣扎的人提供的解决方案:

这篇文章和这篇文章帮助了我一些,所以感谢那些家伙。

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

在定义自定义帖子类型和内容时,首先要正确处理分类法:对于自定义帖子类型,应为basename/%taxonomy_name%,而分类法的子标签应仅为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;    
}


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

现在,一切都“应该”有望运行!制作一堆分类术语并将其正确嵌套,然后制作一些自定义帖子类型的帖子并将其正确分类。您也可以使用basename来制作页面,所有内容都应按照我在问题中指定的方式工作。您可能需要创建一些自定义分类存档页面来控制它们的外观,并添加某种分类小部件插件以在边栏中显示嵌套类别。

希望对您有所帮助!

评论


固定-请参阅问题。杰夫,谢谢您的解释!但是,您是否有可能发布自定义的posttype /分类法构建?这样我就能知道我在做错什么吗?真的会很感激!

– Reitze Bos
2012年3月28日9:26



嘿,杰夫,谢谢您的回答!经过4个小时的战斗,我快到了。我唯一的问题是,我在帖子名称之前加了一个双斜杠(例如:Portfolio / diseno-grafico-2 / logo // alquimia-sonora /),您能帮我吗?

–士气
2012年4月7日19:50

@Cmorales,不确定是否看不到您的代码,而是在帖子名称之前寻找一个手动定义斜杠的地方,例如cpt slug注册还是在filter_post_type函数中?如果无法找到要在其中添加额外斜杠的位置,则可以从filter_post_type_link中调用的get_taxonomy_parents函数的返回值中剥离最后一个字符,因为这将为您留下一个斜杠,这是第一个双。祝好运。

–杰夫
2012年4月9日15:32

“如果嵌套术语的级别不同,那么您需要编写一个函数来检查最后一个uri段是自定义帖子类型还是分类术语,以了解要添加的规则(如果需要帮助,请咨询我)...”好吧,能帮我吗? :)

–士气
13年5月22日在22:47

^这正是我所需要的。有人知道怎么做吗?在这里看到我的问题:wordpress.stackexchange.com/questions/102246/…

–reikyoushin
2013年6月7日14:55

#2 楼

看看这个插件(现在在github上)。它提供了类别的分层URL,但是您可以轻松地适应任何分类法。
规则创建遵循递归函数。

评论


该插件不再可用。

– Enkode
18/12/5在22:34

#3 楼

为了处理不同级别的嵌套,

/basename/top-cat/ -> Top Cat Archive
/basename/top-cat/post-name/ -> Post in Top Cat
/basename/top-cat/child-cat/ -> Child Cat Archive
/basename/top-cat/child-cat/post-name/ -> Post in Child Cat


我最终使用了没有rewrite_rules_array过滤器的Jeff解决方案。相反,我使用request过滤器来检查最后一个url部分是否为有效的帖子名称,并将其添加到query_vars中。

例如

function vk_query_vars($qvars){
    if(is_admin()) return $qvars;
    $custom_taxonomy = 'product_category';
    if(array_key_exists($custom_taxonomy, $qvars)){
        $custom_post_type = 'product';


        $pathParts = explode('/', $qvars[$custom_taxonomy]);
        $numParts = sizeof($pathParts);

        $lastPart = array_pop($pathParts);
        $post = get_page_by_path($lastPart, OBJECT, $custom_post_type);
        if( $post && !is_wp_error($post) ){
            $qvars['p'] = $post->ID;
            $qvars['post_type'] = $custom_post_type;
        }
    }
    return $qvars;
}
add_filter('request', 'vk_query_vars');