每月计算每个分类术语的帖子数

时间:2012-04-24 作者:cashba

无法解决。。。我需要统计每个月每个分类术语表的帖子数量。

2 个回复
SO网友:gmazzap

这是一个很长的答案,有很多代码,请注意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个嵌套循环,现在应该可以了。

SO网友:GhostToast

你可能想研究的一种方法是wp_get_archiveshttp://codex.wordpress.org/Function_Reference/wp_get_archives

您还可以使用the_date() 在一个月内整理职位。http://codex.wordpress.org/Function_Reference/the_date

我会尝试找到一个可以将结果存储在数组中的函数,然后使用count() 在数组上学习其内容。。。

祝你好运

结束

相关推荐

Sort Archive by Taxonomy

我有一个网站,上面有各州的分类法(如维多利亚州、肯斯兰州等)。这种分类法被称为listing\\u State。我还有一个名为membership\\u type的分类法,它可以是免费的,也可以是付费的。这两种税收经济适用于上市公司的CPT如果我点击一个州的分类法,它会按照预期结果按发布日期排序,我会如何在免费会员之前列出付费会员。我正在使用Genesis和Lifestyle主题谢斯里查德