【问题标题】:Automatically changing user role upon purchase in WooCommerce在 WooCommerce 中购买时自动更改用户角色
【发布时间】:2021-02-01 12:13:11
【问题描述】:

我想为已完成购买的 WooCommerce 客户创建一个仅限会员的部分,为他们分配一个新角色,因为所有注册用户的默认角色都是“客户”。

我偶然发现了一些可以解决这个问题的代码,但是商店里有 200 多种产品,单独列出所有产品会很麻烦。

是否可以为进行 ANY 购买的客户提供一个新角色?

这是原始代码:

add_action( 'woocommerce_order_status_completed', 'wpglorify_change_role_on_purchase' );

function wpglorify_change_role_on_purchase( $order_id ) {

// get order object and items
    $order = new WC_Order( $order_id );
    $items = $order->get_items();

    $product_id = 56; // that's a specific product ID

    foreach ( $items as $item ) {

        if( $product_id == $item['product_id'] && $order->user_id ) {
            $user = new WP_User( $order->user_id );

            // Remove old role
            $user->remove_role( 'customer' ); 

            // Add new role
            $user->add_role( 'editor' );
        }
    }
}

【问题讨论】:

    标签: php wordpress woocommerce orders user-roles


    【解决方案1】:

    更新

    您可以改用以下内容,这将在客户成功购买(付费订单)时更改用户角色:

    add_action( 'woocommerce_order_status_processing', 'change_role_on_purchase', 10, 2 );
    add_action( 'woocommerce_order_status_completed', 'change_role_on_purchase', 10, 2 );
    function change_role_on_purchase( $order_id, $order ) {
        $user = $order->get_user(); // Get the WP_User Object
    
        // Check for "customer" user roles only
        if( is_a( $user, 'WP_User' ) && in_array( 'customer', (array) $user->roles ) ) {
            // Remove WooCommerce "customer" role
            $user->remove_role( 'customer' ); 
    
            // Add new role
            $user->add_role( 'editor' );
        }
    }
    

    代码位于活动子主题(或活动主题)的functions.php 文件中。经过测试并且可以工作。

    注意:WC_Order 对象已经是该挂钩函数的现有参数(您的代码中缺少)。


    添加:删除所有以前的角色并分配一个新角色

    这可以使用WP_User set_role() 方法,所以在代码中,替换:

    // Remove WooCommerce "customer" role
    $user->remove_role( 'customer' ); 
    
    // Add new role
    $user->add_role( 'editor' );
    

    作者:

    // Reset user roles and set a new one
    $user->set_role( 'editor' );
    

    【讨论】:

    • 工作就像一个魅力!太感谢了。对于“ $user->remove_role( 'customer' ); ”,有没有办法删除任何现有角色并将其替换为新角色?我试图通过慢慢列出所有角色来做到这一点,但它似乎不是非常有效或干净的代码
    • @hja918 是的,这是可能的,而且很简单……请参阅我的回答中的补充内容。现在如果你喜欢/想要你也可以请upvote回答,无论如何谢谢。
    猜你喜欢
    • 1970-01-01
    • 2018-04-10
    • 2019-12-29
    • 2019-01-12
    • 2015-10-06
    • 1970-01-01
    • 2017-03-18
    • 2015-06-21
    • 2019-08-14
    相关资源
    最近更新 更多