WooCommerce меняет статус заказа BACS в зависимости от ролей пользователей

Я получаю несколько заказов, в которых клиент выбирает прямой банковский перевод, а затем передумает и хочет оплатить кредитной картой. Это очень раздражает, потому что мне нужно вручную изменить заказ с «На удержании» на «Ожидающий платеж», чтобы они могли платить картой через конечную точку оплаты заказа, которая находится в «Моя учетная запись» в разделе «Заказы».

Я использовал обработку BACS статуса изменения заказа WooCommerce для автоматического изменения статус заказа с "На удержании" на "Ожидающий платеж".

// WooCommerce Change Order Status BACS Pending

add_action( 'woocommerce_thankyou', 'bacs_order_payment_pending_order_status', 10, 1 );

function bacs_order_payment_pending_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 ) ) {
        $order->update_status('pending');
    } else {
        return;
    }
}

Но поскольку у меня есть несколько профилей пользователей (я также продаю B2B), это непрактично для моего магазина. Я пытаюсь расширить этот фрагмент, чтобы также проверить роль пользователя. В других отрывках я использовал следующее. Можно ли добавить приведенную ниже логику к приведенному выше фрагменту?

    $user = wp_get_current_user();
    $roles = (array) $user->roles;
    $roles_to_check = array('administrator', 'customer', 'shop_manager');
    $compare = array_diff($roles, $roles_to_check);

    if (empty($compare)){

Это моя попытка.

// WooCommerce Change Order Status BACS Pending

add_action( 'woocommerce_thankyou', 'bacs_order_payment_pending_order_status', 10, 1 );

function bacs_order_payment_pending_order_status( $order_id ) {
    if ( ! $order_id ) {
        return;
    }

    // Get an instance of the WC_Order object
    $order = new WC_Order( $order_id );

    $user = wp_get_current_user();
    $roles = (array) $user->roles;
    $roles_to_check = array('administrator', 'customer', 'shop_manager');
    $compare = array_diff($roles, $roles_to_check);

    if (empty($compare)){

    if ( ( get_post_meta($order->id, '_payment_method', true) == 'bacs' ) && ('on-hold' == $order->status ) ) {
        $order->update_status('pending');
    } else {
        return;
    }
}

person Wanderlust Consulting    schedule 15.10.2020    source источник
comment
Начиная с версии 3.4 Woocommerce, существует гораздо лучший специальный крючок, чем общий woocommerce_thankyou крючок… Пожалуйста, прочтите ответ ниже.   -  person LoicTheAztec    schedule 15.10.2020


Ответы (2)


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

function bacs_order_payment_pending_order_status( $order_id ) {
    // Get $order object
    $order = wc_get_order( $order_id );
    
    // Is a WC_Order
    if ( is_a( $order, 'WC_Order' ) ) {
        // Get user
        $user = $order->get_user();
        
        // Roles
        $roles = (array) $user->roles;
        
        // Roles to check
        $roles_to_check = array( 'administrator', 'customer', 'shop_manager' );
        
        // Compare
        $compare = array_diff( $roles, $roles_to_check );
        
        // Result is empty
        if ( empty ( $compare ) ) {
            if ( $order->get_payment_method() == 'bacs' && $order->has_status( 'on-hold' ) ) {
                $order->update_status( 'pending' );
            }
        }
    }
}
add_action( 'woocommerce_thankyou', 'bacs_order_payment_pending_order_status', 10, 1 );

Может пригодиться: WooCommerce: получение информации о заказе (всего, товаров и т. Д.) Из объекта $ order

person 7uc1f3r    schedule 15.10.2020

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

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

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

Вот этот код:

add_filter( 'woocommerce_bacs_process_payment_order_status','filter_process_payment_order_status_callback', 10, 2 );
function filter_process_payment_order_status_callback( $status, $order ) {
    // Here set the user roles to check
    $roles_to_check = array( 'administrator', 'customer', 'shop_manager' ); 
    
    $user = $order->get_user(); // Get the WP_User Object
        
    $compare = array_diff( $user->roles, $roles_to_check ); // compare
        
    if ( empty ( $compare ) ) {
        return 'pending';
    }
    return $status;
}

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

Начиная с WooCommerce 5+: Разрешить повторную отправку уведомления о новом заказе в WooCommerce 5+


Включение уведомления по электронной почте о новом заказе (отправляемого администратору) для платежей BACS:

Поскольку ожидающие заказы не отправляют уведомления по электронной почте, вы можете включить это с помощью следующих

add_action( 'woocommerce_checkout_order_processed', 'pending_new_order_notification', 20, 1 );
function pending_new_order_notification( $order_id ) {
    // Get an instance of the WC_Order object
    $order = wc_get_order( $order_id );

    // Only for "pending" order status and BACS payments
    if( $order->has_status( 'pending' ) && $order->get_payment_method() === 'bacs' ) 
    {
        // Send "New Email" notification (to admin)
        WC()->mailer()->get_emails()['WC_Email_New_Order']->trigger( $order_id );
    }
}

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

Связанный: Отправьте администратору уведомление по электронной почте о статусе отложенного заказа в WooCommerce


Полезно: Как получить сведения о заказе WooCommerce

Связано: Изменить значение по умолчанию Статус заказа WooCommerce для обработки для оплаты чеков и счетов

Недавно обновленная ветка ответов: Обработка BACS статуса заказа на изменение WooCommerce

person LoicTheAztec    schedule 15.10.2020
comment
Это работает, но я заметил, что электронное письмо не отправляется покупателю или администратору магазина (уведомление о заказе). - person Wanderlust Consulting; 16.10.2020
comment
@WanderlustConsulting Поскольку отложенные заказы не отправляют уведомление… см .: Отправить уведомление по электронной почте администратору для статуса ожидающего заказа в WooCommerce… Я обновил свой ответ, чтобы включить уведомление о новом заказе, отправляемое администратору для ожидающих заказов BACS. - person LoicTheAztec; 16.10.2020