Автоматическая обработка заказов на основе их общей суммы в Woocommerce 3 - PullRequest
0 голосов
/ 01 октября 2018

В 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 голосов
/ 02 октября 2018

Вместо использования init, вы должны попытаться использовать одну из следующих функций, которая автоматически завершит обработку заказов , общая сумма которых меньше $ 50 (например) :

1) Использование woocommerce_order_status_processing action hook (лучший выбор) :

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

Код входит в функцию.php файл вашей активной дочерней темы (active theme).Протестировано и работает.


2) Использование woocommerce_thankyou action hook (хорошая альтернатива, если ваши заказы всегда находятся в состоянии обработки) :

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 вашей активной дочерней темы (active theme).Проверено и работает.


3) Массовое обновление заказов на обработку на основе общей суммы (2 варианта) :

A) Самый легкий и эффективный способс прямым запросом SQL с использованием init hook (лучший способ) :

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 hook ( Очень тяжелый , но более совместимый с будущей структурой базы данныхизменения в 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: автоматическое заполнение оплаченных заказов (в зависимости от способов оплаты)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...