如何根据不同配送、支付方式设置WooCommerce自定义订单状态?
问题原因
- 你代码中第一个
if...else判断无论是否匹配到对应快递配送方式,都会执行break直接跳出循环,后续的自提配送方式判断逻辑完全不会被执行,所以所有订单都会命中第一个判断分支的状态,导致所有选项匹配到同一个自定义状态。 - 逻辑结构错误:不能在未匹配到当前配送方式时就直接设置订单状态并终止执行,应该先匹配到对应配送方式类型后,再结合支付方式设置对应状态。
修复后代码
add_action( 'woocommerce_thankyou', 'express_shipping_update_order_status', 10, 1 ); function express_shipping_update_order_status( $order_id ) { if ( ! $order_id ) return; $search_rm = 'Despacho Express Todo Santiago (Excluye Padre Hurtado. Recibe al siguiente día hábil)'; $search_estoril = 'Retiro en Tienda Estoril'; $search_vina = 'Retiro en Tienda Reñaca'; $order = wc_get_order( $order_id ); $payment_method = $order->get_payment_method(); foreach( $order->get_shipping_methods() as $shipping_item ){ $shipping_title = $shipping_item->get_method_title(); // 匹配快递配送 if( strpos( $shipping_title, $search_rm ) !== false ){ $target_status = $payment_method == "bacs" ? 'check-payment' : 'express-rm'; $order->update_status($target_status); break; } // 匹配Estoril门店自提 elseif( strpos( $shipping_title, $search_estoril ) !== false ){ $target_status = $payment_method == "bacs" ? 'check-payment' : 'retiro-rm'; $order->update_status($target_status); break; } // 匹配Reñaca门店自提 elseif( strpos( $shipping_title, $search_vina ) !== false ){ $target_status = $payment_method == "bacs" ? 'check-payment' : 'retiro-vina'; $order->update_status($target_status); break; } } }
修改说明
- 调整了判断逻辑,只有匹配到对应配送方式后,才会结合支付方式设置对应订单状态,未匹配到当前配送方式时会继续执行后续配送方式的判断。
- 仅在匹配到对应配送方式、完成状态设置后才执行
break跳出循环,避免提前终止逻辑。 - 简化了支付方式判断的写法,可读性更高。
内容的提问来源于stack exchange,提问作者EzzeOnursito
相关产品推荐
相关产品推荐

