在 WordPress 开发中,有时我们需要统计某个分类目录下所有文章的数量,并且希望这个数量能包含其所有子分类中的文章。本文将提供一个高效、标准的 PHP 函数来实现此功能,并详细说明其使用方法。
核心功能函数
将以下 PHP 代码添加到您当前主题的 functions.php 文件中。此函数会接收一个分类 ID,并返回该分类及其所有子分类的文章总数。
/**
* 获取指定分类及其所有子分类的文章总数量
*
* @param int $category_id 需要统计的分类ID
* @return int 文章总数量
*/
function get_category_post_count_with_children($category_id) {
// 参数验证:确保传入的是正整数
if (!is_numeric($category_id) || $category_id <= 0) {
return 0;
}
// 获取主分类的文章数量
$main_category = get_category($category_id);
if (is_wp_error($main_category) || !$main_category) {
return 0;
}
$count = (int) $main_category->count;
// 获取该分类下的所有子分类
$child_categories = get_terms(array(
'taxonomy' => 'category',
'child_of' => $category_id,
'hide_empty' => false, // 包含文章数为0的子分类,确保逻辑完整
'fields' => 'ids' // 只获取分类ID,提升性能
));
// 如果获取子分类时出错或没有子分类,则直接返回主分类数量
if (is_wp_error($child_categories) || empty($child_categories)) {
return $count;
}
// 遍历所有子分类,累加文章数量
foreach ($child_categories as $child_cat_id) {
$child_category = get_category($child_cat_id);
if (!is_wp_error($child_category) && $child_category) {
$count += (int) $child_category->count;
}
}
return $count;
}
函数说明与优化
与原方案相比,此函数进行了以下优化:
- 添加了完善的错误处理:检查
get_category和get_terms的返回值,避免因无效分类ID导致PHP错误。 - 提升了性能:在调用
get_terms时使用'fields' => 'ids'参数,只获取子分类的ID数组,减少了数据库查询的数据量。 - 增加了代码注释:使函数目的、参数和返回值更清晰,便于维护。
- 参数验证:确保传入的分类ID是有效的正整数。
使用方法
在您的主题模板文件(如 category.php, archive.php, sidebar.php 或任何需要显示数量的地方)中,调用此函数。
示例1:在模板中直接输出
<?php
// 假设当前分类的ID是 5
$total_posts = get_category_post_count_with_children(5);
echo '此分类及其子分类下共有 ' . esc_html($total_posts) . ' 篇文章。';
?>
示例2:在循环或条件判断中使用
<?php
$current_cat_id = get_queried_object_id(); // 获取当前归档页面的分类ID
$post_count = get_category_post_count_with_children($current_cat_id);
if ($post_count > 0) {
echo '<p>找到 ' . $post_count . ' 篇相关文章。</p>';
}
?>
注意事项
- 缓存考虑:如果您的网站文章数量巨大或此函数被频繁调用,建议结合 WordPress 的 Transients API 或 Object Cache 对结果进行缓存,以提升性能。
- 多站点环境:此函数在 WordPress 多站点(Multisite)环境中默认只统计当前站点的文章。
- 自定义文章类型:此函数仅统计默认的“文章”类型。如果您的分类关联了自定义文章类型,需要修改
get_terms查询或使用更通用的WP_Term_Query。
通过以上方法,您可以准确、高效地获取 WordPress 中任意分类及其子分类下的文章总数量,并灵活地应用于主题开发中。