代码之家  ›  专栏  ›  技术社区  ›  Nacer Chikhi

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

  •  3
  • Nacer Chikhi  · 技术社区  · 9 年前

    我在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 回复  |  直到 7 年前
        1
  •  5
  •   Community Mohan Dere    5 年前

    要使其工作,您只需要一个小函数,它将扫描“init”钩子上具有“processing”状态的所有订单,并将此状态更新为“completed”。

    这是代码:

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

    此代码经过测试并正常工作。

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

    建议及;更新

    围绕 电子邮件通知发送两次 那就是 在这里解决 :
    Avoid repetitive emails notification on some auto completed orders

        2
  •  0
  •   Hardik Kalathiya    9 年前

    WooCommerce虚拟订单可以在支付后自动标记为完成,只需向自定义插件或主题功能添加一点代码。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。

    推荐文章