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

WordPress中从同一列获取不同条件值并在循环中输出的SQL实现问题

解决WordPress中同一订单获取多个meta字段的问题

我来帮你搞定这个问题!你当前的SQL语句存在核心逻辑错误:同一行的meta_key不可能同时等于两个不同的值,这就是你无法得到预期结果的根本原因。下面给你两种可行的解决方案,适配不同的场景:

方案一:两次关联wp_postmeta表(推荐,结构清晰)

这种方法通过两次JOIN操作,分别获取billing_field_739和billing_field_267的值,把它们放到同一行结果中:

global $wpdb;
// 使用$wpdb->prefix适配不同的表前缀,避免硬编码
$table_prefix = $wpdb->prefix;

$result = $wpdb->get_results("
    SELECT 
        pm1.meta_value AS billing_739,
        pm2.meta_value AS billing_267,
        os.order_id
    FROM {$table_prefix}wc_order_stats os
    INNER JOIN {$table_prefix}postmeta pm1 
        ON os.order_id = pm1.post_id 
        AND pm1.meta_key = 'billing_field_739'
    INNER JOIN {$table_prefix}postmeta pm2 
        ON os.order_id = pm2.post_id 
        AND pm2.meta_key = 'billing_field_267'
    WHERE 
        os.date_created >= CAST('2022-01-01' AS DATE) 
        AND os.date_created <= CAST('2022-05-01' AS DATE)
");

foreach($result as $row ) { ?> 
<tr> 
    <td><?php echo esc_html($row->billing_739);?></td> <!-- billing_field_739的值 -->
    <td><?php echo esc_html($row->billing_267);?></td> <!-- billing_field_267的值 -->
</tr> 
<?php } ?>

说明:

  • 我们以wp_wc_order_stats为主表,分别关联两次wp_postmeta,每次关联对应一个目标meta_key
  • 给两个meta_value起了别名billing_739和billing_267,方便在循环中直接调用
  • 加入esc_html()函数防止XSS攻击,这是WordPress开发的最佳实践

方案二:使用条件聚合(适合只需要这两个字段的场景)

如果你的需求只是获取这两个字段的值,也可以用CASE WHEN进行条件聚合,把同订单的两个字段值合并到一行:

global $wpdb;
$table_prefix = $wpdb->prefix;

$result = $wpdb->get_results("
    SELECT 
        os.order_id,
        MAX(CASE WHEN pm.meta_key = 'billing_field_739' THEN pm.meta_value END) AS billing_739,
        MAX(CASE WHEN pm.meta_key = 'billing_field_267' THEN pm.meta_value END) AS billing_267
    FROM {$table_prefix}wc_order_stats os
    INNER JOIN {$table_prefix}postmeta pm 
        ON os.order_id = pm.post_id 
        AND pm.meta_key IN ('billing_field_739', 'billing_field_267')
    WHERE 
        os.date_created >= CAST('2022-01-01' AS DATE) 
        AND os.date_created <= CAST('2022-05-01' AS DATE)
    GROUP BY os.order_id
");

foreach($result as $row ) { ?> 
<tr> 
    <td><?php echo esc_html($row->billing_739);?></td>
    <td><?php echo esc_html($row->billing_267);?></td>
</tr> 
<?php } ?>

说明:

  • 用IN筛选出需要的两个meta_key,然后通过CASE WHEN分别提取对应的值,再用MAX()聚合(因为同订单同meta_key只会有一条记录,MAX不影响结果)
  • 按order_id分组,确保每个订单只返回一行结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 22:32:30