如何根据用户角色显示不同的产品价格(尤其是可变产品)?
How to show different product price based on user role (especially for variable products)?
我想显示产品在 woocommerce 中不同角色的价格。为了这个目标,我通过输入字段在产品的 post 元中设置了一个 meta_key 元价格元值。然后我使用以下代码过滤所需角色的该产品的显示价格。角色是 customer_2
例如:product_A 正常价格为 200 美元 customer_2 显示 150 美元
product_B 正常价格是 350 美元 customer_2 显示 200 美元等等...
function custom_price($price, $product){
$product_co_price = get_post_meta($product->ID, '_co_price');
$user = wp_get_current_user();
if($product_co_price){
if(in_array('customer_2', (array) $user->roles)){
$price = $product_co_price;
}
}
return $price;}
add_filter('woocommerce_product_get_price', 'custom_price', 10, 2);
add_filter('woocommerce_product_variation_get_price', 'custom_price', 10, 2 );
add_filter( 'woocommerce_product_get_regular_price', 'custom_price', 10, 2 );
add_filter( 'woocommerce_product_get_sale_price', 'custom_price', 10, 2 );
'_co_price' 在存储价格元值的元键中。
但是什么也没发生!
你的函数只有两个小错误:
在下一行中,您错误地访问了 $product->ID
属性。您应该使用 $product->get_id()
方法:
$product_co_price = get_post_meta($product->ID, '_co_price');
此外,如果在 get_post_meta()
函数中您没有将第三个参数赋值为 true 您将返回一个错误,因为在以下几行中您将创建当前价格(字符串)与从自定义元数据(数组)获得的价格之间的比较。欲了解更多信息:
所以正确的函数是:
// shows a customized price based on the user role
add_filter( 'woocommerce_product_get_price', 'custom_price', 10, 2);
add_filter( 'woocommerce_product_variation_get_price', 'custom_price', 10, 2 );
add_filter( 'woocommerce_product_get_regular_price', 'custom_price', 10, 2 );
add_filter( 'woocommerce_product_get_sale_price', 'custom_price', 10, 2 );
function custom_price( $price, $product ) {
// if the user is not logged in or has a role other than "customer_2", it shows the default price of the product
$user = wp_get_current_user();
if ( ! in_array( 'customer_2', (array) $user->roles ) ) {
return $price;
}
// gets the price to display for the user role "customer_2"
$co_price = get_post_meta( $product->get_id(), '_co_price', true );
// if the custom meta is not set or is empty or equal to zero it shows the default price
if ( ! isset( $co_price ) || empty( $co_price ) || $co_price == 0 ) {
return $price;
// otherwise it shows the custom price
} else {
return $co_price;
}
return $price;
}
如果您在可变产品页面上显示价格范围,您将需要更改考虑自定义元产品的逻辑_co_price
。
因此您需要使用:
// shows the price range of the variable product based on the price of the custom meta "_co_price" of each single variation
add_filter( 'woocommerce_variable_price_html', 'show_price_range_based_on_custom_meta_price', 99, 2 );
function show_price_range_based_on_custom_meta_price( $price, $product ) {
// initializes the array which will contain all variation prices
$prices = array();
$variation_ids = $product->get_children();
foreach ( $variation_ids as $variation_id ) {
$variation = wc_get_product( $variation_id );
// gets the net default price
$prices[] = $variation->get_price();
// gets the price from the custom meta product
$co_price = $variation->get_meta( '_co_price', true );
// replaces the comma with the period to make it numeric
$co_price = str_replace( ',', '.', $co_price );
$prices[] = $co_price;
}
// removes empty values from the array
$prices = array_filter($prices);
// gets the minimum value from the array
$min_price = min( $prices );
// gets the maximum value from the array
$max_price = max( $prices );
if ( $min_price == $max_price ) {
$price = wc_price( $min_price );
} else {
$price = wc_format_price_range( $min_price, $max_price );
}
return $price;
}
代码已经过测试并且可以工作。将它添加到您的活动主题 functions.php.
我想显示产品在 woocommerce 中不同角色的价格。为了这个目标,我通过输入字段在产品的 post 元中设置了一个 meta_key 元价格元值。然后我使用以下代码过滤所需角色的该产品的显示价格。角色是 customer_2
例如:product_A 正常价格为 200 美元 customer_2 显示 150 美元 product_B 正常价格是 350 美元 customer_2 显示 200 美元等等...
function custom_price($price, $product){
$product_co_price = get_post_meta($product->ID, '_co_price');
$user = wp_get_current_user();
if($product_co_price){
if(in_array('customer_2', (array) $user->roles)){
$price = $product_co_price;
}
}
return $price;}
add_filter('woocommerce_product_get_price', 'custom_price', 10, 2);
add_filter('woocommerce_product_variation_get_price', 'custom_price', 10, 2 );
add_filter( 'woocommerce_product_get_regular_price', 'custom_price', 10, 2 );
add_filter( 'woocommerce_product_get_sale_price', 'custom_price', 10, 2 );
'_co_price' 在存储价格元值的元键中。
但是什么也没发生!
你的函数只有两个小错误:
在下一行中,您错误地访问了 $product->ID
属性。您应该使用 $product->get_id()
方法:
$product_co_price = get_post_meta($product->ID, '_co_price');
此外,如果在 get_post_meta()
函数中您没有将第三个参数赋值为 true 您将返回一个错误,因为在以下几行中您将创建当前价格(字符串)与从自定义元数据(数组)获得的价格之间的比较。欲了解更多信息:
所以正确的函数是:
// shows a customized price based on the user role
add_filter( 'woocommerce_product_get_price', 'custom_price', 10, 2);
add_filter( 'woocommerce_product_variation_get_price', 'custom_price', 10, 2 );
add_filter( 'woocommerce_product_get_regular_price', 'custom_price', 10, 2 );
add_filter( 'woocommerce_product_get_sale_price', 'custom_price', 10, 2 );
function custom_price( $price, $product ) {
// if the user is not logged in or has a role other than "customer_2", it shows the default price of the product
$user = wp_get_current_user();
if ( ! in_array( 'customer_2', (array) $user->roles ) ) {
return $price;
}
// gets the price to display for the user role "customer_2"
$co_price = get_post_meta( $product->get_id(), '_co_price', true );
// if the custom meta is not set or is empty or equal to zero it shows the default price
if ( ! isset( $co_price ) || empty( $co_price ) || $co_price == 0 ) {
return $price;
// otherwise it shows the custom price
} else {
return $co_price;
}
return $price;
}
如果您在可变产品页面上显示价格范围,您将需要更改考虑自定义元产品的逻辑_co_price
。
因此您需要使用:
// shows the price range of the variable product based on the price of the custom meta "_co_price" of each single variation
add_filter( 'woocommerce_variable_price_html', 'show_price_range_based_on_custom_meta_price', 99, 2 );
function show_price_range_based_on_custom_meta_price( $price, $product ) {
// initializes the array which will contain all variation prices
$prices = array();
$variation_ids = $product->get_children();
foreach ( $variation_ids as $variation_id ) {
$variation = wc_get_product( $variation_id );
// gets the net default price
$prices[] = $variation->get_price();
// gets the price from the custom meta product
$co_price = $variation->get_meta( '_co_price', true );
// replaces the comma with the period to make it numeric
$co_price = str_replace( ',', '.', $co_price );
$prices[] = $co_price;
}
// removes empty values from the array
$prices = array_filter($prices);
// gets the minimum value from the array
$min_price = min( $prices );
// gets the maximum value from the array
$max_price = max( $prices );
if ( $min_price == $max_price ) {
$price = wc_price( $min_price );
} else {
$price = wc_format_price_range( $min_price, $max_price );
}
return $price;
}
代码已经过测试并且可以工作。将它添加到您的活动主题 functions.php.