Ответ 1
Самое точное, эффективное и легкое решение (для WooCommerce 3 и выше) - 2019
Этот фильтр-хук находится в:
WC_Order
Класс внутриpayment_complete()
метода, который используется всеми способами оплаты, когда требуется оплата при оформлении заказа.WC_Order_Data_Store_CPT
Класс внутри методаupdate()
.
Как видите, по умолчанию разрешенные статусы оплаченного заказа являются "обработка" и "завершено".
Пояснения:
Lightweight и effective:
Поскольку это фильтр-хук,
woocommerce_payment_complete_order_status
срабатывает только тогда, когда требуется онлайн-платеж (не для способов оплаты "чеком", "bacs" или "cod"). Здесь мы просто изменим разрешенные статусы платных заказов.Поэтому нет необходимости добавлять условия для платежных шлюзов или чего-либо еще.
Accurate (avoid multiple notifications):
Это единственный способ избежать одновременной отправки 2 разных уведомлений клиентов:
• Один для "обработки" статуса заказов
• И один для статуса "выполненных" заказов.Таким образом, клиент получает уведомление только один раз о "выполненном" статусе заказа.
Используя приведенный ниже код, просто измените статус оплаченного заказа (который устанавливается платежным шлюзом для оплаченных заказов) на "выполнено":
add_action( 'woocommerce_payment_complete_order_status', 'wc_auto_complete_paid_order', 10, 3 );
function wc_auto_complete_paid_order( $status, $order_id, $order ) {
return 'completed';
}
Код помещается в файл function.php активной дочерней темы (или активной темы).
Связанный: WooCommerce:автозаполнение оплаченных заказов в зависимости от способа доставки
2018 - улучшенная версия (для WooCommerce 3 и выше)
Основываясь на официальном хуке Woocommerce, я нашел решение этой проблемы * (Работает с WC 3+).
В Woocommerce для всех других платежных шлюзов, кроме bacs
(Банковский перевод), cheque
и cod
(Наложенный платеж), статусы оплаченного заказа "обрабатываются" и "выполнены".
Поэтому я нацеливаюсь на статус "обработки" заказа для всех платежных шлюзов, таких как Paypal или оплата кредитной картой, обновляя статус заказа для завершения.
Код:
add_action( 'woocommerce_thankyou', 'wc_auto_complete_paid_order', 20, 1 );
function wc_auto_complete_paid_order( $order_id ) {
if ( ! $order_id )
return;
// Get an instance of the WC_Product object
$order = wc_get_order( $order_id );
// No updated status for orders delivered with Bank wire, Cash on delivery and Cheque payment methods.
if ( in_array( $order->get_payment_method(), array( 'bacs', 'cod', 'cheque', '' ) ) ) {
return;
}
// For paid Orders with all others payment methods (paid order status "processing")
elseif( $order->has_status('processing') ) {
$order->update_status( 'completed' );
}
}
Код помещается в файл function.php активной дочерней темы (или активной темы).
Оригинальный ответ (для всех версий 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 ( ( 'bacs' == get_post_meta($order_id, '_payment_method', true) ) || ( 'cod' == get_post_meta($order_id, '_payment_method', true) ) || ( 'cheque' == get_post_meta($order_id, '_payment_method', true) ) ) {
return;
}
// For paid Orders with all others payment methods (with paid status "processing")
elseif( $order->get_status() === 'processing' ) {
$order->update_status( 'completed' );
}
}
Код помещается в файл function.php активной дочерней темы (или активной темы).
С помощью этого поста: Как проверить способ оплаты заказа WooCommerce по идентификатору?
с этим: get_post_meta( $order_id, '_payment_method', true );
из helgatheviking
Банковский перевод, Оплата наложенным платежом и способы оплаты чека игнорируются и сохраняют свой первоначальный статус заказа.
Обновлен код для совместимости с WC 3. 0+ (2017-06-10)