这是一个很长的答案,有很多代码,请注意not 已测试。
我的解决方案使用一个函数来创建多维数组,其中键是年、月、术语id,值是术语计数。
该函数还接受传递给WP\\u Query的参数数组作为参数,将术语计数限制为指定的帖子,因此您可以使用WP\\u Query time选项计算特定时期内分类法的术语,或仅对使用tax\\u Query选项响应另一分类法查询的帖子进行计数,依此类推。
按函数返回的数据非常丰富,可以通过多种方式进行操作,例如,我将发布一个函数,返回特定月份特定期限的计数。
不管怎样,给你:
function set_cont_taxonomy_term_for_months($taxonomy = \'category\', $query_args = \'\') {
$defaults = array(
\'posts_per_page\' => -1,
);
$args = wp_parse_args($query_args, $defaults);
$query = new WP_Query( $args );
$output = array();
if ( $query->have_posts() ) : while( $query->have_posts() ) : $query->the_post();
$terms = wp_get_object_terms( get_the_ID(), $taxonomy, array(\'fields\' => \'ids\') );
if ( is_array($terms) && ! empty($terms) ) {
global $post;
$year = (int) substr($post->post_date, 4, 0);
$month = (int) substr($post->post_date, 5, 2);
if ( ! isset($output[$year]) ) $output[$year] = array();
if ( ! isset($output[$year][$month]) ) $output[$year][$month] = array();
foreach ( $terms as $term ) {
$output[$year][$month][$term] = isset($output[$year][$month][$term]) ? $output[$year][$month][$term] + 1 : 1;
}
}
endwhile;
endif;
wp_reset_postdata();
return $output;
}
此函数的输出是一个数组,其内部项类似于:
$output[2013][7][132] = 5
即:2013年7月,ID为132的术语被使用了5次
请注意,仅当函数的第二个参数为空时(默认情况下),此断言“一般”(对于所有帖子)才有效,否则仅对响应作为第二个参数传递给函数的查询args数组的帖子有效。
现在,您可以将此函数生成的数组与另一个数组一起使用:
function get_month_term_count($term_id = 0, $year = \'\', $month = \'\', $taxonomy = \'category\', $query_args = array() ) {
if ( ! $term_id ) return 0;
if ( ! $year ) $year = (int)date(\'Y\');
if ( ! $month ) $year = (int)date(\'n\');
$count = (array) set_cont_taxonomy_term_for_months( $taxonomy, $query_args );
return ( empty($count) || ! isset($count[$year][$month][$termid]) ) ? 0 : $count[$year][$month][$termid];
}
此函数的输出是一个数字,即给定查询帖子在给定月份内对给定术语id的计数。
使用它比解释要容易得多:
以下代码显示how many times category with id \'3\' is used in posts of current month:
$cat = get_term(3);
$today = getdate();
$m = ($today["year"] * 100 ) + $today["mon"];
$count = get_month_term_count( 3, $today[\'year\'], $today[\'mon\'], \'category\', array(\'m\' =>$m) );
sprintf( __(\'In current month category %s is used %d times.\'), $cat->name, $count);
如前所述
set_cont_taxonomy_term_for_months
非常丰富,如下代码所示
tag counting in all the months of current year:
$today = getdate();
$count = set_cont_taxonomy_term_for_months( \'post_tag\', array(\'year\' => $today["year"] ) );
if ( ! empty($count) ) {
foreach ( $count as $year => $year_array ) {
echo \'<h1>\' __(\'Year: \') . $year \'</h1>\';
foreach ( $year_array as $month => $month_array ) {
echo \'<h2>\';
_e(\'Month \') . date_i18n( "F", mktime(0, 0, 0, $month, 1, $year ) );
echo \'</h2>\';
echo \'<ul>\';
foreach ( $month_array as $tag_id => $count ) {
$tag = get_term($tag_id);
if ( ! is_wp_error($tag) && ! empty($tag) ) {
printf( __(\'<li>Tag %s used %d times</li>\'), $tag->name, $count );
}
}
echo \'</ul>\';
}
}
}
如果您有很多帖子,那么执行3个嵌套的foreach循环会减慢脚本的速度,因此请尝试使用函数
set_cont_taxonomy_term_for_months
尽可能有选择性地传递$query\\u args,如果可以的话,编写函数以返回所需的信息,而无需执行周期,就像我使用
get_month_term_count
作用
希望有帮助。
Edit:
我已经更改了上一个示例中的3个嵌套循环,现在应该可以了。