提问者:小点点

WooCommerce根据用户角色更改BACS订单状态


我收到几个订单,客户选择“直接银行转账”,然后他们改变主意,想用信用卡支付。这很烦人,因为我必须手动将订单从“暂停”更改为“待付款”,以便他们可以通过“订单付款”endpoint(位于“订单”下的“我的帐户”中)通过卡付款。

我一直在使用WooCommerce更改订单状态BACS处理来自动将订单状态从“暂停”更改为“待付款”。

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

共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对象获取订单信息(总数、项目等)

匿名用户

WooCommerce 3.4.0版本引入了一个更好的钩子,允许更改设置为“保持”的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订单详细信息

相关:将默认商业订单状态更改为支票和bacs付款处理

最新更新的答案线程:WooCommerce更改订单状态BACS处理