获取指定商品ID最新购买日期的WooCommerce查询函数报错求助
获取WooCommerce指定商品最新购买日期的修正方案
原代码存在的问题
- 无效查询参数:WC_Order_Query不支持直接传入
product_id参数,无法正确筛选包含指定商品的订单。 - 错误的订单对象处理:
get_orders()返回的是WC_Order对象数组,而非订单ID,原代码中调用wc_get_order($order_id)会因为参数类型错误导致报错。 - 过时的日期调用方式:
$order->order_date是WooCommerce旧版本的属性,3.0+版本应使用官方提供的日期方法,直接调用会出现未定义属性或返回非预期值的问题。 - 性能冗余:
posts_per_page => -1会加载所有符合条件的订单,完全没必要——我们只需要最新的一条。
修正后的代码
function check_date_purchased($product_id){ $args = array( 'limit' => 1, // 仅获取最新1条订单,提升查询效率 'line_items' => array( array( 'product_id' => $product_id, // 精准筛选包含目标商品的订单 ), ), 'orderby' => 'date', 'order' => 'DESC', 'status' => 'completed', ); $query = new WC_Order_Query( $args ); $orders = $query->get_orders(); if ( ! empty( $orders ) ) { $latest_order = reset( $orders ); // 返回格式化的订单完成日期,若需订单创建日期可替换为get_date_created() return $latest_order->get_date_completed()->format( 'Y-m-d H:i:s' ); } return false; } echo check_date_purchased( 8070 );
关键改进说明
- 用
line_items参数替代无效的product_id,实现精准筛选包含指定商品的订单。 - 设置
limit => 1减少数据库查询量,直接获取最新订单,避免不必要的循环遍历。 - 直接使用
get_orders()返回的WC_Order对象,省略冗余的wc_get_order()调用。 - 使用
get_date_completed()->format()获取标准格式的日期字符串,适配WooCommerce新版本API规范。 - 简化逻辑,通过
reset($orders)直接提取最新订单,无需嵌套循环判断商品ID。
内容的提问来源于stack exchange,提问作者chedlywalid
相关产品推荐
相关产品推荐

