Un aliciente para conseguir más ventas en nuestra tienda online es la de ofrecer promociones o descuentos a partir de una cantidad mínima de pedido. Unos de los recursos más utilizados es ofrecer el envío gratuito.
Siendo conscientes de que a WooCommerce le queda un largo camino para convertirse en un estándar como plataforma de E-Commerce, debido precisamente a sus muchas carencias y limitaciones en su base, podemos ofrecer esta alternativa de envío gratuito no sin algún que otro «extraño» que como veremos en este artículo podremos solucionar aplicando un pequeño «parche».
Añadiendo el método de envío gratuito
Desde el «limitado» configurador de envíos de WooCommerce, supongamos que tenemos un coste fijo de 4.5€ por envío, pero queremos que cuando el carrito llegue o supere los 50€, el envío salga gratis.
Para ellos nos dirigiremos a la sección de Envío dentro de WooCommerce:
En el que podemos ver que para la zona España existe un método de envío configurado consistente en un precio fijo, sea cual sea el importe de carrito.
Vamos a añadir un nuevo método de envío para la zona de España, haciendo clic en el enlace España, y el botón Añadir método de Envío:
En la ventana modal que se abrirá seleccionamos de la lista: Envío gratuito y lo añadimos como método de envío:
Ahora editamos el nuevo método de envío, pasando el ratón por encima, aparecerá el enlace Editar:
En esta pantalla podemos seleccionar el nombre que aparecerá como Envío en el carrito de compra (por defecto Envío gratuito), y seleccionaremos la condición requerida para que el método de envío se active.
En este caso seleccionaremos «Una cantidad mínima de pedido», y en el siguiente campo el importe mínimo (50€).
Guardamos los cambios y añadimos unos cuantos artículos al carrito para ver el resultado.
Podemos fijarnos que el método de Envío gratuito aparece al cumplirse la condición de que el carrito supere los 50€, pero esta no es una «solución natural», ya que obligas al cliente a elegir el método de envío gratuito, cosa que no tiene sentido, pues ningún cliente querría seleccionar pagar por el envío. Es más, si el cliente se equivoca y elige pagar, para después descubrir que le podría haber salido gratis, seguramente recibamos una reclamación, y no queremos eso.
Lo ideal sería, que superados los 50€ en el carrito, se activase automáticamente el envío gratuito y no apareciera ninguna opción más.
Añadiendo la función al archivo de funciones del tema activo
Eso han debido pensar los desarrolladores de WooCommerce, ya que ellos mismos han lanzado una función para este problema, que de momento, en la versión 3.5.3, no está integrada en el núcleo.
En la siguiente página de la documentación oficial de WooCommerce, podréis encontrar la función según vuestra versión:
URL documentación: https://docs.woocommerce.com/document/hide-other-shipping-methods-when-free-shipping-is-available/
Para versiones de WooCommerce 3.0 en adelante, hay que incluir este código en el archivo de funciones de vuestro tema activo, o en vuestro plugin de funciones personales si lo tenéis habilitado:
/**
* Hide shipping rates when free shipping is available.
* Updated to support WooCommerce 2.6 Shipping Zones.
*
* @param array $rates Array of rates found for the package.
* @return array
*/
function my_hide_shipping_when_free_is_available( $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', 'my_hide_shipping_when_free_is_available', 100 );
Y este para versiones de WooCommerce hasta la 2.5:
/**
* woocommerce_package_rates is a 2.1+ hook
*/
add_filter( 'woocommerce_package_rates', 'hide_shipping_when_free_is_available', 10, 2 );
/**
* Hide shipping rates when free shipping is available
*
* @param array $rates Array of rates found for the package
* @param array $package The package array/object being shipped
* @return array of modified rates
*/
function hide_shipping_when_free_is_available( $rates, $package ) {
// Only modify rates if free_shipping is present
if ( isset( $rates['free_shipping'] ) ) {
// To unset a single rate/method, do the following. This example unsets flat_rate shipping
unset( $rates['flat_rate'] );
// To unset all methods except for free_shipping, do the following
$free_shipping = $rates['free_shipping'];
$rates = array();
$rates['free_shipping'] = $free_shipping;
}
return $rates;
}
En nuestro ejemplo vamos a ir a Apariencia – Editor y seleccionamos nuestro tema activo. Localizamos el archivo de funciones (functions.php) y pegamos el código al final del archivo.
Muy importante: Siempre que hagamos cambios en archivos internos del tema, hacer una copia de seguridad del archivo.
Actualizamos y antes de probar la nueva función, vaciamos la caché de WooCommerce en:
WooCommerce – Estado – Pestaña Herramientas – Borrar datos temporales
Ahora sí, nos dirigimos nuevamente al carrito y actualizamos:
IMPORTANTE SI USAS EL MÉTODO DE RECOGIDA EN LOCAL
Si tienes habilitada la opción Recogida en local, el código anterior también ocultará este método de envío dejando solamente el gratuito. Para que además del envío gratuito también aparezca el de Recogida en local tienes que usar este código (proporcionado también en la documentación de WooCommerce):
/**
* Hide shipping rates when free shipping is available, but keep "Local pickup"
* Updated to support WooCommerce 2.6 Shipping Zones
*/
function hide_shipping_when_free_is_available( $rates, $package ) {
$new_rates = array();
foreach ( $rates as $rate_id => $rate ) {
// Only modify rates if free_shipping is present.
if ( 'free_shipping' === $rate->method_id ) {
$new_rates[ $rate_id ] = $rate;
break;
}
}
if ( ! empty( $new_rates ) ) {
//Save local pickup if it's present.
foreach ( $rates as $rate_id => $rate ) {
if ('local_pickup' === $rate->method_id ) {
$new_rates[ $rate_id ] = $rate;
break;
}
}
return $new_rates;
}
return $rates;
}
add_filter( 'woocommerce_package_rates', 'hide_shipping_when_free_is_available', 10, 2 );
Veremos cómo ahora, el envío gratuito es activado automáticamente si el importe del carrito es igual o supera los 50€, no mostrando ni permitiendo seleccionar otro método.
Espero que este tipo de «parches» y complementos se vayan incorporando o afinando en el núcleo de WooCommerce en el futuro, si queremos tener una plataforma completa de e-commerce, más que un añadido de WordPress para vender productos. Seguro que poco a poco lo vamos consiguiendo…
Si te ha gustado el artículo, no olvides compartirlo en tus redes o guardarlo en tus favoritos para futuras consultas.
Nos vemos en el siguiente post! 😉
jesus lamuño dice
Muchas gracias por este «truco». Me ha venido muy bien para mi tienda on-line.
DANIEL ERAZO dice
Hola Comunidad
Soy nuevo en woocommerce y quiero hacerles una consulta
Tengo una tienda electronica en la que se me esta solicitando que un producto específico tenga free shipping.
La tienda tiene el plugin instalado de woocommerce advanced free shipping
ya hice que el wordpress detectara el producto que lleva freeshipping para que aparezca el metodo de envio al realizar el pago
Sin embargo, cuando el produto que tiene free shipping esta acompañado de otros productos que no tienen free shipping igual me aparece la opción de envio gratis porque en el carrito esta el producto que si tiene lo tiene activo, causando confusion y problemas ya que los usuarios finales estan comprando cualquier producto junto a este prodcuto con freeshipping para beneficiarse de este error logico y de condición
Yo necesito que el wordpress pueda detectar que si en el carrito de compras esta este producto con envio gratis junto a otros productos que no tienen envio gratis si cobre solo el envio de productos que no tienen la opcion activa y no el de los productos que tienen la opcion activa.
Perdon si se escucha confuso!!
Necesito ayuda por favor!!!
Daniel, Gestionatuweb.net dice
Hola Daniel, lo único que se me ocurre es que crees una clase de envío para ese producto y la pongas a coste 0. En ese caso, si en el carrito solo está ese producto, el coste de envío será cero, pero si hay más productos, aplicará el coste que hayas configurado en los otros productos.
Si esto no funciona, crea también una clase de envío para el resto de productos, con su importe, y selecciona la opción de calcular coste por la clase de envío más cara. Así debería diferenciar tu producto gratuito del resto.
Victor dice
Hola, muchas gracias, me ha venido fenomenal!
Ludovic dice
Gracias por el aporte. Muy práctico.