Tutoriales

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().Nota: Hay una valoración incrustada en esta entrada, por favor, visita esta entrada para valorarla.

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

Francisco Javier Carazo Gil

Entradas recientes

Checkout seguro: cobra sin perder conversiones

Configura un checkout seguro en WordPress y WooCommerce para proteger pagos, reducir errores de integración…

hace % días

Checkout seguro: cobra sin perder conversiones

Configura un checkout seguro en WordPress y WooCommerce para proteger pagos, reducir errores de integración…

hace % días

¿Qué aporta la integración de Bizum y métodos similares en el proceso de pago?

El comercio electrónico español, que se encuentra en pleno crecimiento y transformación, vive actualmente un…

hace % días

Mejores addons para suscripciones WooCommerce

Compara los mejores addons para suscripciones WooCommerce y elige pagos, membresías y automatizaciones compatibles con…

hace % días

Mejores addons para suscripciones WooCommerce

Compara los mejores addons para suscripciones WooCommerce y elige pagos, membresías y automatizaciones compatibles con…

hace % días

Desarrollo de plugins a medida WordPress

El desarrollo de plugins a medida WordPress resuelve pagos, reservas y flujos propios con integración…

hace % días