每个分类术语级别的GET_TEMPLATE_PART

时间:2015-11-18 作者:Simo

在我们开始之前,感谢您抽出时间。

Structure:
cpt = corsi
tax = argomenti
tax_term = parent
tax_term_child = child
tax_term_child_granchild = grandchild
当前代码(在taxonomy argomenti.php上):

$queried_object = get_queried_object();
$cpt = get_post_type( get_the_ID() );
$taxonomy = $queried_object->taxonomy;
$term_id = $queried_object->term_id;

    $current_term = get_term_by(\'id\', get_query_var(\'term\'), $taxonomy);
    if((int)$current_term->parent)
        get_template_part(\'argomenti\', \'child\');
    else
        get_template_part(\'argomenti\', \'parent\');
我会选择用于所有分类术语级别的模板。

示例:

localhost\\cpt                           archive-cpt.php
localhost\\cpt\\parent                    argomenti-parent.php
localhost\\cpt\\parent\\child              argomenti-child.php
localhost\\cpt\\parent\\child1\\grandchild  argomenti-grandchild.php
是否可以使用我发布的函数?

非常感谢。

1 个回复
最合适的回答,由SO网友:Pieter Goosen 整理而成

创建并包含自定义帖子类型存档的模板很容易,您只需创建archive-{$post_type}.php 模板,Wordpress将在您访问特定帖子类型的存档页面时自动使用该模板。只需记住设置has_archive 注册帖子类型时的参数。

至于分类法归档页面,您几乎就到了,只需检查一个术语是顶级术语还是子术语或孙子术语。从你的问题中我可以看出,你已经创建了taxonomy-{$taxonomy}.php 用于分类法中所有术语的模板argomenti, 不考虑层次结构。您已经使用了将根据层次结构包含的模板部件。

让我们看看我们将在这里使用的逻辑。

  • get_queried_object() 将保存当前正在查看的术语的术语对象。我们将使用它来获取术语的父项和术语ID

    所有顶级术语的父ID均为0, 这很重要。

    对于父ID大于0, 我们需要确定它在层次结构中的位置。为此,我们将使用get_ancestors. 此函数将返回一个术语ID数组。第一个术语ID将是正在测试的术语直接父级,最后一个术语ID将是顶级术语父级的ID。要确定术语在层次结构中的位置,我们只需要获得数组的大小,空数组表示父数组,带一个键的数组表示子数组,带两个键的数组表示孙数组

    现在,我们可以将所有这些逻辑编入代码。为了避免分类法模板中出现大量代码,我们将创建一个可以添加的函数functions.php 然后在分类法模板中调用一行。(NOTE: 所有代码都未经测试,可能存在错误,因此请确保在启用调试的情况下在本地测试。此外,还需要PHP 5.4+)

    function get_tax_hierarchy_template_part( $template = \'\', $subfolder = \'\' )
    {
        /**
         * Make sure we are actually on a taxonomy archive page, if not, return false
         * 
         * Instead of returning false here, you can also set it to return a default template
         * Check the section commented out
         */
        if ( !is_tax() )
            return false;
            // return get_template_part( \'content\' ); // Return default template
    
        // Get the current term object
        $current_term_object = get_queried_object();
    
        // Check if we have a value for $subfolder, if so, sanitize it and add slashes
        if ( $subfolder )
            $subfolder = \'/\' . filter_var( $subfolder, FILTER_SANITIZE_STRING ) . \'/\';
    
        /**
         * Check if we have value for $template, if so, sanitize, if not, use the taxonomy name
         * Also append the $subfolder to $template
         */
        if ( $template ) {
            $template = filter_var( $template, FILTER_SANITIZE_STRING );
        } else {
            $template = $current_term_object->taxonomy;
        }
        $template = $subfolder . $template;
        // Check if current term is top level, if so, return template part for parent terms
        if ( $current_term_object->parent == 0 )
            return get_template_part( $template, \'parent\');
    
        /**
         * If we have reached this section, it means our term is not toplevel
         * We must now determine where in the hierarchy the term is
         */
        $hierarchy = get_ancestors( $current_term_object->term_id, $current_term_object->taxonomy );
    
        // We must now get the size of the array
        $hierarchy_depth = count( $hierarchy );
    
        /**
         * We will set child when the size of the array is one. For any size more 
         * than one, we will set grandchild
         *
         * If you are going to have grand-grandchildren which should have its own
         * template, you would need to adjust this section
         */
        $part = ( $hierarchy_depth == 1 ) ? \'child\' : \'grandchild\';
    
        // Return the correct template part according to hierarchy
        return get_template_part( $template, $part );
    }
    
    现在可以在分类法模板中按如下方式调用它

    get_tax_hierarchy_template_part();
    
    如果你设置了后备,你可以在任何地方使用它

    根据要求编辑,我在函数中包含了一个参数$template. 现在可以为模板零件设置模板名称。如果未设置此is参数,则将使用分类名称。

    用法如果模板部件具有以下名称,{$taxonomy}-parent.php, 您需要如下调用函数

    get_tax_hierarchy_template_part();
    
    如果模板部件被称为其他名称,例如content-parent.php, 您需要如下调用函数

    get_tax_hierarchy_template_part( \'content\' );
    
    编辑2由于分类法名称应作为模板部分的默认名称,因此我必须合并第二个参数,名为$subfolder 以便在子文件夹中容纳模板零件。我已经相应地更新了代码。

    用法

    您只需要传递子文件夹名称,不带斜杠作为第二个参数。如果使用,请记住将空字符串作为第一个参数传递{$taxonomy}-parent.php 作为模板部件

    示例:

    get_tax_hierarchy_template_part( \'\', \'subfoldername\'  );
    
    用于content-parent.php 类型模板零件,使用

     get_tax_hierarchy_template_part( \'content\', \'subfoldername\' );
    

相关推荐

Increase offset while looping

我正在编写一个自定义帖子插件,它将自定义帖子分组显示为选项卡。每组4个岗位。是否可以编写一个偏移量随每次循环而增加的查询?因此,结果将是:-第一个查询显示从1到4的帖子-第二个查询显示从5到8的帖子-第三个查询显示从9到12的帖子等。 <div class=\"official-matters-tabs\"> <?php $args = array(\'post_type\' => \'official-matters\', \'showp