WooCommerce: Автоматическое заполнение оплаченных заказов (в зависимости от способов оплаты)


Обычно WooCommerce должна автоматически заполнять заказы на виртуальные продукты. Но это не так, и это настоящая проблема, даже такая ошибка, как.

Итак, на этом этапе вы можете найти несколько полезных вещей (но не очень удобных):

1) Фрагмент кода (который вы можете найти в документах WooCommerce):

/**
 * Auto Complete all WooCommerce orders.
 */
add_action( 'woocommerce_thankyou', 'custom_woocommerce_auto_complete_order');
function custom_woocommerce_auto_complete_order( $order_id ) {
    if ( ! $order_id ) {
        return;
    }

    $order = wc_get_order( $order_id );
    $order->update_status( 'completed' );
}

Но этот фрагмент не работает для BACS*, Оплата при доставке и Чек способы оплаты. Это нормально для Paypal и кредитной карты способы оплаты через шлюзы.

*BACS - это способ оплаты прямым банковским переводом

И...

2) Плагин: Заказы на автозаполнение WooCommerce

Этот плагин работает для всех способов оплаты, но не для других Способов оплаты через шлюзы кредитных карт.

Мой вопрос:

Используя (в качестве основы) фрагмент WooCommerce в пункте 1:

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

Я имею в виду что-то вроде: если способы оплаты не являются "BACS", "Оплата при доставке" и "Чек", затем примените фрагмент кода (обновите статус до "завершено" для оплаченных заказов, касающихся виртуальных продуктов).

Я не являюсь мега-экспертом-программистом WooCommerce, поэтому я еще не нашел, как настроить способы оплаты в заказах woocommerce.

Некоторая помощь будет очень кстати.

Спасибо.

Author: LoicTheAztec, 2016-02-28

1 answers

Я нашел решение этой проблемы (Работает с WC 3+):

/**
 * 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;
    } 
    // "completed" updated status for paid Orders with all others payment methods
    else {
        $order->update_status( 'completed' );
    }
}

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

С помощью этого поста: Как проверить способ оплаты заказа WooCommerce по идентификатору?

С этим: get_post_meta( $order_id, '_payment_method', true ); из хельгатевикинг

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

Обновлен код для совместимости с WC 3.0+ (2017-06-10)


Улучшенная версия для WooCommerce 3+ (2018)

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;
    // Updated status to "completed" for paid Orders with all others payment methods
    } else {
        $order->update_status( 'completed' );
    }
}

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

 25
Author: LoicTheAztec, 2018-08-13 11:33:35