在我们开始之前,感谢您抽出时间。
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
是否可以使用我发布的函数?
非常感谢。
最合适的回答,由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\' );