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

Я использую этот маленький код кода в 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 соединяется с методом оплаты «трески», и который может обрабатывать платеж после «woocommerce_thankyou», внешний интерфейс. В этом случае заказы статуса ON HOLD передаются после состояния PROCESSING . Чтобы автоматизировать поведение автозаполнения в этих случаях, я использую этот другой код кода из этого ответа, и он работает:

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

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

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

благодаря

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

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

1) АВТО ЗАПОЛНИТЬ ЗАПЛАНИРОВАННЫЕ ЗАКАЗЫ В WOOCOMMERCE (исходя из способов оплаты)

 add_action( 'woocommerce_thankyou', 'custom_woocommerce_auto_complete_paid_order', 20, 1 ); function custom_woocommerce_auto_complete_paid_order( $order_id ) { if ( ! $order_id ) return; // Getting the $order object from the ID $order = wc_get_order( $order_id ); // Getting the custom meta value regarding this autocomplete status process $order_processed = get_post_meta($order->id, '_order_processed', true); // 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; } else { // We check if order has a status different than completed AND if the custom meta value hasen't been already set if (!$order->has_status( 'completed' ) && $order_processed != 'yes'){ // 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 completed } else { return; } } } 

2) SCAN ALL «обработка» статуса заказов (для их автоматического заполнения).

 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( array( 'numberposts' => -1, 'post_status' => 'wc-processing', ) ); if(!empty($processing_orders)){ foreach($processing_orders as $order) { // 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 , я не могу быть абсолютно уверен. Надеюсь, это сработает.