WooCommerce商品指定时段销量统计PHP代码异常排查求助
问题排查:WooCommerce销量统计PHP代码返回空值
问题背景
开发用于统计WooCommerce指定时段商品销量的函数,目标是向Google Merchant提交准确数据。在phpMyAdmin中执行MySQL查询可正常返回结果28,但转为PHP代码后始终返回空值。
原可正常运行的SQL语句
SELECT COUNT(product_id) FROM wp_wc_order_product_lookup WHERE product_id = 4098995 AND date_created < '2025-02-11' AND date_created > '2017-02-11' LIMIT 50
问题代码中的核心错误
1. $wpdb->prepare 用法完全错误
SQL语句中未使用任何占位符(如%d、%s),却向prepare方法传递了$product_id、$date_from、$date_to三个参数,导致prepare执行失败,生成无效SQL,最终get_var返回空值。
2. 自定义表名调用错误
$wpdb->wp_wc_order_product_lookup是错误写法,$wpdb的属性仅适用于WordPress默认表(如$wpdb->posts、$wpdb->postmeta)。WooCommerce自定义表需用$wpdb->prefix拼接表名,兼容不同数据库前缀设置。
3. 日期变量逻辑颠倒且未复用
代码中定义了$date_to(过去日期)和$date_from(当前日期),但SQL中硬编码了固定日期,未使用变量;同时统计逻辑应为过去到当前的销量,对应date_created >= $date_to且date_created <= $date_from。
4. 硬编码值覆盖动态变量
先通过SKU查询获取$product_id,随后用$product_id = 4098995硬编码覆盖,导致动态获取的ID无效;SQL中直接写死日期,未复用已定义的日期变量。
修复后的完整代码
global $wpdb; // 假设$sku和$sex为已定义的变量 $sku = $sku . $sex; // 通过SKU获取商品ID $product_id = $wpdb->get_var( $wpdb->prepare( "SELECT post_id FROM {$wpdb->postmeta} WHERE meta_key='_sku' AND meta_value=%s LIMIT 1", $sku ) ); // 定义统计时段:最近96个月到今天 $date_to = date("Y-m-d", strtotime('-96 months')); $date_from = date("Y-m-d"); // 获取WooCommerce内置总销量(用于对比) $total_sales = get_post_meta($product_id, 'total_sales', true); echo "总销量 ". $total_sales . " | 商品ID ". $product_id. " | 统计时段:". $date_to . " 至 ". $date_from; // 正确的时段销量统计查询 $sales_count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(product_id) FROM {$wpdb->prefix}wc_order_product_lookup WHERE product_id = %d AND date_created >= %s AND date_created <= %s", $product_id, $date_to, $date_from ) ); echo " 时段销量统计:" . $sales_count;
验证建议
- 开启WordPress调试模式(在
wp-config.php中设置define('WP_DEBUG', true);),查看数据库错误提示 - 用
echo $wpdb->last_query;打印最终生成的SQL语句,复制到phpMyAdmin中执行,验证语句正确性
内容的提问来源于stack exchange,提问作者Vito Santimone
相关产品推荐
相关产品推荐

