You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

sidebar.php自定义分类统计代码效率优化与冗余改进咨询

分类统计代码优化方案:减少冗余+提升效率

嘿,很高兴能帮你优化这段sidebar里的分类统计代码!针对你提到的冗余问题和效率顾虑,我们可以从代码复用和数据库查询优化两个方向入手,下面一步步说清楚:

一、先解决冗余:把重复代码封装成函数

你提到有近三行内容重复,大概率是每次获取分类下常规文章、自定义文章数量的代码。我们可以把这部分逻辑打包成一个可复用的函数,需要用的时候直接调用就行,不用反复写相同代码。

示例优化:

假设你原来重复的代码是类似这样(自定义文章类型以custom_post为例):

// 常规文章数量
$post_count = count(get_posts(array(
    'post_type' => 'post',
    'cat' => $category->term_id,
    'post_status' => 'publish',
    'posts_per_page' => -1,
    'fields' => 'ids'
)));

// 自定义文章数量
$custom_count = count(get_posts(array(
    'post_type' => 'custom_post',
    'cat' => $category->term_id,
    'post_status' => 'publish',
    'posts_per_page' => -1,
    'fields' => 'ids'
)));

我们把它改成一个可复用函数:

// 封装统计函数:传入分类ID,返回两种文章的数量数组
function get_category_post_counts($category_id) {
    // 用found_posts替代count(ids),更高效
    $post_query = new WP_Query(array(
        'post_type' => 'post',
        'cat' => $category_id,
        'post_status' => 'publish',
        'posts_per_page' => -1,
        'fields' => 'ids'
    ));
    $post_count = $post_query->found_posts;

    $custom_query = new WP_Query(array(
        'post_type' => 'custom_post',
        'cat' => $category_id,
        'post_status' => 'publish',
        'posts_per_page' => -1,
        'fields' => 'ids'
    ));
    $custom_count = $custom_query->found_posts;

    wp_reset_postdata(); // 重置查询,避免影响后续逻辑
    return array('post' => $post_count, 'custom' => $custom_count);
}

之后循环分类时,只需要一行调用就能获取数量:

$counts = get_category_post_counts($category->term_id);
echo "常规文章:{$counts['post']} | 自定义文章:{$counts['custom']}";

这样就把重复代码浓缩成了函数调用,彻底解决冗余问题,后续修改统计逻辑也只需要改这一个函数。

二、提升效率:减少数据库查询次数

如果原来的代码是循环每个分类都执行两次查询(常规+自定义),分类多的话会产生大量数据库请求,拖慢页面加载。我们可以改成批量查询,一次性统计所有分类的文章数量,再循环展示。

步骤1:获取所有分类(含层级)

$categories = get_categories(array(
    'hide_empty' => false, // 按需是否显示空分类
    'hierarchical' => true,
    'orderby' => 'name',
    'order' => 'ASC'
));

步骤2:一次性批量统计所有分类的文章数量

直接用$wpdb写SQL查询,比多次WP_Query高效得多:

global $wpdb;

// 统计常规文章的分类数量
$post_counts = $wpdb->get_results("
    SELECT tr.term_taxonomy_id, COUNT(tr.object_id) as count
    FROM {$wpdb->term_relationships} tr
    JOIN {$wpdb->posts} p ON tr.object_id = p.ID
    WHERE p.post_type = 'post' AND p.post_status = 'publish'
    GROUP BY tr.term_taxonomy_id
", ARRAY_A);

// 转成按分类ID映射的数组,方便快速查找
$post_count_map = array();
foreach ($post_counts as $item) {
    $term = get_term_by('term_taxonomy_id', $item['term_taxonomy_id'], 'category');
    $post_count_map[$term->term_id] = $item['count'];
}

// 同理统计自定义文章的分类数量
$custom_counts = $wpdb->get_results("
    SELECT tr.term_taxonomy_id, COUNT(tr.object_id) as count
    FROM {$wpdb->term_relationships} tr
    JOIN {$wpdb->posts} p ON tr.object_id = p.ID
    WHERE p.post_type = 'custom_post' AND p.post_status = 'publish'
    GROUP BY tr.term_taxonomy_id
", ARRAY_A);

$custom_count_map = array();
foreach ($custom_counts as $item) {
    $term = get_term_by('term_taxonomy_id', $item['term_taxonomy_id'], 'category');
    $custom_count_map[$term->term_id] = $item['count'];
}

步骤3:循环分类展示数量

现在循环分类时直接从数组取数据,不用再发起数据库请求:

foreach ($categories as $category) {
    // 取数量,默认0避免报错
    $post_count = isset($post_count_map[$category->term_id]) ? $post_count_map[$category->term_id] : 0;
    $custom_count = isset($custom_count_map[$category->term_id]) ? $custom_count_map[$category->term_id] : 0;

    // 保留你的层级缩进逻辑,输出分类名和数量
    echo str_repeat('&nbsp;&nbsp;', $category->depth) . "{$category->name}:常规({$post_count}) | 自定义({$custom_count})<br>";
}

三、可选优化:子分类数量累加(如果需要)

如果希望父分类的数量包含所有子分类的文章数,可以加一个递归函数计算:

// 递归计算分类+所有子分类的总文章数
function get_total_category_count($category_id, $count_map) {
    $total = isset($count_map[$category_id]) ? $count_map[$category_id] : 0;
    // 获取所有子分类ID
    $children = get_term_children($category_id, 'category');
    foreach ($children as $child_id) {
        $total += get_total_category_count($child_id, $count_map);
    }
    return $total;
}

使用时只需替换之前的数量获取:

$total_post_count = get_total_category_count($category->term_id, $post_count_map);
$total_custom_count = get_total_category_count($category->term_id, $custom_count_map);

总结

通过这几个优化:

  1. 封装函数解决了代码冗余,后续维护更省心;
  2. 批量SQL查询把多次数据库请求压缩到2次,大幅提升运行效率;
  3. 可选的子分类累加逻辑让统计更灵活。

内容的提问来源于stack exchange,提问作者jjycjn

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:36:35