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

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

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

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

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

мой вопрос:

использование (в качестве base) фрагмент wooCommerce в пункте 1:

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

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

Я не кодер WooCommerce mega expert, поэтому я еще не нашел, как настроить целевые способы оплаты в woocommerce заказы.

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

спасибо.

1 ответов


Я нашел решение этой проблемы (работает с 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' );
    }
}

код в функцию.php-файл активной дочерней темы (или активной темы).

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

С этого : get_post_meta( $order_id, '_payment_method', true ); С helgatheviking

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

обновлен код для совместимости с 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' );
    }
}

код в функцию.php-файл активной дочерней темы (или активной темы).