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

Posted

技术标签:

【中文标题】根据在 Woocommerce 中购买的总商品更改用户角色【英文标题】:Change user role based on total items purchased in Woocommerce 【发布时间】:2019-01-12 01:32:30 【问题描述】:

在 Woocommerce 中,我试图将这两个功能结合起来:

first one 获取用户订购商品的总数量(所有时间)

function get_user_total_purchased_items( $user_id = 0 )
    global $wpdb;

    $customer_id = $user_id === 0 ? get_current_user_id() : (int) $user_id;

    return (int) $wpdb->get_var( "
        SELECT SUM(woim.meta_value)
        FROM $wpdb->prefixwoocommerce_order_items AS woi
        INNER JOIN $wpdb->prefixwoocommerce_order_itemmeta AS woim ON woi.order_item_id = woim.order_item_id
        INNER JOIN $wpdb->prefixposts as p ON woi.order_id = p.ID
        INNER JOIN $wpdb->prefixpostmeta as pm ON woi.order_id = pm.post_id
        WHERE woi.order_item_type = 'line_item'
        AND p.post_type LIKE 'shop_order'
        AND p.post_status IN ('wc-completed')
        AND pm.meta_key LIKE '_customer_user'
        AND pm.meta_value LIKE '$customer_id'
        AND woim.meta_key LIKE '_qty'
    " );

如果用户订购了某个商品,第二个会更改用户角色。

function change_role_on_purchase( $order_id ) 

    $order = new WC_Order( $order_id );
    $items = $order->get_items();

    foreach ( $items as $item ) 
        $product_name = $item['name'];
        $product_id = $item['product_id'];
        $product_variation_id = $item['variation_id'];

        if ( $order->user_id > 0 && $product_id == '416' ) 
            update_user_meta( $order->user_id, 'paying_customer', 1 );
            $user = new WP_User( $order->user_id );

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

            // Add role
            $user->add_role( 'premium' );
        
    


add_action( 'woocommerce_order_status_processing', 'change_role_on_purchase' );

我想要完成的是,如果用户总共订购了 50-99 件商品,则他的用户角色将从标准用户更改为青铜用户,如果他订购了 100-199,则他的用户角色青铜用户 -> 银用户,如果总共项目超过 200 hus 用户角色 silver_user -> gold_user。

第一个函数运行良好,来自this answer

现在只是想弄清楚如何在第二个函数中实现它。

【问题讨论】:

【参考方案1】:

自从 Woocommerce 3 以来,您的代码有点过时,需要进行一些更改。以下内容应根据购买商品的数量有条件地更改用户角色(未经测试)

function get_user_total_purchased_items( $user_id = 0 )
    global $wpdb;

    $customer_id = $user_id === 0 ? get_current_user_id() : (int) $user_id;

    return (int) $wpdb->get_var( "
        SELECT SUM(woim.meta_value)
        FROM $wpdb->prefixwoocommerce_order_items AS woi
        INNER JOIN $wpdb->prefixwoocommerce_order_itemmeta AS woim ON woi.order_item_id = woim.order_item_id
        INNER JOIN $wpdb->prefixposts as p ON woi.order_id = p.ID
        INNER JOIN $wpdb->prefixpostmeta as pm ON woi.order_id = pm.post_id
        WHERE woi.order_item_type = 'line_item'
        AND p.post_type LIKE 'shop_order'
        AND p.post_status IN ('wc-completed')
        AND pm.meta_key LIKE '_customer_user'
        AND pm.meta_value LIKE '$customer_id'
        AND woim.meta_key LIKE '_qty'
    " );


add_action( 'woocommerce_order_status_processing', 'change_role_on_purchase', 20, 2 );
function change_role_on_purchase( $order_id, $order ) 

    $user_id   = $order->get_customer_id();
    $user      = new WP_User( $user_id );
    $purchases = get_user_total_purchased_items( $user_id );

    if( $purchases >= 50 &&  $purchases < 100 && ! in_array( 'bronze_user', $user->roles ) ) 
        // Remove role
        $user->remove_role( 'subscriber' );

        // Add role
        $user->add_role( 'bronze_user' );
    
    elseif( $purchases >= 100 &&  $purchases < 200 && ! in_array( 'silver_user', $user->roles ) ) 
        // Remove role
        $user->remove_role( 'bronze_user' );

        // Add role
        $user->add_role( 'silver_user' );
    
    elseif( $purchases >= 200 && ! in_array( 'gold_user', $user->roles ) ) 
        // Remove role
        $user->remove_role( 'silver_user' );

        // Add role
        $user->add_role( 'gold_user' );
    

    if ( $user_id > 0 && $product_id == '416' ) 
        foreach ( $order->get_items() as $item ) 
            if ( $order->user_id > 0 && $item->get_product_id() == '416' ) 
                update_user_meta( $user_id, 'paying_customer', 1 );

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

                // Add role
                $user->add_role( 'premium' );
            
        
    

代码进入您的活动子主题(或活动主题)的 function.php 文件中。我希望它会起作用,因为我无法测试它。


有关 Woocommerce 3 中订单的参考:

How to get WooCommerce order details Get Order items and WC_Order_Item_Product in Woocommerce 3

【讨论】:

感谢您的回复。不幸的是,它没有用。尝试在第二个函数上将 woocommerce_order_status_processing 更改为 woocommerce_order_status_completed,因为第一个函数计算已完成的订单 - 它可能会考虑当前订单。无论如何不知道可能出了什么问题,什么都没有发生,也没有错误:/ @Viktor 我稍后会检查,为了测试代码,我需要在测试服务器中设置一些用户角色......但是我的代码中的方式(哲学)是好的。我会在这里通知你。 您好,您已经能够测试或发现什么了吗?谢谢 获得帮助并找到了解决方案,第二个函数中的 $customer_id 未定义。改成 $user_id 就成功了!

以上是关于根据在 Woocommerce 中购买的总商品更改用户角色的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQL 获取已购买商品的数量 - Woocommerce

WooCommerce - 启用此功能,以便在一个订单中只允许购买此商品中的一个。

根据 WooCommerce 中的付款方式提高购物车商品价格

根据运输类别和商品数量添加 Woocommerce 费用

根据 WooCommerce 购物车中的商品数量和产品类别禁用支付网关

结帐页面上的 Woocommerce 更改结帐总数