如何统计自定义文章类型Stores中ACF选项的店铺数量
查询ACF字段对应自定义文章类型的数量问题
我创建了名为“Stores”的自定义文章类型,并添加了一个ACF字段:
- 字段类型:下拉选择(Select)
- 字段名称:store_state
- 选项:Alabama、California、Colorado
需要在About页面查询数据库,展示每个州对应的店铺总数,格式要求如下:
- Alabama (12) Stores
- California (24) Stores
- Colorado (7) Stores
我尝试了以下代码但未成功,恳请指导:
$the_query = new WP_Query( array( 'post_type' => 'stores', 'tax_query' => array( array( 'taxonomy' => 'store_state', 'field' => 'choices' ) ) ) ); $count = $the_query->found_posts;
问题原因
你用了tax_query查询,但store_state是ACF添加的自定义字段(存储在wp_postmeta表中),并非WordPress原生的分类法(Taxonomy),所以这个查询逻辑完全错误,自然无法得到正确结果。
解决方案
方案一:循环每个州,用WP_Query统计(简单直观)
// 和ACF字段选项保持一致的州列表 $states = array('Alabama', 'California', 'Colorado'); echo '<ul>'; foreach ($states as $state) { $query = new WP_Query(array( 'post_type' => 'stores', 'post_status' => 'publish', // 仅统计已发布的店铺 'meta_query' => array( array( 'key' => 'store_state', 'value' => $state, 'compare' => '=' ) ), 'posts_per_page' => -1, // 无需返回文章内容,仅用于统计数量 'no_found_rows' => true, // 优化查询,不计算分页,提升性能 )); $count = $query->found_posts; echo '<li>' . esc_html($state) . ' (' . esc_html($count) . ') Stores</li>'; wp_reset_postdata(); // 重置查询,避免影响后续全局变量 } echo '</ul>';
方案二:直接SQL查询(性能更优,适合大量数据)
如果你的Stores数量较多,多次WP_Query会有性能损耗,直接用SQL一次性统计所有州的数量更高效:
global $wpdb; // 定义州选项列表 $states = array('Alabama', 'California', 'Colorado'); // 转义参数,防止SQL注入 $escaped_states = array_map(array($wpdb, 'esc_like'), $states); $placeholders = implode(', ', array_fill(0, count($escaped_states), '%s')); // 执行查询 $result = $wpdb->get_results($wpdb->prepare( "SELECT meta_value as state, COUNT(post_id) as count FROM $wpdb->postmeta JOIN $wpdb->posts ON $wpdb->postmeta.post_id = $wpdb->posts.ID WHERE meta_key = 'store_state' AND meta_value IN ($placeholders) AND $wpdb->posts.post_type = 'stores' AND $wpdb->posts.post_status = 'publish' GROUP BY meta_value", $escaped_states ), ARRAY_A); // 整理结果,确保所有州都显示(即使数量为0) $state_counts = array_fill_keys($states, 0); foreach ($result as $row) { if (isset($state_counts[$row['state']])) { $state_counts[$row['state']] = $row['count']; } } // 输出格式 echo '<ul>'; foreach ($state_counts as $state => $count) { echo '<li>' . esc_html($state) . ' (' . esc_html($count) . ') Stores</li>'; } echo '</ul>';
注意事项
- 确认ACF字段
store_state存储的是选项文本(如Alabama),如果你的ACF设置的是「值+标签」模式(比如值是AL,标签是Alabama),需要把代码中的$state替换为对应的字段值。 - 方案二的性能远优于方案一,数据量越大差距越明显。
内容的提问来源于stack exchange,提问作者user1177437
相关产品推荐
相关产品推荐

