Envío gratuito diferente según rol del usuario en WooCommerce

Cuando estamos desarrollando una tienda online es muy frecuente que el cliente nos pida: quiero que los pedidos gratuitos, lo sean a partir de una cantidad establecida del carrito. Hasta ahí es normal. Pero a veces también incluyen: esa cantidad variará en base a si es un cliente normal o un mayorista.

Así que bueno, la cosa se complica un poco y no se puede hacer a base de interfaz gráfica. Seguro que hay algún plugin por ahí para hacerlo, pero francamente, somos enemigos de usar plugins para esas tareas tan concretas. No tiene sentido cargar tu sistema con una cantidad tan enorme de código extra para resolver un problema que puedes resolver con una función sencilla.

Os dejo el tip de código, para que le echéis un vistazo por si podéis aprovecharlo. Si tenéis dudas, ya sabéis, sólo preguntad.

add_filter( 'woocommerce_shipping_free_shipping_is_available', 'cod_woocommerce_shipping_free_shipping_is_available', 9999, 3 );
function cod_woocommerce_shipping_free_shipping_is_available( $is_available, $package, $shipping_method ){
  $rol_actual = cod_get_role_current_user();

  switch ( $rol_actual ) {
    case 'mayorista':
      $min_amount = 300;
      break;
    
    default:
      $min_amount = 100;
      break;
  }

  $total = WC()->cart->get_displayed_subtotal();
  $has_met_min_amount = false;

  if ( WC()->cart->display_prices_including_tax() ) {
    $total = round( $total - ( WC()->cart->get_discount_total() + WC()->cart->get_discount_tax() ), wc_get_price_decimals() );
  } else {
    $total = round( $total - WC()->cart->get_discount_total(), wc_get_price_decimals() );
  }

  if ( $total >= $min_amount ) {
    $has_met_min_amount = true;
  }

  return $has_met_min_amount;
}

Así que os comento rápidamente el código:

  • Debes tener el envío gratuito activado en la zona de envío donde sea oportuno
  • Usamos un hook creado por WooCommerce justo para eso, para devolver true o false si debe estar disponible el envío gratuito
  • Si os fijáis uso un número muy grande en la prioridad, para asegurarme que se ejecuta lo más tarde posible y aparte indico el número de parámetros a enviar
  • Pedimos el rol del usuario, eso lo hacemos con una función propia, que mañana comentaremos
  • Ponemos una cantidad mínima en base al rol, o mayorista o el resto
  • Calculamos el total del carrito
  • Vemos si el total es mayor o no que la cantidad establecida

Tan sencillo como práctico, mañana os dejo el código de cómo obtener el rol de un usuario, con la función esa que indico ahí: cod_get_role_current_user().1 estrella2 estrellas3 estrellas4 estrellas5 estrellas (Ninguna valoración todavía)

Cargando…

Almacenamos las IPs desde la que se envían las valoraciones para evitar fraudes

Carrito

loader