提问者:小点点

基于用户角色在WooCommerce购物车上显示自定义定价标签


我只是想知道是否有人能解决我目前遇到的这个问题。实际上,我正在尝试在购物车上为访问我的在线商店的用户打印自定义价格。以下是我计划设定的条件。

未登录的用户-

以“客户”用户角色登录的用户-

以“付费客户”用户角色登录的用户-

目前,只有未登录的用户和“paid_customer”用户角色的定价显示正常工作,但“客户”角色的定价显示不正常。不确定我是否在这里正确识别客户角色。

下面是我在这种情况下使用的挂钩:

add_filter( 'woocommerce_cart_item_price', function ( $price, $values, $cart_item_key ){

        global $woocommerce;
        $items = $woocommerce->cart->get_cart();
        $user = wp_get_current_user();
    
    if (!is_user_logged_in() || (in_array( 'customer', (array) $user->roles ))){
        
        return $price;
        
    }else{
        
        foreach($items as $item => $values) {
            echo "Discounted Price : " . get_post_meta($values['product_id'] , ('_sale_price', true);       
            return $price;  
        }   
    }

}, 10, 3);

编辑:

我的定价折扣已经由WooCommerce高级动态定价插件管理,基于我的自定义用户角色,因此我不再需要担心价格输出。

根据@LoicTheAztec接受的答案,参见下面我的代码答案。


共3个答案

匿名用户

您应该在问题中提到您正在使用的插件,因为StackOverFlow的问题/答案是针对hole社区的,而不仅仅是针对您。

您的代码有一些错误,可以简化:

add_filter( 'woocommerce_cart_item_price', 'filter_wc_cart_item_price', 10, 3 );
function filter_wc_cart_item_price( $price, $values, $cart_item_key ){

    // For 'paid_customer' user role when sale price is defined
    if ( current_user_can( 'paid_customer' ) && $sale_price = get_post_meta( $values['product_id'],'_sale_price', true) ) {
    
        // The custom formatted sale price
        $price = sprintf( __("Discounted Price : %s"), wc_price( $sale_price ) );
    }
    return $price;
}

它应该会起作用。

对答案代码的编辑不正确,因为过滤器挂钩中的数据始终需要返回,但不需要回显:

add_filter( 'woocommerce_cart_item_price', 'filter_wc_cart_item_price', 10, 3 );
function filter_wc_cart_item_price( $price, $values, $cart_item_key ){

    // For 'lifetime_member' user role when sale price is defined
    if ( current_user_can( 'paid_customer' ) ) 
    {
        $price = __("Members Price (5% Off): ") .  $price;
    } 
    elseif ( current_user_can('customer') ) 
    {
        $price = __("Normal Price: ") .  $price;
    } 
    return $price;
}

这才是正确的工作方式。

匿名用户

使用此钩子,而不是“在计算总计之前计算”

add_action("woocommerce_before_calculate_totals", "set_product_price");

function set_product_price($cart_obj) {
    $user = wp_get_current_user();
    foreach ($cart_obj->get_cart() as $item) {
         if (!is_user_logged_in() || (in_array( 'customer', (array) $user->roles ))){
               $item['data']->set_price(20);
         } else {
               $item['data']->set_price(15);
         }
    }
}

这样,您就不需要在结账和下单过程中处理价格。

匿名用户

这就是我所做的,以实现我想要的(感谢@LoicTheAztec-answer):

add_filter( 'woocommerce_cart_item_price', 'filter_wc_cart_item_price', 10, 3 );

function filter_wc_cart_item_price( $price, $values, $cart_item_key ){

    // For 'lifetime_member' user role when sale price is defined
    if ( current_user_can( 'paid_customer' )) {
    
        echo "Members Price (5% Off): ";

    } elseif (current_user_can('customer')){
        
        echo "Normal Price: ";
        
    } 
    
    return $price;
}

我的定价折扣已经由WooCommerce高级动态定价插件管理,基于我的自定义用户角色,因此我不再需要担心价格输出。