您正在使用的函数被置乱,没有多大意义。此外,它是非常静态的,因为您无法根据自定义参数(如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;