Cambiar el Precio Mostrado en WooCommerce Según el Rol de Usuario y Categoría
En WordPress con WooCommerce, busco mostrar un precio diferente basado en el rol del usuario (mayorista, distribuidor, etc.) Y basado en la categoría.
Existe un plugin de precios dinámicos que muestra estos descuentos una vez que se agrega un artículo al carrito, pero no en la página misma.
¿Hay alguna manera de usar un filtro o acción para verificar el nivel del usuario, comprobar la categoría del artículo y luego cambiar el precio dinámicamente?
// Ejemplo de solución:
add_filter('woocommerce_product_get_price', 'ajustar_precio_por_rol_y_categoria', 10, 2);
add_filter('woocommerce_product_get_regular_price', 'ajustar_precio_por_rol_y_categoria', 10, 2);
function ajustar_precio_por_rol_y_categoria($price, $product) {
// Obtener el rol del usuario actual
$user = wp_get_current_user();
$user_roles = $user->roles;
// Obtener las categorías del producto
$product_categories = get_the_terms($product->get_id(), 'product_cat');
// Definir los descuentos por rol y categoría
$descuentos = array(
'mayorista' => array(
'electronica' => 0.20, // 20% descuento
'ropa' => 0.15 // 15% descuento
),
'distribuidor' => array(
'electronica' => 0.30, // 30% descuento
'ropa' => 0.25 // 25% descuento
)
);
// Aplicar descuento si corresponde
if (!empty($user_roles) && !empty($product_categories)) {
foreach ($user_roles as $role) {
foreach ($product_categories as $category) {
if (isset($descuentos[$role][$category->slug])) {
$precio_con_descuento = $price * (1 - $descuentos[$role][$category->slug]);
return $precio_con_descuento;
}
}
}
}
return $price;
}

Sí, existe la posibilidad. Puedes utilizar el hook de filtro woocommerce_get_price
para filtrar el valor según el rol del usuario y devolver un precio acorde, por ejemplo:
add_filter('woocommerce_get_price', 'custom_price_WPA111772', 10, 2);
/**
* custom_price_WPA111772
*
* Filtra el precio basado en la categoría y el rol del usuario
* @param $price
* @param $product
* @return
*/
function custom_price_WPA111772($price, $product) {
if (!is_user_logged_in()) return $price;
//Verificar si el producto está en una categoría específica, por ejemplo camisas
if( has_term( 'shirts', 'product_cat' ,$product->ID) ) {
//Verificar si el usuario tiene el rol de distribuidor usando una función auxiliar (ver abajo)
if (has_role_WPA111772('dealer')){
//Aplicar un descuento del 10%
$price = $price * 0.9;
}
}
return $price;
}
/**
* has_role_WPA111772
*
* Función para verificar si un usuario tiene un rol específico
*
* @param string $role Rol a verificar
* @param int $user_id ID del usuario
* @return boolean
*/
function has_role_WPA111772($role = '',$user_id = null){
if ( is_numeric( $user_id ) )
$user = get_user_by( 'id',$user_id );
else
$user = wp_get_current_user();
if ( empty( $user ) )
return false;
return in_array( $role, (array) $user->roles );
}

Gracias por esta gran respuesta. Por alguna razón, los precios de mis variaciones no cambian al usar este filtro. ¿Estás familiarizado con este problema?

Puedes probar el plugin de Precios Específicos para Clientes en WooCommerce. Con este complemento, puedes añadir diferentes precios para usuarios registrados.
Actualmente, el plugin se encuentra en su fase inicial, pero pronto habrá actualizaciones para incluir funciones adicionales como precios basados en categorías de productos.
