Избегайте повторяющихся уведомлений по электронной почте о некоторых автоматически выполненных заказах

Я использую этот небольшой кусочек кода в WooCommerce из этого ответа для автозаполнения платных обработка заказов на основе платежных шлюзов:

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

Это работает в основном идеально

В основном используется специальный платежный шлюз по SMS, API которого соединен с методом оплаты «cod» и который может обрабатывать платеж после «woocommerce_thankyou» на внешнем интерфейсе. В этом случае заказы со статусом В ОЖИДАНИИ впоследствии переходят в статус ОБРАБОТКА. Чтобы автоматизировать поведение автозаполнения в этих случаях, я использую этот другой фрагмент кода из этого ответа и это работает:

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

ПРОБЛЕМА. Я получаю повторяющиеся электронные письма о новых выполненных заказах.

Как я могу избежать повторяющихся случаев получения уведомлений по электронной почте?

Спасибо


person Nacer Chikhi    schedule 10.12.2016    source источник


Ответы (1)


Обновлено (2019 г.)

Добавлен код версии для Woocommerce 3+ - Добавлена ​​совместимость версий Woocommerce.

Чтобы избежать этого странного факта повторяющихся уведомлений по электронной почте, можно создать собственный мета-ключ / значение для каждого обработанного заказа при изменении статуса заказа на завершенный, используя WordPress update_post_meta(). Затем мы проверим предварительно в условии, существует ли этот настраиваемый ключ / значение метаданных с get_post_meta() для каждого обработанного заказа.

Итак, ваши два фрагмента кода теперь будут такими:

1) АВТОМАТИЧЕСКОЕ ЗАВЕРШЕНИЕ ОПЛАТЫХ ЗАКАЗОВ В WOOCOMMERCE (обновление 2019 г.)

Для woocommerce 3+:

add_action( 'woocommerce_payment_complete_order_status', 'wc_auto_complete_paid_order', 10, 3 );
function wc_auto_complete_paid_order( $status, $order_id, $order ) {
    if ( ! $order->has_status('completed') && $order->get_meta('_order_processed') != 'yes') {
        $order->update_meta_data('_order_processed', 'yes');
        $status = 'completed';
    }
    return $status;
}

Для всех версий woocommerce (совместимость с версии 2.5+):

add_action( 'woocommerce_payment_complete_order_status', 'wc_auto_complete_paid_order', 10, 3 );
function wc_auto_complete_paid_order( $status, $order_id, $order = null ) {
    // Getting the custom meta value regarding this autocomplete status process
    $order_processed = get_post_meta( $order_id, '_order_processed', true );

    // Getting the WC_Order object from the order ID
    $order = wc_get_order( $order_id );

    if ( ! $order->has_status( 'completed' ) && $order_processed != 'yes' ) {
        $order = wc_get_order( $order_id );

        // setting the custom meta data value to yes (order updated)
        update_post_meta($order_id, '_order_processed', 'yes');
        $order->update_status( 'completed' ); // Update order status to 
    }
    return $status;
}

2) СКАНИРОВАТЬ ВСЕ «обрабатываемые» заказы для их автозаполнения (добавлена ​​совместимость с Woocommerce)

add_action( 'init', 'auto_update_orders_status_from_processing_to_completed' );
function auto_update_orders_status_from_processing_to_completed(){
    if( version_compare( WC_VERSION, '3.0', '<' ) {
        $args = array('numberposts' => -1, 'post_status' => 'wc-processing'); // Before WooCommerce version 3
    } else {
        $args = array('limit' => -1, 'status' => 'processing'); // For WooCommerce 3 and above
    }

    // Get all current "processing" customer orders
    $processing_orders = (array) wc_get_orders( $args );

    if( sizeof($processing_orders) > 0 ){
        foreach($processing_orders as $order ) {
            // Woocommerce compatibility
            $order_id = method_exists( $order, 'get_id' ) ? $order->get_id() : $order->id;

            // Checking if this custom field value is set in the order meta data
            $order_processed = get_post_meta( $order_id, '_order_processed', true );
            if (! $order->has_status( 'completed' ) && $order_processed != 'yes' ) {
                // Setting (updating) custom meta value in the order metadata to avoid repetitions
                update_post_meta( $order_id, '_order_processed', 'yes' );
                $order->update_status( 'completed' ); // Updating order status
            }
        }
    }
}

Код находится в файле function.php вашей активной дочерней темы (или темы). Или также в любых php-файлах плагинов.

Я проверил этот код, и он должен работать для вас (из-за вашего метода параллельной оплаты по SMS)

person LoicTheAztec    schedule 10.12.2016
comment
еще раз спасибо Loïc, он работает отлично, хорошего дня, чувак (у) - person Nacer Chikhi; 10.12.2016