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

如何统计自定义文章类型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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 20:10:26