在WooCommerce付款后立即更改订单状态[重复]

问题描述 投票:8回答:2

这个问题在这里已有答案:

我需要在收到付款后自动更改已完成的订单状态,但前提是订单状态为“正在处理”。我发现了代码片段,在每种情况下都会使订单状态完成,但是我的付款插件在成功付款更改后会返回数据并更改“处理”的订单状态。我想在成功后将其更改为“已完成”,如果状态不是“处理”,则不要更改它。我遇到的主要问题是我不知道如何获得收到的状态订单。

这是我的代码:

add_filter( 'woocommerce_thankyou', 'update_order_status', 10, 2 );

function update_order_status( $order_id ) {
   $order = new WC_Order( $order_id );
   $order_status = $order->get_status();    
   if ('processing' == $order_status) {    
       $order->update_status( 'completed' );    
    }    
 //return $order_status;
}

编辑:

我已经弄清楚了。这是适用于我的代码:

add_filter( 'woocommerce_thankyou', 'update_order_status', 10, 1 );

function update_order_status( $order_id ) {
  if ( !$order_id ){
    return;
  }
  $order = new WC_Order( $order_id );
  if ( 'processing' == $order->status) {
    $order->update_status( 'completed' );
  }
  return;
}
php wordpress woocommerce payment-gateway orders
2个回答
9
投票

更新2 - 2019年:使用WooCommerce: Auto complete paid orders(更新的主题)

所以使用的右钩子是woocommerce_payment_complete_order_status过滤器返回完成


更新1:与WooCommerce版本3+的兼容性

我改变了答案

基于:WooCommerce - Auto Complete paid virtual Orders (depending on Payment methods),您还可以处理条件中的所有付款方式:

// => not a filter (an action hook)
add_action( 'woocommerce_thankyou', 'custom_woocommerce_auto_complete_paid_order', 10, 1 );
function custom_woocommerce_auto_complete_paid_order( $order_id ) {
    if ( ! $order_id )
        return;

    $order = new WC_Order( $order_id );

    // No updated status for orders delivered with Bank wire, Cash on delivery and Cheque payment methods.
    if ( get_post_meta($order_id, '_payment_method', true) == 'bacs' || get_post_meta($order_id, '_payment_method', true) == 'cod' || get_post_meta($order_id, '_payment_method', true) == 'cheque' ) {
        return;
     }
    // "completed" updated status for paid "processing" Orders (with all others payment methods)
    elseif ( $order->has_status( 'processing' ) ) {
        $order->update_status( 'completed' );
    }
    else {
        return;
    }
}

4
投票

函数woocommerce_thankyou是一个动作。你需要使用add_action函数来挂钩它。我建议将优先级更改为20,以便在update_order_status之前应用其他插件/代码更改。

add_action( 'woocommerce_thankyou', 'update_order_status', 20);
© www.soinside.com 2019 - 2024. All rights reserved.