我只是想知道是否有人能解决我目前遇到的这个问题。实际上,我正在尝试在购物车上为访问我的在线商店的用户打印自定义价格。以下是我计划设定的条件。
未登录的用户-
以“客户”用户角色登录的用户-
以“付费客户”用户角色登录的用户-
目前,只有未登录的用户和“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接受的答案,参见下面我的代码答案。
您应该在问题中提到您正在使用的插件,因为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高级动态定价插件管理,基于我的自定义用户角色,因此我不再需要担心价格输出。