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); }
修复细节说明
- 修正SQL语法:把第二个
WHERE替换成AND,确保SQL语句结构合法。 - 调整时间筛选逻辑:用
posts.post_date >= DATE_SUB(NOW(), INTERVAL 4 HOUR)精准匹配最近4小时内的订单,NOW()包含完整的日期和时间,和post_date的类型完全适配。 - 添加安全防护:使用WordPress内置的
$wpdb->prepare()方法配合占位符处理变量,既避免了SQL注入风险,也符合WordPress数据库操作的规范。
内容的提问来源于stack exchange,提问作者Eduardo Rafael
相关产品推荐
相关产品推荐

