统计类别中的帖子,包括子类别

时间:2015-11-07 作者:Marko

我在某个地方找到了这个代码,它只统计特定类别下的帖子。如果有人能将这一点扩大,以便将所有也属于其子类别的帖子计算在内,我将不胜感激?

function wp_get_cat_postcount($id) {

      $cat =  get_category_by_slug( $id ); 
      $count = (int)$cat->count;
      $taxonomy = \'category\';
      $args = array(
        \'child_of\' => $id,
        );
      $tax_terms = get_terms($taxonomy,$args);
      foreach ($tax_terms as $tax_term) {
        $count +=$tax_term->count;
      }
      return $count;
    }

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

您正在使用的函数被置乱,没有多大意义。此外,它是非常静态的,因为您无法根据自定义参数(如post类型、post状态或自定义字段)返回计数。另一件需要注意的事情是,如果一篇文章属于某个术语及其子术语之一,那么该文章将被计数两次,因此最终的文章计数将超过您实际拥有的数量。

恕我直言,我将使用一个自定义查询使函数动态化,并返回一个真正的计数,而不是由于属于父项和子项的帖子而导致的膨胀计数。

这个想法tax_query 具有名为include_children, 默认设置为true. 此参数将包括传递给的术语的所有子术语terms 参数,因此它将从传递的术语及其所有子项返回帖子。

其次,我们只需要查询一个帖子就可以得到帖子数量。什么WP_Query 默认情况下,它将继续在db中搜索匹配的帖子,即使它已经找到与查询匹配的必需帖子。这样做是为了计算分页,与查询匹配的所有这些帖子的计数存储在$found_posts 查询对象的属性。

为了节省db调用和时间,我们还将查询ID post字段,而不是完整字段WP_Post 对象

代码首先,请注意

代码未经测试,可能有缺陷。请确保首先在启用调试的本地测试安装上测试此功能

该代码至少需要PHP 5.4

我将在编写过程中对代码进行注释,以便您能够了解将发生的情况

/**
 * Funtion to get post count from given term or terms and its/their children
 *
 * @param (string) $taxonomy
 * @param (int|array|string) $term Single integer value, or array of integers or "all"
 * @param (array) $args Array of arguments to pass to WP_Query
 * @return $q->found_posts
 *
 */
function get_term_post_count( $taxonomy = \'category\', $term = \'\', $args = [] )
{
    // Lets first validate and sanitize our parameters, on failure, just return false
    if ( !$term )
        return false;

    if ( $term !== \'all\' ) {
        if ( !is_array( $term ) ) {
            $term = filter_var(       $term, FILTER_VALIDATE_INT );
        } else {
            $term = filter_var_array( $term, FILTER_VALIDATE_INT );
        }
    }

    if ( $taxonomy !== \'category\' ) {
        $taxonomy = filter_var( $taxonomy, FILTER_SANITIZE_STRING );
        if ( !taxonomy_exists( $taxonomy ) )
            return false;
    }

    if ( $args ) {
        if ( !is_array ) 
            return false;
    }

    // Now that we have come this far, lets continue and wrap it up
    // Set our default args
    $defaults = [
        \'posts_per_page\' => 1,
        \'fields\'         => \'ids\'
    ];

    if ( $term !== \'all\' ) {
        $defaults[\'tax_query\'] = [
            [
                \'taxonomy\' => $taxonomy,
                \'terms\'    => $term
            ]
        ];
    }
    $combined_args = wp_parse_args( $args, $defaults );
    $q = new WP_Query( $combined_args );

    // Return the post count
    return $q->found_posts;
}
用法您可以通过以下方式使用该功能

CASE 1

单个术语(术语ID21)和默认类别分类法

$count = get_term_post_count( \'category\', 21 );
echo $count;

CASE 2

具有自定义分类法的术语ID数组my_taxonomy

$count = get_term_post_count( \'my_taxonomy\', [21, 41, 52] );
echo $count;

CASE 3

自定义帖子类型的默认类别分类中的单个术语cpt 和post状态trash

$args = [
    \'post_type\'   => \'cpt\',
    \'post_status\' => \'trash\'
];
$count = get_term_post_count( \'category\', 21, $args );
echo $count;

USAGE 4

如果需要从给定分类法的所有术语中获取post计数,只需设置$term 所有参数

$count = get_term_post_count( \'category\', \'all\' );
echo $count;

相关推荐

Gravity Forms - RMA Count

我是Wordpress的新手,所以想知道是否有人可以帮忙?我正在通过重力表单创建一个返回表单。然而,在每个表单的顶部,我想显示一个退货表单编号,例如RMA001、RMA002等。我想这可能可以使用一些编码来完成,但不知道如何编码。请你让我知道如何做到这一点,并解释我需要在哪里添加代码。如果您能掌握简单的英语,我们将不胜感激!非常感谢!本