【问题标题】:WooCommerce change status for BACS orders based on specific shipping methodsWooCommerce 根据特定的运输方式更改 BACS 订单的状态
【发布时间】:2021-02-01 01:03:59
【问题描述】:

如果选择的支付网关是 BACS,我如何将特定运输方式的订单状态从暂停更改为我自己的自定义状态?

这是我添加自己的自定义状态的方式:

// 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;
}


这个解决方案的灵感来自WooCommerce change BACS order status based on user roles 似乎可行,但它会更改此处未指定的运输方式的订单状态:

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 );

Change Woocommerce Order Status based on Shipping Method 的答案代码也可以,但我想指定几种运输方式。

更新:如果您想在未找到运输方式的情况下包含设置另一个订单状态的逻辑:

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
            }
        }
    }
}

【问题讨论】:

  • 道歉不够具体。我已经更新了我的问题。

标签: php wordpress woocommerce orders shipping-method


【解决方案1】:

改用以下方法(代码已注释):

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
            }
        }
    }
}

代码进入活动子主题(或活动主题)的functions.php 文件中。经过测试并且可以工作。

相关:根据运输方式更改 Woocommerce 订单状态

【讨论】:

  • 这非常有效并且回答了我的问题。非常感谢。我有两个问题... 1) "$updated = false;" 是什么意思服务? 2) 我可以在末尾添加另一个条件,如下所示:else { $order->update_status('pending');}。我基本上希望此代码首先检查运输方式,如果未选择订单将订单状态更改为待处理。
  • 我在这里添加了修改后的代码:stackoverflow.com/questions/64413404/…
  • @WanderlustConsulting 我删除了更新的假...
猜你喜欢
  • 2018-04-27
  • 2021-01-30
  • 2021-02-27
  • 2016-08-04
  • 1970-01-01
  • 2022-10-05
  • 2019-07-26
  • 2021-04-08
  • 2021-10-26
相关资源
最近更新 更多