求助:修复WooCommerce Tiered Pricing Table插件订单追踪代码
修复WooCommerce分层定价插件订单追踪代码
你的代码始终显示“No”的核心问题是判断逻辑错误:原代码仅检查插件的类是否存在(只要插件激活就会返回true),但完全没有验证当前订单的商品是否实际使用了该插件的分层定价规则。
以下是修复后的完整代码:
/* 追踪通过WooCommerce分层定价插件完成的订单 */ function track_purchases_from_tiered_pricing_table($order_id) { // 先检查插件是否激活 if (!class_exists('Tier_Pricing_Table')) { return; } $order = wc_get_order($order_id); $is_tier_pricing_order = false; // 遍历所有订单项 foreach ($order->get_items() as $item) { // 检查订单项是否有插件添加的分层定价标记(插件常用元键) if ($item->get_meta('_tier_pricing_applied', true) || $item->get_meta('_tier_price', true)) { $is_tier_pricing_order = true; break; } // 额外检查:商品本身是否设置了分层定价(防止元数据丢失的情况) $product = $item->get_product(); if ($product && method_exists($product, 'get_tier_pricing')) { $tier_pricing = $product->get_tier_pricing(); if (!empty($tier_pricing)) { // 验证订单中购买的数量是否触发了分层定价 $qty = $item->get_quantity(); foreach ($tier_pricing as $tier) { if ($qty >= $tier['min']) { $is_tier_pricing_order = true; break 2; // 跳出双层循环 } } } } } // 根据判断结果更新订单元数据 update_post_meta($order_id, '_purchased_from_tiered_pricing_table', $is_tier_pricing_order ? 'yes' : 'no'); } add_action('woocommerce_checkout_order_processed', 'track_purchases_from_tiered_pricing_table'); /* 在后台订单详情页显示分层定价插件购买标记 */ function display_purchased_from_tiered_pricing_table_info($order) { $status = get_post_meta($order->get_id(), '_purchased_from_tiered_pricing_table', true); $display_text = $status === 'yes' ? 'Yes' : 'No'; echo '<p><strong>是否通过分层定价插件购买:</strong>' . esc_html($display_text) . '</p>'; } add_action('woocommerce_admin_order_data_after_billing_address', 'display_purchased_from_tiered_pricing_table_info');
关键修改说明:
- 修正判断逻辑:不再仅凭插件是否激活就标记订单,而是检查订单项的元数据(
_tier_pricing_applied或_tier_price是该插件默认添加的标记),确保订单确实使用了分层定价。 - 增加双重验证:额外检查商品本身的分层定价规则,结合购买数量判断是否触发了优惠,避免因元数据丢失导致的误判。
- 优化数据安全:使用
esc_html()处理输出内容,符合WordPress安全规范。 - 明确状态标记:无论是否使用插件,都会更新订单元数据,避免默认值为空导致的显示错误。
内容的提问来源于stack exchange,提问作者MohsenJames Amra
相关产品推荐
相关产品推荐

