具有嵌套分类和模板文件的自定义发布类型

时间:2014-09-11 作者:Michael Ecklund

我有一个自定义的帖子类型“公文包”,其中重写了portfolio. 因此,前端的URL是:domain.com/portfolio.

我有一个自定义的“类别”分类法,其中重写了portfolio/category. 因此,前端的URL是:domain.com/portfolio/category/<term-slug>/

当我访问时domain.com/portfolio/ 帖子类型模板显示得很好。

当我访问时domain.com/portfolio/category/<term-slug>/ 分类术语模板显示得很好。

然而,当我访问时:domain.com/portfolio/category/ 分类法模板不起作用。我得到一个404错误。

我甚至测试了核心职位类型:post 和核心分类法:category, 将帖子页面设置为/blog/.

同样的事情。。。

  • domain.com/blog/ 显示帖子很好,从home.php模板
  • domain.com/blog/category/<term-slug>/ 显示正常,从category.php 模板
  • domain.com/blog/category/ 显示404错误
我过去采取的另一种方法是为这些404错误创建一个“页面”。例如,我有/blog/ 已创建为“页面”。然后我会创造/blog/category/ 作为另一个页面,以便在用户导航到以下位置时不会出现404错误:domain.com/blog/category/.

这是预期的行为吗?是否有一种方法可以避免为那些“分类法档案”创建页面?

如何拥有嵌套的分类法URL和taxonomy.php 甚至archive.php 模板工作?

2 个回复
最合适的回答,由SO网友:Michael Ecklund 整理而成

Appending Taxonomy Terms to Post Type URLs

我相信我已经从网上随机的各种来源中找到了一个临时解决方案。

我希望有人能对我的答案进行扩展,让它更“防弹”。然而,从短期来看,这种解决方案确实有效。

与当前重写规则挂钩。

add_action(\'rewrite_rules_array\', \'mbe_rewrite_rules_array\', 100);

将在现有重写规则中添加新的重写规则。

function mbe_rewrite_rules_array($rules){
    $new_rules = mbe_get_new_rewrite_rules();
    return ($new_rules + $rules);
}
添加一些新的重写规则。。。(我认为这方面肯定需要改进——我不熟悉重写规则。)

function mbe_get_new_rewrite_rules(){

    $post_type = \'mbe-portfolio\';
    $post_type_slug = \'portfolio\';

    $taxonomy = \'mbe-portfolio-categories\';
    $taxonomy_slug = \'category\';

    $slug = $post_type_slug.\'/\'.$taxonomy_slug;

    return array(
        "{$slug}/?$" => "index.php?post_type={$post_type}&taxonomy={$taxonomy}"
    );

}
通过添加新的重写规则,WordPress不再看到domain.com/portfolio/category/ 作为404,但作为Post类型归档。

钩住模板系统以显示taxonomy.php 查看时domain.com/portfolio/category/

add_filter(\'archive_template\', \'mbe_taxonomy_template\');

function mbe_taxonomy_template($template){

    $templates = array();

    $post_type = \'mbe-portfolio\';
    $taxonomy = \'mbe-portfolio-categories\';

    if(get_query_var(\'post_type\') == $post_type && !get_query_var(\'taxonomy\')){
        return $template;
    }

    if(get_query_var(\'post_type\') == $post_type && get_query_var(\'taxonomy\') == $taxonomy){
        $templates[] = \'taxonomy.php\';
    }

    $templates[] = $template;

    return locate_template($templates);

}
现在如果你去domain.com/portfolio/category/ it加载taxonomy.php 从当前活动的WordPress主题目录。

所以我想了想。虽然taxonomy.php ,而不是检查是否应显示有关分类法的信息或有关分类法中术语的信息。我决定创建一个名为term.php 避免混淆。

钩住模板系统以显示term.php 查看时domain.com/portfolio/category/<term-slug>

add_filter(\'taxonomy_template\', \'mbe_term_template\');

function mbe_term_template($template){

    $templates = array();

    $queried_object = get_queried_object();

    if(property_exists($queried_object, \'term_id\')){
        $templates[] = \'term.php\';
    }

    $templates[] = $template;

    return locate_template($templates);

}
现在如果你去domain.com/portfolio/category/<term-slug> it加载term.php 从当前活动的WordPress主题目录。

查看时的结论domain.com/portfolio/ - 默认存档模板照常加载。(archive.php, archive-posttype.php, 等)从当前活动的WordPress主题domain.com/portfolio/category/ - 这个taxonomy.php模板文件是从当前活动的WordPress主题加载的domain.com/portfolio/category/<term-slug> - 这个term.php 模板文件是从当前activeWordPress主题加载的您可以轻松测试,看看这是否有效。您所需要的只是当前活动WordPress主题目录中的三个文件。(archive.phparchive-posttype.php, taxonomy.php, 和term.php)

把这个放进去archive.phparchive-posttype.php

$current_post_type = get_query_var(\'post_type\');

echo \'<p><strong>Current View:</strong> Post Type</p>\'.PHP_EOL;
echo \'<p><strong>Current Post Type:</strong> <code>\'.$current_post_type.\'</code></p>\'.PHP_EOL;
把这个放进去taxonomy.php

$current_post_type = get_query_var(\'post_type\');
$current_taxonomy = get_query_var(\'taxonomy\');

echo \'<p><strong>Current View:</strong> Taxonomy</p>\'.PHP_EOL;
echo \'<p><strong>Current Post Type:</strong> <code>\'.$current_post_type.\'</code></p>\'.PHP_EOL;
echo \'<p><strong>Current View:</strong> <code>\'.$current_taxonomy.\'</code></p>\'.PHP_EOL;
把这个放进去term.php

$current_term = get_queried_object();

echo \'<p><strong>Current View:</strong> Term</p>\'.PHP_EOL;
echo \'<p><strong>Current Term Name:</strong> <code>\'.$current_term->name.\'</code></p>\'.PHP_EOL;
echo \'<p><strong>Current Taxonomy:</strong> <code>\'.$current_term->taxonomy.\'</code></p>\'.PHP_EOL;
请不要直接跳到此链接。然而,如果你已经阅读了整个问题并接受了答案,你仍然感到困惑。我写了一个blog post 更详细一点,这可能会帮助您更好地理解。

SO网友:Pieter Goosen

这是预期的,如何实现Template Hierarchy 作品我知道几年前,有人提出了一个关于这个问题的问题,是否应该在核心引入档案索引。(编辑:找到票证,请在此处查看:Ticket #13816 There should be built-in index pages for taxonomies

但是,您可以使用页面模板为所有单独的归档创建索引页面。例如,创建一个新页面,向该页面添加任何需要添加的内容,并为其分配一段category. 现在,当你访问domain.com/blog/category/, 您将看到您创建的内容/索引页面。

除此之外,据我所知,没有其他解决办法。

结束

相关推荐

PRINT_MEDIA_TEMPLATES未应用于媒体管理器插件

我正在尝试构建一个媒体库,用户可以在其中选择从自定义文件夹中检索的图片,用户可以指定其basefolder。我正在取回正确的图像,但指定的模板未应用于缩略图。它确实可以找到标题(选择img时请参见侧栏)它没有应用想要的模板,而是说<div class=\"filename\"><div></div></div> 实际上,我甚至不需要自定义模板,我很乐意将图像显示在标准库中,但我似乎无法得到正确的结果。在介质文件夹管理中。js文件我有这个var Mfm