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

¿Por qué falla Bizum en WooCommerce? 9 causas

Por qué falla Bizum WooCommerce: detecta errores de credenciales, firma, entorno y pedidos para recuperar…

hace % días

Plugin gratuito Redsys WordPress: qué revisar

Elige un plugin gratuito Redsys WordPress con criterio: compatibilidad, seguridad, configuración bancaria y límites para…

hace % días

Qué necesito para activar CECA Online en mi web

¿Qué necesito para activar CECA Online? Revisa contrato bancario, datos del terminal, seguridad, pruebas y…

hace % días

Cómo elegir una pasarela para suscripciones

Aprende a elegir una pasarela para suscripciones en WordPress: revisa recurrencia, compatibilidad, seguridad y soporte…

hace % días

Plugin Bizum WordPress para cobrar con control

Elige un plugin Bizum WordPress compatible con tu flujo de venta, configura la pasarela bancaria…

hace % días

Cómo aceptar CECA en reservas de WordPress

Aprende cómo aceptar CECA en reservas WordPress, configurar pagos seguros y confirmar cada reserva sin…

hace % días