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

WordPress中获取4小时内WooCommerce订单的代码问题排查

WooCommerce订单筛选代码修复方案

你犯的几个关键错误

  • SQL语法错误:一条SQL语句只能有一个WHERE开头,你重复写了两个WHERE,直接导致数据库无法解析这条语句。
  • 时间条件逻辑错误:你要筛选0-4小时内的订单,应该是下单时间大于等于当前时间减4小时,而不是小于;另外CURDATE()只返回日期(比如2024-05-20),不带时分秒,和post_date的datetime类型(2024-05-20 14:30:00)匹配会出错,得用NOW()获取完整的当前时间。
  • 存在SQL注入风险:直接把变量拼进SQL语句里,万一产品ID或订单状态是恶意输入,会带来安全隐患。

修复后的完整代码

function get_orders_ids_by_product_id( $product_id, $order_status = ['wc-completed', 'wc-processing'] ){
    global $wpdb;
    
    // 为订单状态生成对应数量的SQL占位符
    $status_placeholders = implode(', ', array_fill(0, count($order_status), '%s'));
    
    $results = $wpdb->get_col($wpdb->prepare("
        SELECT order_items.order_id
        FROM {$wpdb->prefix}woocommerce_order_items as order_items
        LEFT JOIN {$wpdb->prefix}woocommerce_order_itemmeta as order_item_meta ON order_items.order_item_id = order_item_meta.order_item_id
        LEFT JOIN {$wpdb->posts} AS posts ON order_items.order_id = posts.ID
        WHERE posts.post_type = 'shop_order'
        AND posts.post_status IN ($status_placeholders)
        AND order_items.order_item_type = 'line_item'
        AND order_item_meta.meta_key = '_product_id'
        AND order_item_meta.meta_value = %d
        AND posts.post_date >= DATE_SUB(NOW(), INTERVAL 4 HOUR)
    ", array_merge($order_status, [$product_id])));
    
    return count($results);
}

修复细节说明

  1. 修正SQL语法:把第二个WHERE替换成AND,确保SQL语句结构合法。
  2. 调整时间筛选逻辑:用posts.post_date >= DATE_SUB(NOW(), INTERVAL 4 HOUR)精准匹配最近4小时内的订单,NOW()包含完整的日期和时间,和post_date的类型完全适配。
  3. 添加安全防护:使用WordPress内置的$wpdb->prepare()方法配合占位符处理变量,既避免了SQL注入风险,也符合WordPress数据库操作的规范。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.21 04:36:04