WooCommerce中所有现有处理订单的自动完成状态

时间:2016-12-08 11:05:25

标签: php wordpress woocommerce hook-woocommerce orders

我在WooCommerce上使用这一点代码from this answer来自动完成付费处理订单:

/**
 * AUTO COMPLETE PAID ORDERS IN WOOCOMMERCE
 */
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 = wc_get_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 Orders with all others payment methods
    else {
        $order->update_status( 'completed' );
    }
} 

但问题是我使用了一个特殊的支付网关,其中API通过'cod'支付方式进行桥接,并且订单有时保持在这个'woocommerce_thankyou'钩子上的暂停状态。

所以我需要一直扫描'处理'命令以将它们传递到完整状态。我尝试了不同的东西和钩子,但我不能按预期工作。

我该怎么做?

由于

2 个答案:

答案 0 :(得分:4)

要实现这一点,您只需要一个能够使用"处理"扫描所有订单的小功能。 ' init'的状态钩子,这会将此状态更新为"已完成"。

以下是代码:

function auto_update_orders_status_from_processing_to_completed(){
    // Get all current "processing" customer orders
    $processing_orders = wc_get_orders( $args = array(
        'numberposts' => -1,
        'post_status' => 'wc-processing',
    ) );
    if(!empty($processing_orders))
        foreach($processing_orders as $order)
            $order->update_status( 'completed' );
}
add_action( 'init', 'auto_update_orders_status_from_processing_to_completed' );

此代码经过测试并有效。

代码进入活动子主题(或主题)的function.php文件。或者也可以在任何插件php文件中。

  

建议&更新

     

发送两次电子邮件通知一个小错误 在此处解决
  Avoid repetitive emails notification on some auto completed orders

答案 1 :(得分:0)

WooCommerce虚拟订单可以在付款后自动标记为“已完成”,只需将一些代码添加到自定义插件或主题functions.php文件中。默认情况下,WooCommerce会在成功付款后将虚拟可下载订单标记为“已完成”,这是有道理的,但某些商店所有者希望能够在付款后自动将虚拟订单标记为已完成,例如在网站的情况下在没有进一步行动的情况下进行捐赠。为此,请使用以下代码,该代码基于核心虚拟可下载的已完成订单状态:

add_filter( 'woocommerce_payment_complete_order_status', 'virtual_order_payment_complete_order_status', 10, 2 );

function virtual_order_payment_complete_order_status( $order_status, $order_id ) {
  $order = new WC_Order( $order_id );

  if ( 'processing' == $order_status &&
       ( 'on-hold' == $order->status || 'pending' == $order->status || 'failed' == $order->status ) ) {

    $virtual_order = null;

    if ( count( $order->get_items() ) > 0 ) {

      foreach( $order->get_items() as $item ) {

        if ( 'line_item' == $item['type'] ) {

          $_product = $order->get_product_from_item( $item );

          if ( ! $_product->is_virtual() ) {
            // once we've found one non-virtual product we know we're done, break out of the loop
            $virtual_order = false;
            break;
          } else {
            $virtual_order = true;
          }
        }
      }
    }

    // virtual order, mark as completed
    if ( $virtual_order ) {
      return 'completed';
    }
  }

  // non-virtual order, return original status
  return $order_status;
}

您还可以使用插件进行自动完成订单

以下是插件网址:https://wordpress.org/plugins/woocommerce-autocomplete-order/screenshots/

请让我知道哪些是充分使用的。

Thnaks。