Я использую 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».
Поэтому мне нужно будет отсканировать все заказы обработки, чтобы передать их в полный статус. Я пробовал разные вещи и крючки, но я не могу заставить его работать, как ожидалось.
Как я могу это сделать?
благодаря
Чтобы получить эту работу, вам просто нужна небольшая функция, которая сканирует все заказы с статусом «обработка» на крюке «init» и обновит этот статус до «завершено».
Вот этот код:
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' );
Этот код проверен и работает.
Код идет в файле function.php вашей активной дочерней темы (или темы). Или также в любых плагинах php-файлов.
СОВЕТЫ И ОБНОВЛЕНИЕ
Существует небольшая ошибка, связанная с уведомлениями по электронной почте, отправленными дважды :
Избегайте повторения уведомлений по электронной почте о некоторых завершенных заказах
Виртуальные заказы WooCommerce могут автоматически маркироваться как «завершенные» после оплаты с небольшим количеством добавленного кода в пользовательский плагин или ваш файл functions.php тем. По умолчанию WooCommerce будет отмечать заказы на виртуальную загрузку как «завершенные» после успешной оплаты, что имеет смысл, но некоторые владельцы магазинов захотят автоматически пометить даже виртуальный заказ как полный после оплаты, например, в случае сайта который берет пожертвования, где не требуется никаких дальнейших действий. Для этого используйте следующий код, который основан на основном статусе заказанного загружаемого виртуального загружаемого файла:
add_filter( 'woocommerce_payment_complete_order_status', 'virtual_order_payment_complete_order_status', 10, 2 ); function virtual_order_payment_complete_order_status( $order_status, $order_id ) { $order = new WC_Order( $order_id ); if ( 'processing' == $order_status && ( 'on-hold' == $order->status || 'pending' == $order->status || 'failed' == $order->status ) ) { $virtual_order = null; if ( count( $order->get_items() ) > 0 ) { foreach( $order->get_items() as $item ) { if ( 'line_item' == $item['type'] ) { $_product = $order->get_product_from_item( $item ); if ( ! $_product->is_virtual() ) { // once we've found one non-virtual product we know we're done, break out of the loop $virtual_order = false; break; } else { $virtual_order = true; } } } } // virtual order, mark as completed if ( $virtual_order ) { return 'completed'; } } // non-virtual order, return original status return $order_status; }
ИЛИ
Вы также можете использовать плагин для автоматического завершения заказа
Вот URL-адрес плагина: https://wordpress.org/plugins/woocommerce-autocomplete-order/screenshots/
Пожалуйста, дайте мне знать, какая польза от вас полна.
Thnaks.