根据不同的运输方式更改 Woocommerce 订单状态
Change Woocommerce Order Status based on different Shipping Methods
我正在使用 代码,它非常适合根据送货方式字符串在 WooCommerce 中重新分配我的自定义订单状态“awaiting-pickup”。
这是我的代码:
add_action( 'woocommerce_thankyou', 'shipping_method_update_order_status', 10, 1 );
function shipping_method_update_order_status( $order_id ) {
if ( ! $order_id ) return;
$search = 'local_pickup'; // The needle to search in the shipping method ID
// Get an instance of the WC_Order object
$order = wc_get_order( $order_id );
// Get the WC_Order_Item_Shipping object data
foreach($order->get_shipping_methods() as $shipping_item ){
// When "pickup" method is used, we change the order to "awaiting-pickup" status
if( strpos( $shipping_item->get_method_title(), $search ) !== false ){
$order->update_status('awaiting-pickup');
$order->save();
break;
}
}
}
我需要帮助扩展它以应用一些基于其他运输方式的不同规则,例如 'free_shipping' 和 'flat_rate',我也想将其重新分配为 'awaiting-delivery'。
$search = 'flat_rate' OR 'free_shipping';
$order->update_status('awaiting-delivery');
运输实例的结构如下:
'local_pickup:2'
'local_pickup:5'
'local_pickup:7'
'local_pickup:10'
'flat_rate:3'
'flat_rate:6'
'flat_rate:9'
'free_shipping:11'
'free_shipping:12'
'free_shipping:13'
每次我创建一个新的运输区域时,附加到该区域的额外运输实例都会有新的编号附加到方法类型。最终我需要一些使用以下逻辑的东西:
IF 'local_pickup' IN string
THEN $order->update_status('awaiting-pickup');
ELSEIF 'flat_rate' OR 'free_shipping' IN string
THEN $order->update_status('awaiting-delivery');
END
更新 2
由于您在此处使用的是真实的运输方式 ID,因此无需搜索字符串。那么让它适用于多种运输方式Id会更简单,如下所示:
add_action( 'woocommerce_thankyou', 'shipping_method_update_order_status', 10, 1 );
function shipping_method_update_order_status( $order_id ) {
if ( ! $order_id ) return;
// Here define your shipping methods Ids
$shipping_methods_ids_1 = array('local_pickup');
$shipping_methods_ids_2 = array('flat_rate', 'free_shipping');
// Get an instance of the WC_Order object
$order = wc_get_order( $order_id );
// Get the WC_Order_Item_Shipping object data
foreach($order->get_shipping_methods() as $shipping_item ){
// For testing to check the shipping method slug (uncomment the line below):
// echo '<pre>'. print_r( $shipping_item->get_method_id(), true ) . '</pre>';
// When "Local pickup" method is used, we change the order to "awaiting-pickup" status
if( in_array( $shipping_item->get_method_id(), $shipping_methods_ids_1 ) && ! $order->has_status('awaiting-pickup') ){
$order->update_status('awaiting-pickup'); // Already use internally save() method
break; // stop the loop
}
// When 'Flat rate' or 'Free shipping' methods are used, we change the order to "awaiting-delivery" status
elseif( in_array( $shipping_item->get_method_id(), $shipping_methods_ids_2 ) && ! $order->has_status('awaiting-delivery') ){
$order->update_status('awaiting-delivery'); // Already use internally save() method
break; // stop the loop
}
}
}
代码进入活动子主题(或活动主题)的 functions.php 文件。它应该有效。
我正在使用
这是我的代码:
add_action( 'woocommerce_thankyou', 'shipping_method_update_order_status', 10, 1 );
function shipping_method_update_order_status( $order_id ) {
if ( ! $order_id ) return;
$search = 'local_pickup'; // The needle to search in the shipping method ID
// Get an instance of the WC_Order object
$order = wc_get_order( $order_id );
// Get the WC_Order_Item_Shipping object data
foreach($order->get_shipping_methods() as $shipping_item ){
// When "pickup" method is used, we change the order to "awaiting-pickup" status
if( strpos( $shipping_item->get_method_title(), $search ) !== false ){
$order->update_status('awaiting-pickup');
$order->save();
break;
}
}
}
我需要帮助扩展它以应用一些基于其他运输方式的不同规则,例如 'free_shipping' 和 'flat_rate',我也想将其重新分配为 'awaiting-delivery'。
$search = 'flat_rate' OR 'free_shipping';
$order->update_status('awaiting-delivery');
运输实例的结构如下:
'local_pickup:2'
'local_pickup:5'
'local_pickup:7'
'local_pickup:10'
'flat_rate:3'
'flat_rate:6'
'flat_rate:9'
'free_shipping:11'
'free_shipping:12'
'free_shipping:13'
每次我创建一个新的运输区域时,附加到该区域的额外运输实例都会有新的编号附加到方法类型。最终我需要一些使用以下逻辑的东西:
IF 'local_pickup' IN string
THEN $order->update_status('awaiting-pickup');
ELSEIF 'flat_rate' OR 'free_shipping' IN string
THEN $order->update_status('awaiting-delivery');
END
更新 2
由于您在此处使用的是真实的运输方式 ID,因此无需搜索字符串。那么让它适用于多种运输方式Id会更简单,如下所示:
add_action( 'woocommerce_thankyou', 'shipping_method_update_order_status', 10, 1 );
function shipping_method_update_order_status( $order_id ) {
if ( ! $order_id ) return;
// Here define your shipping methods Ids
$shipping_methods_ids_1 = array('local_pickup');
$shipping_methods_ids_2 = array('flat_rate', 'free_shipping');
// Get an instance of the WC_Order object
$order = wc_get_order( $order_id );
// Get the WC_Order_Item_Shipping object data
foreach($order->get_shipping_methods() as $shipping_item ){
// For testing to check the shipping method slug (uncomment the line below):
// echo '<pre>'. print_r( $shipping_item->get_method_id(), true ) . '</pre>';
// When "Local pickup" method is used, we change the order to "awaiting-pickup" status
if( in_array( $shipping_item->get_method_id(), $shipping_methods_ids_1 ) && ! $order->has_status('awaiting-pickup') ){
$order->update_status('awaiting-pickup'); // Already use internally save() method
break; // stop the loop
}
// When 'Flat rate' or 'Free shipping' methods are used, we change the order to "awaiting-delivery" status
elseif( in_array( $shipping_item->get_method_id(), $shipping_methods_ids_2 ) && ! $order->has_status('awaiting-delivery') ){
$order->update_status('awaiting-delivery'); // Already use internally save() method
break; // stop the loop
}
}
}
代码进入活动子主题(或活动主题)的 functions.php 文件。它应该有效。