Изменение статуса заказа WooCommerce из платежного шлюза

Я интегрировал платежный шлюз для приема онлайн-платежей для моего магазина, работающего на woocommerce. Все работает нормально, но я заметил, что woocommerce по умолчанию меняет статус заказа на wc-processing для всех онлайн-заказов.

Что касается функциональности моего магазина, я хочу, чтобы все оплаченные онлайн-заказы изначально находились в состоянии wc-on-hold.

Есть ли способ остановить woocommerce, изменяющую статус заказа на wc-processing программно?


person krishna89    schedule 03.08.2016    source источник


Ответы (2)


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

Теперь woocommerce использует метод $order->payment_complete() для обработки выполненного заказа, поэтому вам нужно подключить свою собственную функцию для изменения статуса, вот описание этого метода

Используйте этот фильтр: woocommerce_payment_complete_order_status

person Mauro    schedule 03.08.2016
comment
Вы правы, $order->payment_complete() меняет статус заказа на processing в моем платежном плагине. Вместо этого я попробую разместить свою собственную функцию и дам вам знать. - person krishna89; 05.08.2016
comment
Вместо $order->payment_complete() я добавил следующий код, и он работал так, как я ожидал. $order->update_status('on-hold'); add_post_meta($order->id, '_paid_date', current_time('mysql'), true); update_post_meta($order->id, '_transaction_id', $txnid); $order->reduce_order_stock(); - person krishna89; 05.08.2016

Вот фрагмент кода, основанный на этом < strong> thread. Мы используем здесь woocommerce_thankyou (который запускается сразу после оплаты) для подключения нашей функции, конвертируя статус заказов 'processing' в 'on-hold' :

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

    global $woocommerce;
    $order = new WC_Order( $order_id );

    // 'processing' orders status are converted to 'on-hold'.
    if ( is_object($order) && $order->has_status( 'processing' ) {
        $order->update_status( 'on-hold' ); 
    }

    return;
}

В своих условиях вы также можете настроить таргетинг на платежные шлюзы, например, здесь мы обходим 3 платежных шлюза и настраиваем таргетинг на определенный платежный шлюз с помощью "your_payment_gateway" slug:

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

    global $woocommerce;
    $order = new WC_Order( $order_id );

    // Bypass orders 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;
    }

    // Target your "your_payment_gateway_slug" with this conditional
    if ( is_object($order) && get_post_meta($order->id, '_payment_method', true) == 'your_payment_gateway_slug'  && $order->has_status( 'processing' ) ) {
        $order->update_status( 'on-hold' ); 
    }

    return;
}

Этот фрагмент кода находится в файле function.php вашей активной дочерней темы или темы.

Вы можете легко делать все, что захотите, и правильный вариант для оплаченных заказов - woocommerce_thankyou.

Использованная литература:

person LoicTheAztec    schedule 03.08.2016
comment
Большое вам спасибо, но в вашем решении порядок изменится на on-hold, где он уже был отмечен как processing от шлюза. Моя проблема в том, что у меня есть поток уведомлений по электронной почте, связанный со статусом заказа, в котором on-hold должен быть первым статусом сразу после обработки шлюза. - person krishna89; 05.08.2016