Esconder otros métodos de envío cuando el envío gratuito esté disponible en WooCommerce

Cuando estás creando una tienda para un cliente con WooCommerc, o cuando damos asesoría para cuestiones técnicas sobre el tema, es bastante frecuente que surja la siguiente pregunta: ¿por qué si hay envío gratuito me deja escoger otros métodos de envío? Y es que por defecto, WooCommerce te deja crear un envío gratuito de forma sencilla, pero cuando se activa porque se cumplen las condiciones, no oculta los otros métodos así que tenemos el absurdo de que junto con el envío gratuito aparecen otros métodos. Y claro, para un cliente, es además de confuso, señal de que la web no está “acabada” porque es lo típico que nunca debería pasar.

WooCommerce permite incluir envío gratuito de forma sencilla en tus métodos de envío, pero al no ocultarlo cuando hay otros métodos activos, genera confusión en tus clientes y sensación de web poco cuidada o de baja calidad

Ya hablaremos otro día largo y tendido del envío gratuito en WooCommerce, pero la idea de esta entrada no es entrar en eso, sino explicaros la parte técnica: el cómo se oculta el resto de envíos.

Así que bueno, os dejo el código y ahora como siempre lo comentamos. Podéis incluirlo en el functions.php de vuestro tema hijo, en cualquier otro fichero que llaméis desde él o en vuestro plugin de funciones.

function cod_ocultar_otros_envios_menos_gratuito( $rates ) {
  $free = array();
  foreach ( $rates as $rate_id => $rate ) {
    if ( 'free_shipping' === $rate->method_id ) {
      $free[ $rate_id ] = $rate;
      break;
    }
  }
  return ! empty( $free ) ? $free : $rates;
}
add_filter( 'woocommerce_package_rates', 'cod_ocultar_otros_envios_menos_gratuito', 100 );

Este pequeño trozo de código está indicado en la documentación oficial de WooCommerce, así que a lo mejor ya lo conocéis. Pero bueno, lo importante no es tanto copiarlo y pegarlo como un papagallo sino entender qué hace y adaptarlo.

  1. Se crea una función que se une a un hook de tipo filtro, eso quiere decir que recibirá unos datos, los modificará y los devolverá a la secuencia de ejecución estándar de WooCommerce
  2. El gancho al que nos cogemos es “woocommece_packages_rates” que incluye los métodos de envío disponibles, dichos métodos, vienen en un array lleno de objetos con estos métodos
  3. Se reciben esos métodos y se itera por ellos
  4. Si se encuentra un método de tipo gratuito, se guarda ese método en una colección ($free) y se termina la iteración para mejorar el rendimiento y no iterar sobre el resto de métodos
  5. Si no, ese array $free permanecerá vacío

Al terminar tenemos dos casos diferenciados:

  • Si se ha encontrado el método gratuito, tenemos $free que no está vacío y se devuelve con solo el método gratuito dentro
  • Si no, se devuelve $rates tal cual entró en la función

Esto es lo que se hace en la última línea pero el operador ternario hace que sea un poco más abstracto, dicho de otra forma sería así:

return ! empty( $free ) ? $free : $rates;

/* es lo mismo que */
if( !empty( $free ) )
   return $free;
else
   return $rates;

El resultado obtenido es justo el que queremos: si no está el método gratuito el código no afecta para nada, pero si está, el código creará una colección nueva que devolver a WooCommerce sólo con ese método, y así el usuario sólo verá disponible el envío gratis y con eso, se habrá acabado nuestro problema.

 1 estrella2 estrellas3 estrellas4 estrellas5 estrellas (1 votos, promedio: 5,00 de 5)

Cargando…

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

Carrito

loader