WooCommerce изменить статус заказа Обработка BACS

В WooCommerce для любого заказа, размещенного с помощью BACS (прямой банковский перевод), устанавливается значение "on-hold".

Как можно было бы автоматически изменить это на обработку?

Я не хочу, чтобы он работал в functions.php

У меня есть следующий код, но он не работает:

add_filter( 'woocommerce_payment_complete_order_status', 'rfvc_update_order_status', 10, 2 );

function rfvc_update_order_status( $order_status, $order_id ) {
    $order = new WC_Order( $order_id );
    if ( 'on-hold' == $order_status && 'on-hold' == $order->status ) {
        return 'processing';
    }
    return $order_status;
}

Любая помощь была бы замечательной!


person Tristan .L    schedule 13.04.2016    source источник
comment
Я решил пойти по второму подходу, так как кажется, что первый фильтр не срабатывает при оплате BACS.   -  person Tristan .L    schedule 14.04.2016


Ответы (3)


Новое обновление 2020 г.

Версия 3.4 WooCommerce представила гораздо лучший крючок, чем woocommerce_thankyou или woocommerce_thankyou_bacs, который позволяет изменять статус заказа по умолчанию для метода оплаты BACS.

Использование этого хука:

  • четко облегчить необходимый код,
  • Избегайте отложенного уведомления клиента при размещении заказа BACS.

Поэтому используйте вместо этого следующее:

add_filter( 'woocommerce_bacs_process_payment_order_status','filter_bacs_process_payment_order_status_callback', 10, 2 );
function filter_bacs_process_payment_order_status_callback( $status, $order ) {
    return 'processing';
}

Код находится в файле functions.php активной дочерней темы (или активной темы). Проверено и работает.


Оригинальный ответ:

Обновление (в конце добавлена ​​версия для woocommerce 3+)

Похоже, что хук действия woocommerce_payment_complete_order_status не срабатывает с методом оплаты BACS.

На основе этого потока 'woocommerce_thankyou' действие крючок выполняет свою работу:

add_action( 'woocommerce_thankyou', 'bacs_order_payment_processing_order_status', 10, 1 );
 
function bacs_order_payment_processing_order_status( $order_id ) {
    if ( ! $order_id ) {
        return;
    }

    // Get an instance of the WC_Order object
    $order = new WC_Order( $order_id );
 
    if ( ( get_post_meta($order->id, '_payment_method', true) == 'bacs' ) && ('on-hold' == $order->status || 'pending' == $order->status) ) {
        $order->update_status('processing');
    } else {
        return;
    }
}

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


Для версий woocommerce 3+:

Здесь мы используем аналогичный составной хук woocommerce_thankyou_{$order->get_payment_method()}. :

add_action( 'woocommerce_thankyou_bacs', 'bacs_order_payment_processing_order_status', 10, 1 );
function bacs_order_payment_processing_order_status( $order_id ) {
    if ( ! $order_id ) {
        return;
    }

    // Get an instance of the WC_Order object
    $order = wc_get_order( $order_id );
 
    if ( in_array( $order->get_status(), array('on-hold', 'pending') ) ) {
        $order->update_status('processing');
    } else {
        return;
    }
}

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

person LoicTheAztec    schedule 13.04.2016
comment
Это потрясающе! :) Спасибо! - person Tristan .L; 14.04.2016
comment
@LoicTheAztec: Вы уверены, что последний код работает? Я получаю синтаксическую ошибку в моем functions.php - person Madita von Birkenlund; 05.09.2018
comment
@MaditavonBirkenlund К сожалению, в обновленном коде WC 3+ отсутствует скобка - person LoicTheAztec; 05.09.2018
comment
@LoicTheAztec Хорошо, но теперь оба электронных письма - на удержании и обработке - отправляются одновременно, и только в заблокированном электронном письме отображаются инструкции по оплате. Однако следует отправлять только электронное письмо для обработки, не так ли? - person Madita von Birkenlund; 05.09.2018
comment
@MaditavonBirkenlund В любом случае автоматическая обработка заказов BACS или CHECK не является хорошей идеей, так как владелец магазина должен дождаться подтверждения своего банка, прежде чем передать заказ в обработку или завершить статус заказа. Так что, если хотите, вы можете внести некоторые изменения в BACS, используя что-то вроде: remicorson.com/… Или вы также можете использовать клон шлюза BACS для конкретных доверенных клиентов, которые имеют статус обработки в _ 1_ собственная функция - person LoicTheAztec; 05.09.2018

Появился новый фильтр, который позволит вам установить статус при обработке BACS «платеж».

/**
 * Change the default status when BACS 'payment' is processed.
 * 
 * @see WC_Gateway_BACS::process_payment()
 * woocommerce/includes/gateways/bacs/class-wc-gateway-bacs.php:362
 * @since Mar 8, 2018
 * @link https://github.com/woocommerce/woocommerce/blob/750fda3b1b55c55645f626d3873d956282e3ac1b/includes/gateways/bacs/class-wc-gateway-bacs.php#L364
 * 
 * @filter woocommerce_bacs_process_payment_order_status
 * @priority 10
 * @args 2
 * 
 * @param string $status Status to filter. Default 'on-hold'.
 * @param WC_Order $order
 * @return string New status 'processing'.
 */
add_filter( 'woocommerce_bacs_process_payment_order_status', function( $status = 'on_hold', $order = null ) {
    return 'processing';
}, 10, 2 );
person Shaun Cockerill    schedule 10.04.2019
comment
Это лучшее решение, оно меняет поведение по умолчанию и не запускает несколько действий со статусом заказа. - person hexcross; 24.06.2020
comment
Кто-то спросил меня о ситуациях, когда уровень запасов не снижается. Я дважды проверил код, и, начиная с 3.0.0, WooCommerce будет пытаться автоматически уменьшить запасы, когда запускается действие завершения платежа, а также когда статус заказа переходит в состояние ожидания, обработки или завершения. - person Shaun Cockerill; 28.10.2020

Попробуйте изменить код на этот:

function rfvc_update_order_status( $order_status, $order_id ) {
    $order = new WC_Order( $order_id );
    if ( 'on-hold' == $order_status && 'on-hold' == $order->status ) {
        $order->update_status('processing', 'order_note');
    }
    return $order_status;
}

Ключевое изменение здесь заключается в следующем:

$order->update_status('processing', 'order_note');

Вы также можете добавить примечание к заказу, если хотите.

person Nerijus Masikonis    schedule 13.04.2016
comment
Ах, отличный материал, который должен сработать, но я подключаюсь к woocommerce_payment_complete_order_status, это даже срабатывает при использовании BACS? Поскольку этот вариант оплаты просто отправляет людям счет-фактуру. - person Tristan .L; 13.04.2016
comment
Ты можешь попробовать? Обычно так и должно быть. - person Nerijus Masikonis; 13.04.2016
comment
Оказывается, woocommerce_payment_complete_order_status действительно срабатывает после получения платежа. Так что он не сработает при простом заказе. - person Tristan .L; 13.04.2016
comment
В этом случае вам следует использовать другой триггер, но ключевым моментом здесь является то, что вы можете использовать $ order- ›update_status ('processing', 'order_note'); изменить статус заказа. - person Nerijus Masikonis; 14.04.2016
comment
Я пробовал, но пока у меня не будет 15 повторений, это не даст никакого эффекта. Если вы дадите мне один голос, я могу дать вам один, так как я нахожусь на представлении 14. - person Tristan .L; 15.04.2016