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(' ', $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);
总结
通过这几个优化:
- 封装函数解决了代码冗余,后续维护更省心;
- 批量SQL查询把多次数据库请求压缩到2次,大幅提升运行效率;
- 可选的子分类累加逻辑让统计更灵活。
内容的提问来源于stack exchange,提问作者jjycjn
相关产品推荐
相关产品推荐

