WooCommerce 虚拟产品 - 付款后自动完成订单

问题描述 投票:0回答:1

我有虚拟产品,我希望它们在购买时自动完成。

我发现下面粘贴的代码,将其添加到functions.php中,它确实有效,但有一个警告:
当人们选择通过银行转账付款时(是的,他们仍然这样做......),订单将被设置为暂停(或者可能是待付款,不确定,开发商用意大利语设置)。在这些情况下,应在收到付款后手动更新订单,然后才能完成订单。

然而,当用户登陆“感谢”页面时,下面的代码将每个订单设置为完整,这显然在这些情况下不起作用。

有什么想法吗? 我该如何解决这个问题?

我的代码:

add_action('woocommerce_thankyou', 'wpd_autocomplete_virtual_orders', 10, 1 );
function wpd_autocomplete_virtual_orders( $order_id ) {
  
    if( ! $order_id ) return;
  
    // Get order
    $order = wc_get_order( $order_id );
  
    // get order items = each product in the order
    $items = $order->get_items();
  
    // Set variable
    $only_virtual = true;
  
    foreach ( $items as $item ) {
          
        // Get product object
        if ( isset($item['variation_id']) && ! empty($item['variation_id']) ) {
 
            $product = wc_get_product( $item['variation_id'] );
 
        } else {
 
            $product = wc_get_product( $item['product_id'] );
 
        }
 
        // Safety check
        if ( ! is_object($product) ) {
 
            return false;
 
        }
                 
        // Is virtual
        $is_virtual = $product->is_virtual();
  
        // Is_downloadable
        $is_downloadable = $product->is_downloadable();
  
        if ( ! $is_virtual && ! $is_downloadable  ) {
  
            $only_virtual = false;
  
        }
  
    }
  
    // true
    if ( $only_virtual ) {
  
        $order->update_status( 'completed' );
  
    }
 
}

简而言之:我尝试使用一些代码,但它没有按预期工作。如果您能就如何修改代码提出建议,我将不胜感激。

php wordpress woocommerce orders status
1个回答
0
投票

基于 WooCommerce:自动完成付款订单,请尝试以下操作,如果所有商品都是虚拟的,将自动完成付款订单(但没有银行转帐订单)

// Conditional function that check if order items are all virtual
function only_virtual_order_items( $order ) {
    $only_virtual_items = true; // Initializing

    // Loop through order items
    foreach( $order->get_items() as $item ) {
        $product = $item->get_product();
        // Check if there are items that are not virtual
        if ( ! ( $product->is_virtual() || $product->is_downloadable() ) ) {
            $only_virtual_items = false;
            break;
        }
    }
    return $only_virtual_items;
}

// Autocomplete paid orders
add_filter( 'woocommerce_payment_complete_order_status', 'wc_auto_complete_paid_order', 10, 3 );
function wc_auto_complete_paid_order( $status, $order_id, $order ) {
    // Check if all items are virtual
    if ( only_virtual_order_items( $order ) ) {
        $status = 'completed'; 
    }
    return $status;
}

如果您想自动完成 COD(货到付款订单),也请使用以下命令:

add_action( 'woocommerce_cod_process_payment_order_status', 'wc_auto_complete_cod_order', 10, 2 );
function wc_auto_complete_cod_order( $status, $order ) {
    // Check if all items are virtual
    if ( only_virtual_order_items( $order ) ) {
        $status = 'completed'; 
    }
    return $status;
}

代码位于子主题的functions.php 文件中(或插件中)。已测试并有效。

© www.soinside.com 2019 - 2024. All rights reserved.