这里有一个有趣的方法
概念我们需要一个术语列表,其中职位列在特定术语下,但使用传统方法,职位列在父、子和孙术语下。我们想要的是only 列出上一个任期内的职位,如果是孙辈,则该职位应仅列在孙辈任期下
当前代码存在问题,因为这只是一个归档页面,没有用作分类页面,所以这里有几个严重错误。以下代码
<div id="content" class="site-content">
<?php if (category_description( $category ) == \'\') { ?>
<?php } else { ?>
<article class="single">
<div id="subcats" class="entry-content">
<h2>Description</h2>
<?php echo category_description( $category_id ); ?>
</div>
</article>
<?php } ?>
<?php
$term = get_queried_object();
$children = get_terms( $term->taxonomy, array(
\'parent\' => $term->term_id,
\'hide_empty\' => 0,
\'show_count\' => 0
) );
if($children) {
?>
<article class="single">
<div id="subcats" class="entry-content">
<?php
$term = get_term_by( \'slug\', get_query_var( \'term\' ), get_query_var( \'taxonomy\' ) );
if ($term->parent == 0) { ?>
<h2>Browse Sub-categories:</h2>
<ul>
<?php wp_list_categories(\'taxonomy=wpl_documents_category&depth=1&title_li=&child_of=\' . $term->term_id); ?>
</ul>
<?php } else { ?>
<h2>Browse Sub-categories:</h2>
<ul>
<?php wp_list_categories(\'taxonomy=wpl_documents_category&&title_li=&child_of=\' . $term->term_id); } ?>
</ul>
</div>
</article>
<?php } ?>
<div> </div>
</div>
应删除。这会导致一大堆错误。如果打开debug,您将看到我在说什么。此代码只能在分类法或类别模板中使用,只需进行一些调整,或者如果存档页面实际用作具有适当条件标记的分类法页面,则此代码也只能在分类法或类别模板中使用。
工作流这是一个非常基本的列表,按字母顺序列出术语,而不考虑父项、子项或孙项
我们需要做的是,获取归档中特定于分类法的特定帖子类型的所有帖子的列表。这将使用tax_query
具有WP_Query
. get_terms()
将用于获取属于指定分类法的术语列表。这将用于tax_query
去拿帖子。
我决定编写一个可以全局显示术语列表的函数。
当所有帖子都返回后,我们需要获得每个帖子所属的条款。为此,我们正在利用get_the_terms()
为了为属于父项和/或子项和/或孙子项的帖子做好准备,我将返回的术语数组排序为usort
根据术语ID,使行中最后一个术语显示在第一位。这个学期将是孙子或孩子。
但是,一个职位不能属于同一级别上的两个术语,例如,有两个子术语。如果发生这种情况,仍将使用具有最高术语ID的术语
排序数组中的第一个术语将用于创建此列表并在其下添加帖子标题
创建的新数组将按ksort
因此,术语列表按字母顺序排序。根据发布日期对帖子进行排序
我还添加了transient 使功能更快,资源消耗更少。此列表将每24小时更新一次,您可以根据需要进行更改,使其更长。选择与您添加新帖子的频率相对应的时间长度。如果您每周添加新帖子,请将临时时间设置为每周过期一次
要确保在删除、发布或更新帖子时更新列表,请transition_post_status
操作用于在发布、删除或更新帖子时删除瞬态
让我们编写代码,这是代码,将所有这些粘贴到函数中。php
function get_term_post_list( $taxonomy = \'category\', $post_type = \'post\' ) {
if ( false === ( $q = get_transient( \'term_list\' ) ) ) {
$q = \'\';
$term_ids = get_terms( $taxonomy, \'fields=ids\' );
if ( ! empty( $term_ids ) && ! is_wp_error( $term_ids ) ){
$args = array(
\'posts_per_page\' => -1,
\'post_type\' => $post_type,
\'fields\' => \'names\',
\'tax_query\' => array(
array(
\'taxonomy\' => $taxonomy,
\'field\' => \'term_id\',
\'terms\' => $term_ids,
),
),
);
$query = new WP_Query($args);
?><
if( $query->have_posts() ) {
while ( $query->have_posts() ) {
$query->the_post();
$a = \'<a href="\'. get_permalink() .\'">\' . get_the_title() .\'</a>\';
$all_terms = get_the_terms( $query->post->ID, $taxonomy );
$terms = array_values( $all_terms );
usort( $terms, function ( $a, $b ) {
return ($a->term_id < $b->term_id) ? 1 : -1;
});
$b = ucfirst( $terms[0]->name );
$q[$b][] = $a; // Create an array with the category names and post titles
}
/* Restore original Post Data */
wp_reset_postdata();
}
ksort( $q );
}
set_transient( \'term_list\', $q, 24 * HOUR_IN_SECONDS );
}
return $q;
}
add_action( \'transition_post_status\', function ( $new_status, $old_status, $post )
{
delete_transient( \'term_list\' );
}, 10, 3 );
如何使用这是如何在模板文件中使用代码,
archive-post_documents.php
$lists = get_term_post_list( $taxonomy = \'wpl_documents_category\', $post_type = \'post_documents\' );
foreach ($lists as $key=>$values) {
echo $key;
echo \'<ul>\';
foreach ($values as $value){
echo \'<li>\' . $value . \'</li>\';
}
echo \'</ul>\';
}