如何创建具有定制分类和定制帖子类型(如base-name/parent-tax/child-tax/custom-post-type-name)的固定链接结构

时间:2012-01-20 作者:Jeff

我一直在搜索这个网站和谷歌来寻找答案,但结果完全是空的。基本上我想做什么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 ), 为了得到层次结构的slug,这在归档页面上很好地工作,但是自定义的post类型的post出现了404。如果我删除\'hierarchical\' => true 部分,然后帖子工作,但我丢失了层次URL(仅/基本名称/孙子目录/帖子名称/工作)。

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

4 个回复
最合适的回答,由SO网友:Jeff 整理而成

在综合了一堆其他答案后,我成功了!因此,这里有一个解决方案,也适用于那些正在与此斗争的人:

This postthis 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 在侧栏中显示嵌套类别的插件。

希望对你有帮助!

SO网友:vmassuchetto

看看《罢工》this plugin(now on github). 它为类别提供分层URL,但您可以轻松地适应任何分类法。

规则创建遵循recursive function.

SO网友:skndstry

用于处理不同级别的嵌套,

/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
我最终使用了Jeff的解决方案rewrite_rules_array 滤器相反,我使用了request 筛选以检查最后一个url部分是否为有效的postname,并将其添加到query\\u 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\');

SO网友:Carl Brubaker

以下是我对杰夫解决方案的看法。这个rewrite_rules_array 可能不需要,具体取决于您的应用程序。这简化了filter_post_type_link 并且不需要任何附加功能。它使用内置get_term_parents_list()

function PLUGIN_filter_post_type_link($post_link, $post)
{
    $postTypes = [\'CUSTOM-POST-TYPE\'];
    $taxonomy = \'taxonomy\';
    if (in_array($post->post_type, $postTypes, $strict=true)) {
        if ($terms = get_the_terms($post->ID, $taxonomy)
        ) {
            $args = [
                \'format\' => \'slug\',
                \'separator\' => \'/\',
                \'link\' => false,
                \'inclusive\' => true,
            ];

            return str_replace(
                "%{$taxonomy}%",
                rtrim(
                    get_term_parents_list($terms[0]->term_id, $taxonomy, $args),
                    "/"
                ),
                $post_link);
        }
        return str_replace("%{$taxonomy}%", \'\', $post_link);
    }
    return $post_link;
}

结束

相关推荐

Permalinks for quote authors

What I have:引用的网站,格式为:“引用文本”-引用作者参见quotup.com 对于我的考试网站(我为考试中的亵渎行为提前道歉)。What I\'m after:单击“-Quote Author”将启动一个包含该Quote Author所有引用的页面,URL为:示例。史蒂夫·史蒂文森,其中史蒂夫·史蒂文森是引文作者。What I\'ve done:创建了一个名为wp\\u qauthor的自定义表,该表通过post\\u meta(qauthor\\u id)绑定到wp\\u posts向函数