WooCommerce HPOS环境下新老客户装箱单消息显示异常的代码问题
解决WooCommerce HPOS下无法识别老客户订单的问题
你的代码问题出在HPOS(高性能订单存储)启用后,订单不再以自定义帖子类型存储在wp_posts表中,原来用get_posts基于post meta的查询方式完全找不到历史订单,所以$customer_orders永远为空,导致所有订单都显示“New Customer”。
下面是适配HPOS的修正代码,使用WooCommerce官方推荐的WC_Order_Query来查询订单,自动兼容HPOS和传统订单存储模式:
function action_wpo_wcpdf_after_document_label( $wpo_wcpdf_export_template_type, $order ) { // 仅在装箱单模板执行 if ('packing-slip' !== $wpo_wcpdf_export_template_type) { return; } $billing_email = $order->get_billing_email(); if (empty($billing_email)) { return; } // 使用WC_Order_Query查询历史订单,兼容HPOS $order_query = new WC_Order_Query(array( 'limit' => -1, 'exclude' => array($order->get_id()), // 排除当前订单 'billing_email'=> $billing_email, // 按账单邮箱筛选 'status' => array_keys(wc_get_order_statuses()), // 包含所有状态的订单 'return' => 'ids', // 只返回订单ID,提升性能 )); $customer_orders = $order_query->get_orders(); // 输出对应标识 $style = 'font-weight: bold;margin-top: -60px;border: 1px solid;width: 90px;padding: 3px 10px 5px 10px;line-height: 1;text-align: center;'; if (empty($customer_orders)) { echo '<p class="form-field form-field-wide" style="' . esc_attr($style) . '">New Customer</p>'; } else { echo '<p class="form-field form-field-wide" style="' . esc_attr($style) . '">Existing Customer</p>'; } } add_action( 'wpo_wcpdf_after_document_label', 'action_wpo_wcpdf_after_document_label', 10, 2 );
关键改动说明:
- 替换
get_posts为WC_Order_Query:这是WooCommerce官方提供的订单查询类,会自动识别当前是否启用HPOS,从正确的数据源获取订单数据 - 使用
billing_email参数直接筛选:无需依赖post meta,查询更精准高效 - 设置
return => 'ids':只返回订单ID数组,比返回完整订单对象更节省资源 - 用
esc_attr()转义样式属性:避免潜在的XSS风险,符合WordPress编码规范
测试时可以分别找新客户(无历史订单)和老客户(有历史订单)的订单生成装箱单,确认标识显示正确。
内容的提问来源于stack exchange,提问作者adem007
相关产品推荐
相关产品推荐

