Configurar envío gratis a determinados productos en WooCommerce

Un cliente me comentó la posibilidad de incluir envío gratis ya no solo a partir de una cierta cantidad si no también para productos determinados siempre y cuando solo compren dichos productos, si se añade al carrito un producto que este fuera de los seleccionados, el envío se cobraría igualmente.

Esto se puede conseguir sin plugins adicionales, solamente hay que usar las clases de envío y un pequeño snippet para dejarlo perfecto.

  • Lo primero es dirigirse a WooCommerce > Ajustes > Envío > Clases de envío donde añadiremos una clase de envio que llamaremos “Envío gratis” o como quieras nombrarlo.
  • Desde el mismo sitio volvemos a “Zonas de envío” y editamos la que tengamos configurada de forma que quede como la siguiente captura:

El coste del envío hay que dejarlo en blanco ya que el precio lo asignará en función a la clase de envío que tenga el producto, si el producto tiene la clase de envío “Envío gratis” el coste del envío será de 0 € (gratis), en cambio si no tiene asignada ninguna clase de envío el coste será el predeterminado que en este caso es de 6 € (en la captura aparece sin IVA).

  • Seguidamente vamos al producto en cuestión que queramos que se le aplique el envío gratis y en la pestaña de “Envío” seleccionamos como clase de envío la que hemos creado

  • Hecho esto si añadimos este producto al carrito veremos que no se cobra envío, en cambio si añadimos cualquier otro que no tenga definida una clase de envío, el coste del envío se aplica directamente.

Lo que ocurre es que si añadimos solamente ese producto con envío gratuito, para quien lo compra no parece demasiado evidente ya que no aparece la palabra “gratis” si no que toma por defecto la que esté configurada en esa zona de envío (en este caso “Mensajería).

Para solucionar esto basta con añadir el siguiente snippet en el functions.php de tu theme:

/* clase de envio gratis */
function etiqueta_envio_gratis( $label, $method ) {

    if ( 0 == $method->cost ) {
        $label = 'Envío gratis';
    }

    return $label;
}
add_filter( 'woocommerce_cart_shipping_method_full_label', 'etiqueta_envio_gratis', 10, 2 );

Con esto, siempre que el coste del envío sea 0 € se cambiará la etiqueta del envío a “Envío gratis”, de esta forma cuando se añada un producto con la clase de envío que hemos creado se reemplazará la etiqueta de envío configurada por la del snippet.