Я использую этот маленький код кода в 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 , я не могу быть абсолютно уверен. Надеюсь, это сработает.