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

Posted

技术标签:

【中文标题】WooCommerce 根据用户角色更改 BACS 订单状态【英文标题】:WooCommerce change BACS order status based on user roles 【发布时间】:2021-01-30 08:22:37 【问题描述】:

我收到几个订单,其中客户选择“直接银行转账”,然后他们改变主意并希望通过信用卡付款。这很烦人,因为我必须手动将订单从“保留”更改为“待付款”,这样他们就可以通过“订单”下的“我的帐户”中的“订单支付”端点用卡付款。

我一直在使用WooCommerce change order status BACS processing 自动将订单状态从“暂停”更改为“待付款”。

// 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),这对我的商店来说并不实用。我正在尝试扩展此 sn-p 以检查用户角色。我在我的其他 sn-ps 中使用了以下内容。上面的sn-p可以加上下面的逻辑吗?

    $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;
    

【问题讨论】:

从 Woocommerce 3.4 版开始,有一个比一般的woocommerce_thankyou 钩子更好的专用钩子可以使用……请看下面的答案。 【参考方案1】:

你可以这样使用,注释并在代码中添加解释

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: Get Order Info (total, items, etc) From $order Object

【讨论】:

【参考方案2】:

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+ 起: Allow re-sending New Order Notification in 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 文件中。经过测试并且可以工作。

相关:Send an Email notification to the admin for pending order status in WooCommerce


有用:How to get WooCommerce order details

相关:Change default WooCommerce order status to processing for cheque and bacs payments

最新更新的回答线程:WooCommerce change order status BACS processing

【讨论】:

这可行,但我注意到没有向客户或商店管理员发送电子邮件(订单通知)。 @WanderlustConsulting 因为待处理订单不发送通知...请参阅:Send an Email notification to the admin for pending order status in WooCommerce... 我已更新我的答案以启用向管理员发送新订单通知以处理待处理的 BACS 订单。

以上是关于WooCommerce 根据用户角色更改 BACS 订单状态的主要内容,如果未能解决你的问题,请参考以下文章

根据在 Woocommerce 中购买的总商品更改用户角色

根据 Woocommerce 中的用户角色更改 COD 支付网关的默认订单状态

从 WooCommerce 中的电子邮件通知中删除 BACS 指令

在 WooCommerce 中,将 BACS“暂停”订单限制为客户的一个

选择 BACS 帐户以显示在 WooCommerce 的感谢页面中

根据 Woocommerce 中的用户角色自定义客户新帐户邮件