简体   繁体   English

WooCommerce 根据特定的运输方式更改 BACS 订单的状态

[英]WooCommerce change status for BACS orders based on specific shipping methods

How do I change the order status from on hold to my own custom status for a specific shipping method if the selected payment gateway is BACS?如果选择的支付网关是 BACS,我如何将订单状态从暂停更改为我自己的特定运输方式的自定义状态?

This is how I added my own custom status:这是我添加自己的自定义状态的方式:

// Register New Order Status
 
add_filter( 'woocommerce_register_shop_order_post_statuses', 'register_custom_order_status' );
 
function register_custom_order_status( $order_statuses ){
    
   // Status must start with "wc-"
   $order_statuses['wc-custom-status'] = array(                                 
   'label'                     => _x( 'Calculating Shipping', 'Order status', 'woocommerce' ),
   'public'                    => false,                                 
   'exclude_from_search'       => false,                                 
   'show_in_admin_all_list'    => true,                                 
   'show_in_admin_status_list' => true,                                 
   'label_count'               => _n_noop( 'Calculating Shipping <span class="count">(%s)</span>', 'Calculating Shipping <span class="count">(%s)</span>', 'woocommerce' ),                              
   );      
   return $order_statuses;
}
 

// Show Order Status in the Dropdown @ Single Order and "Bulk Actions" @ Orders
 
add_filter( 'wc_order_statuses', 'show_custom_order_status' );
 
function show_custom_order_status( $order_statuses ) {      
   $order_statuses['wc-custom-status'] = _x( 'Calculating Shipping', 'Order status', 'woocommerce' );       
   return $order_statuses;
}
 
add_filter( 'bulk_actions-edit-shop_order', 'get_custom_order_status_bulk' );
 
function get_custom_order_status_bulk( $bulk_actions ) {
   // Note: "mark_" must be there instead of "wc"
   $bulk_actions['mark_custom-status'] = 'Change status to calculating shipping';
   return $bulk_actions;
}


This solution was inspired by WooCommerce change BACS order status based on user roles seems to work but it changes the order status for shipping methods not specified here:该解决方案的灵感来自WooCommerce 基于用户角色更改 BACS 订单状态似乎有效,但它更改了此处未指定的运输方式的订单状态:

function bacs_order_payment_pending_order_status_shipping_method( $order_id ) {
    // Get $order object
    $order = wc_get_order( $order_id );
    
    // Is a WC_Order
    if ( is_a( $order, 'WC_Order' ) ) {
        // Get shipping method
        $shipping_method = $order->get_shipping_methods();
        
        // Shipping Methods
        $methods = (array) $shipping_method;
        
        // Shipping Methods to check
        $shipping_methods_to_check = array( 'flat_rate', 'request_shipping_quote' );
        
        // Compare
        $compare = array_diff( $methods, $shipping_methods_to_check );
        
        // Result is empty
        if ( empty ( $compare ) ) {
            if ( $order->get_payment_method() == 'bacs' && $order->has_status( 'on-hold' ) ) {
                $order->update_status( 'custom-status' );
            }
        }
    }
}
add_action( 'woocommerce_thankyou', 'bacs_order_payment_pending_order_status_shipping_method', 10, 1 );

The answer code from Change Woocommerce Order Status based on Shipping Method also works but I would like to specify several shipping methods. 基于运输方式更改 Woocommerce 订单状态的答案代码也有效,但我想指定几种运输方式。

UPDATE: In case you want to include logic to set another order status if the shipping methods are not found:更新:如果您想在未找到运输方式的情况下包含设置另一个订单状态的逻辑:

add_action( 'woocommerce_thankyou', 'bacs_order_payment_pending_order_status_shipping_method', 10, 1 );
function bacs_order_payment_pending_order_status_shipping_method( $order_id ) {
    // Get WC_Order object from the order Id
    $order = wc_get_order( $order_id );
    
    // Check that we get a WC_Order
    if ( is_a( $order, 'WC_Order' ) ) {
        // Shipping Methods to check
        $shipping_methods_to_check = array( 'flat_rate', 'request_shipping_quote' );
        
        $condition = $order->get_payment_method() == 'bacs' && $order->has_status( 'on-hold' );

        // Loop through shipping items (objects)
        foreach($order->get_shipping_methods() as $shipping_item ){
            // Check for matched defined shipping methods
            if( in_array( $shipping_item->get_method_id(), $shipping_methods_to_check ) && $condition ){
                $order->update_status( 'custom-status' ); // Change Order Status Custom 
            }
                else {$order->update_status( 'pending' ); // Change Order Status Pending
            }
        }
    }
}

Try the following instead (code is commented):请尝试以下操作(代码已注释):

add_action( 'woocommerce_thankyou', 'bacs_order_payment_pending_order_status_shipping_method', 10, 1 );
function bacs_order_payment_pending_order_status_shipping_method( $order_id ) {
    // Get WC_Order object from the order Id
    $order = wc_get_order( $order_id );
    
    // Check that we get a WC_Order
    if ( is_a( $order, 'WC_Order' ) ) {
        // Shipping Methods to check
        $shipping_methods_to_check = array( 'flat_rate', 'request_shipping_quote' );
        
        $condition = $order->get_payment_method() == 'bacs' && $order->has_status( 'on-hold' );

        // Loop through shipping items (objects)
        foreach($order->get_shipping_methods() as $shipping_item ){
            // Check for matched defined shipping methods
            if( in_array( $shipping_item->get_method_id(), $shipping_methods_to_check ) && $condition ){
                $order->update_status( 'custom-status' ); // Change order status
                return; // Exit
            }
        }
    }
}

Code goes in functions.php file of the active child theme (or active theme).代码位于活动子主题(或活动主题)的 functions.php 文件中。 Tested and works.测试和工作。

related: Change Woocommerce Order Status based on Shipping Method相关:根据运输方式更改 Woocommerce 订单状态

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM