En esta oportunidad vengo a hablar acerca de un tema que afecta a prácticamente cualquier negocio de comercio electrónico o e-commerce y es como el titulo lo indica precios especiales para tipo de usuarios en woocomerce

Básicamente es una estrategia de pricing que consiste en aplicar descuentos que se aplica a esos usuarios mayoristas o distribuidores que compran una gran cantidad de piezas. Obviamente la rebaja en el precio siempre tiene un límite y normalmente los descuentos se aplican por tramos.

En wordpress existe el plugin pago Dynamic Pricing, con un costo de $129.00,  desarrollado por woocommerce, bastante completo e intuitivo, para aplicar descuentos, precios variantes y muchas otras opciones, sin embargo, en esta oportunidad te traemos un tutorial para que a través de filtros y funciones puedas realizarlos sin ayuda de ningún plugin y puedas ahorrarte algún dinero.

its-free

Antes de comenzar, ten en cuenta que este tutorial consta de 4 pasos, los cuales se añaden en el functions.php del tema que estés usando en tu tienda virtual.

1.- CREAR NUEVO ROL (OPCIONAL)

El primer paso es crear un nuevo rol de usuarios, a los cuales les quieres aplicar el precio especial, esto es, solo si no quieres usar los roles predeterminados de woocommerce, de ser asi continua al paso 2 ya cambia ‘cliente_mayorista’ por el nombre de rol que quieras usar:

// Crea el rol de usuario "Cliente Mayorista" 
add_action( 'init', 'crea_rol_cliente_mayorista' ); 
function crea_rol_cliente_mayorista(){
     $customer_role = get_role( 'customer' );
     add_role( 'cliente_mayorista', __( 'Cliente Mayorista' ), $customer_role->capabilities );
}
2.- COMPROBAR ROL DE USUARIO

El segundo paso es crear una función para comprobar el rol del usuario

// Buscando el rol del usuario 
function usuario_mayorista( $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 );
 }
3.- APLICAR EL DESCUENTO PARA EL TIPO DE USUARIO

El tercer paso es crear filtros y funciones para aplicar el descuento por tipo de usuarios

// Aplica un precio especial dependiento del tipo de usuario
add_filter( 'woocommerce_get_price', 'aplica_precio_mayorista', 10, 2);
function aplica_precio_mayorista( $price, $product ) {
    if (!is_user_logged_in()) return $price;
    // Listando todos los productos
    $product_list = array();
    // % Descuento a aplicar
    $discount = 30;
    // Comprueba si el producto actual pertenece a la lista
    if( in_array( $product->id, $product_list ) || empty( $product_list ) ) {
        // Comprueba si el usuario tiene rol 'cliente_mayorista' para aplicar descuento
        if( usuario_mayorista( 'cliente_mayorista' ) ){
            $porcent =  $price * ( $discount / 100 );
            // redondeando el precio
            $price = round($price - $porcent);
        }
    }
    return $price;
}

Una vez realizado los cambios, antes de guardar, realiza tu configuración personal, tanto para el descuento, como para la lista de productos a los que se les va a aplicar.

Para modificar el porcentaje de descuento sustituye el número de la línea:

$discount = 30;

Si por ejemplo quieres hacer un 50% de descuento quedaría de la siguiente forma:

$discount = 50;

Ahora para definirla lista de productos específicos, basta con definir dentro del array los id de los productos, y modificar esta línea, que este momento trae todos los productos existentes:

$product_list = array();

Si por ejemplo quieres aplicar descuento a productos específicos, ve a tu lista de productos y sitúa el cursor de mouse sobre el producto y copia su id, quedaría de la siguiente forma:

$product_list = array( '14', '200' );
4.- DEFINIR USUARIOS CON EL NUEVO ROL (OPCIONAL)

En caso de que hallas creado un rol tal como se indica en el paso 1 de este tutorial, para finalizar solo queda definir a los usuarios, que disfrutaran del descuento, para ello, ve a la sección de usuarios, marca a todos los usuarios que consideres, y cambia el perfil al nuevo rol creado.

¡Bien!, ya tienes configurado precios especiales para tipo de usuarios en woocommerce.

ADICIONAL (DESCUENTOS EN PRODUCTOS VARIANTES)

En caso de que desees aplicar descuentos a productos variables añade esta función:

// Aplica un precio especial al precio variante dependiento del tipo de usuario
 add_filter('woocommerce_variable_price_html', 'aplica_precio_mayorista_variant', 10, 2);
 function aplica_precio_ mayorista_variant( $price, $product ) {
      // obteniendo el precio de venta
      $price = $product->min_variation_price;
     if (!is_user_logged_in()) return '<span class="amount">$'.number_format($price, 2, '.', '').'</span>';
     // Listado de productos con precio especial
     $product_list = array();
     // % Descuento a aplicar     $discount = 30;
     // Comprueba si el producto actual pertenece a la lista
     if( in_array( $product->id, $product_list ) || empty( $product_list ) ) {
         // Comprueba si el usuario tiene precio especial
         if( usuario_mayorista( 'cliente_mayorista' ) ){
             $porcent =  $price * ( $discount / 100 );
             $price = round($price - $porcent);
         }
     }
     // como el precio variante se obtiene en html se formatea para conservar los estilos de woocommerce
     $priceformated = '<span class="amount">$'.number_format($price, 2, '.', '').'</span>';
     return $priceformated;
 }
ADICIONAL (MONTO MINIMO DE ORDEN ESTABLECIDO)

Si luego de que aplicas un precio especial a tu usuario mayorista, requieres que este tenga establecido un mínimo en el costo final de su orden, añade las siguientes líneas:

add_action( 'woocommerce_after_checkout_billing_form', 'wc_minimum_order_amount' );
add_action( 'woocommerce_checkout_process', 'wc_minimum_order_amount' );
add_action( 'woocommerce_before_cart' , 'wc_minimum_order_amount' );
function wc_minimum_order_amount() {
    // verificando rol de usuario
    if( usuario_con_precio_especial( 'cliente_mayorista' ) ){
    $minimum = 1389;
    if ( WC()->cart->total < $minimum ) {
        if( is_cart() ) {
            wc_print_notice( 
                sprintf( 'Como usuario distribuidor debe tener una orden de almenos <strong>%s</strong> para hacer su pedido, el total de su orden actual es <strong>%s</strong>' , 
                    wc_price( $minimum ), 
                    wc_price( WC()->cart->total )
                ), 'error' 
            );
        } else {
            wc_add_notice( 
                sprintf( 'Como usuario distribuidor debe tener una orden de almenos <strong>%s</strong> para hacer su pedido, el total de su orden actual es <strong>%s</strong>' , 
                    wc_price( $minimum ), 
                    wc_price( WC()->cart->total )
                ), 'error' 
            );
        }
    }
    }
}

Modifica la siguiente línea por el monto mínimo permitido que desees:

$minimum = 1389;