根据订单在Woocommerce 3中的总金额自动完成处理订单

时间:2018-10-01 17:06:29

标签: php wordpress woocommerce hook-woocommerce

在Woocommerce中,我试图根据订单的总金额自动完成处理订单。

目前,我有这段代码会自动完成所有处于处理状态的订单:

add_action( 'init', 'auto_update_orders_status_from_processing_to_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' );
}

如何仅对于总金额少于$50 的订单使用此代码?

1 个答案:

答案 0 :(得分:0)

您应该尝试使用以下功能之一,而不是使用init挂钩,该功能将自动完成总金额少于$ 50的处理订单 (例如)

1)使用woocommerce_order_status_processing动作挂钩(最佳选择)

add_action( 'woocommerce_order_status_processing', 'auto_complete_processing_orders_based_on_total', 20, 4 );
function auto_complete_processing_orders_based_on_total( $order_id, $order ){
    // HERE define the max total order amount
    $max_total_limit = 50;

    if ( $order->get_total() < $max_total_limit ) {
        $order->update_status( 'completed' );
    }
}

代码进入您的活动子主题(活动主题)的function.php文件中。经过测试,可以正常工作。


2)使用woocommerce_thankyou动作挂钩(如果您的订单始终处于处理状态,这是一个不错的选择)

add_action( 'woocommerce_thankyou', 'thankyou_auto_complete_processing_orders_based_on_total', 90, 1 );
function thankyou_auto_complete_processing_orders_based_on_total( $order_id ){
    if( ! $order = wc_get_order( $order_id ) ){
        return;
    }

    // HERE define the max total order amount
    $max_total_limit = 50;

    if( $order->has_status('processing') && $order->get_total() < $max_total_limit ){
        $order->update_status( 'completed' );
    }
}

代码进入您的活动子主题(活动主题)的function.php文件中。经过测试,可以正常工作。


3)基于总量(2种可能性)

批量更新处理订单

A)使用init钩子(最佳方法) 进行直接SQL查询的最简便有效的方法

add_action( 'init', 'sql_auto_complete_processing_orders_based_on_total' );
function sql_auto_complete_processing_orders_based_on_total(){
    // HERE define the max total order amount
    $max_total_limit = 50;

    global $wpdb;

    // Very light bulk update direct SQL query 
    $orders_ids = $wpdb->query("
        UPDATE {$wpdb->prefix}posts as a
        JOIN {$wpdb->prefix}postmeta AS b ON a.ID = b.post_id
        SET a.post_status = 'wc-completed'
        WHERE a.post_status = 'wc-processing'
        AND b.meta_key = '_order_total' AND b.meta_value < '$max_total_limit'
    ");
}

代码进入您的活动子主题(活动主题)的function.php文件中。经过测试,可以正常工作。


B)基于您的代码,使用init非常重,但与woocommerce中将来的数据库结构更改更兼容,如果可以的话)发生一天)

add_action( 'init', 'init_thankyou_auto_complete_processing_orders_based_on_total' );
function init_thankyou_auto_complete_processing_orders_based_on_total(){
    // HERE define the max total order amount
    $max_total_limit = 50;

    // Get all processing orders
    $orders = wc_get_orders( array( 'limit' => -1, 'status' => 'processing') );

    if( sizeof($orders) > 0 ) {
        // loop through processing orders
        foreach(  $orders as $order ) {
            if( $order->get_total() < $max_total_limit ) {
                $order->update_status( 'completed' );
            }
        }
    }
}

代码进入您的活动子主题(活动主题)的function.php文件中。经过测试,可以正常工作。


相关:WooCommerce: Auto complete paid Orders (depending on Payment methods)