Aplicar envío gratis a ciertos productos en WooCommerce

De nuevo, y como ya ha ocurrido antes con otros artículos del blog, he decidido publicar esta entrada para resolver una duda que veo que se repite entre los lectores del blog y que surge de la necesidad de aplicar envío gratis a ciertos productos en WooCommerce.

No. No me estoy refiriendo a configurar el envío gratuito en WooCommerce, ese tema ya lo tratamos en su día en otro artículo.

En la página de ajustes de envíos de WooCommerce, sólo deja configurar el envío gratuito para que se aplique a partir de un gasto mínimo por pedido. Es decir, que el cliente debe hacer un pedido cuyo coste total sea igual o superior a ese mínimo establecido para que no se le cobren gastos de envío.

Pero ¿qué pasa si en nuestra tienda hay varios productos a los que no queremos aplicar gastos de envío independientemente del coste del pedido? Con los ajustes básicos de envío de WooCommerce no podrás hacerlo, necesitarás aplicar alguno de los dos métodos que te explico a continuación.

2 Técnicas para aplicar gastos de envío gratuitos con WooCommerce en determinados productos.

Como siempre suelo hacer, voy a explicar diferentes formas de hacerlo y tú eliges la que más te convenga. Eso no quiere decir que no se pueda conseguir usando otros métodos.

METODO 1 – Sin usar plugin

Este método es el menos «elegante» de los dos, pero sin duda es el más sencillo y rápido de aplicar. Además, tiene la gran ventaja de que no vas a necesitar instalar ningún plugin, ahorrando de nuevo recursos en tu hosting. (Ya sé que soy un poco pesado con este tema, pero cuantos menos plugins instalados tengas, mucho mejor. Sobre todo, si ya estás recibiendo un volumen de visitas considerable).

Este método consiste en marcar como virtuales los productos para los que no quieres cobrar los gastos de envío.

Simplemente entra en la página de edición de cada producto y en el apartado «Información del producto«, marca la opción «Virtual«.

No cobrar gastos envío producto WooCommerce

Al marcar un producto como virtual, lo que le estás diciendo a WooCommerce es que no se trata de un producto físico y como tal, no es necesario enviarlo físicamente. De esta forma, WooCommerce no mostrará ningún tipo de gasto de envío en el carrito ni en la página de pago.

Aunque tu producto realmente si sea físico y tenga unas dimensiones y un peso, lo que te interesa es que WooCommerce no le aplique gastos de envío. Punto.

De cara al proceso de compra, todo sigue igual. El cliente no notará nada.

La única particularidad, es que al interpretarlo WooCommerce como un producto virtual, no permitirá al cliente añadir una dirección de envío diferente a la de facturación en la página de pago. Para resolver esto, simplemente debes pegar el siguiente código al final del fichero functions.php de tu tema:

add_filter( 'woocommerce_cart_needs_shipping_address', '__return_true', 50 );

MÉTODO 2 – Usando el plugin WooCommerce Advanced Free Shipping

Este método se podría decir que es más óptimo en cuanto a la configuración, pero ya si requiere el uso de un plugin; el plugin WooCommerce Advanced Free Shipping.

Este plugin no sólo sirve para aplicar envíos gratuitos a determinados productos, sino que también te permite definir multitud de reglas para aplicar el envío gratuito basándase en otra información, como por ejemplo; la información del carrito (impuestos, subtotal, cantidad…), los datos del cliente (país, código postal, rol del usuario…) o incluso en los datos del producto (dimensiones, categoría, inventario…).

Para este caso, vamos a usar el plugin sólo para definir una regla que aplique el envío cuando ciertos productos estén en el carrito.

A continuación, te explico paso a paso cómo hacerlo:

  1. Una vez instalado y activado el plugin (lo puedes descargar desde el repositorio oficial de plugins de WordPress), debes ir a su panel de configuración entrando en «WooCommerce > Ajustes > Envío > Envío Gratis Avanzado».
  2. Añade una nueva regla de envío haciendo clic en «Añadir método de envío gratis«.
  3. Ahora viene la parte más importante, definir las condiciones para que se aplique el envío gratuito.
    Hay que definir una condición por cada producto. Para ello, en el primer campo selecciona la opción «Contiene producto«, en el segundo campo selecciona «Igual a» y en el tercer y último campo, elige el producto que te interese dentro del listado. A continuación, te muestro una captura de ejemplo:
    Configurar envío gratis para algunos productos WooCommerce
  4. Escribe un título descriptivo para la regla de envío que acabas de crear -por ejemplo, «Envío gratuito para determinados productos»- y haz clic en «Publicar«.
  5. Por último, vuelve a la página de configuración de «Envío Gratis Avanzado» y marca las opciones «Habilitar/Deshabilitar» y «Ocultar otros envíos«. No olvides guardar los cambios, de lo contrario no se aplicará el envío gratuito.

En el caso de que decidas usar el plugin WooCommerce Advanced Free Shipping, para evitar que se aplique envío gratis a todo el carrito cuando haya productos que si tengan gastos de envío, deberás pegar el siguiente código en el fichero functions.php de tu tema.

Una vez pegado el código anterior, entra de nuevo en la página de configuración de tu regla de envío gratuito avanzado. Y ahora en cada condición, en lugar de escoger la opción «Contiene producto«, debes escoger una nueva opción disponible llamada «Only product in cart«.

Ambos métodos funcionan perfectamente, la única diferencia es que con este segundo método, cuando se añade el producto al carrito, en los detalles del pedido (justo debajo del subtotal) se muestra el texto «Envío gratis» y con el primer método, no se muestra ningún texto referente al envío.

Envío gratuito WooCommerce para determinados productos

Obviamente, si un cliente añade al carrito otros producto por los que si cobras gastos de envío, esos gastos se sumarán al coste total del pedido.

Mi recomendación es que si vas a aplicar los gastos de envío gratuitos en WooCommerce siempre a los mismos productos, utilices el primer método. En cambio, si cada cierto tiempo vas a añadir nuevos productos a tu lista de productos sin gastos de envío, entonces usa el método 2, ya que la gestión será mucho más sencilla.

NOTA: La solución que expongo en esta entrada sólo servirá para pedidos de un mismo producto. Es decir, si en el mismo pedido se incluyen productos con gastos de envío y productos con envío gratuito, entonces esta solución no es válida porque se aplicará envío gratis a todo el carrito. Este problema se soluciona con el código snippet anterior.

49 comentarios en “Aplicar envío gratis a ciertos productos en WooCommerce”

  1. Amigo , seguí tu tutorial con interés pero para mi no funciono, no se si hay algún conflicto con algún otro plugin pero para mi no funciono

    1. Debes considerar que el articulo no tiene fecha de publicación pero, puedes ver que los primeros comentarios son del año 2015.
      Puede que a esta fecha exista otro plugin que haga lo que deseas o el plugin en cuestión haya mejorado sin la necesidad del snippet.

  2. Hola Antonio, quería comentar que el primer método está correcto, pero tiene una pega y es que si marcas un producto como virtual y tienes sincronizado woocommerce con una tienda en facebook/instagram, dichos productos no se mostrarán. No se sincronizan con facebook, aparece solo la opción «sincronizar y ocultar en el catálogo»

    Descubierto esto, pasé al método 2. Bien, pero tengo un problema. Resulta que tengo una categoría llamada A, que quiero que sean gratis los portes para la península. Configuro una regla en la que le digo que el país sea España, y la provincia no debe ser igual a Ceuta, Melilla, Baleares y Canarias y que la categoría sea A. Hasta aquí todo correcto, el problema viene cuando añado un producto de otra categoría, por ejemplo B. En ese caso me gustaría que pusiera los portes del producto de la categoría B y la verdad es que he hecho mil pruebas y no me sale

  3. Hola, he instalado el plugin y pegado el código que comentas, así como demás instrucciones.
    Y ocurre lo siguiente:
    Si añado un producto con gastos de envío, me pone 10 euros.
    Si añado un producto sin gastos de envio, me pone que esta incluido en el precio.
    Hasta ahí correcto todo.
    Problema:
    Pero si en el carrito pongo esos 2 productos juntos, los gastos de envío no me pone 10 euros que es lo lógico, sino que me pone 13 euros el envío, es como sumara el peso y la condicional de envío gratis no lo toma.

  4. Hola Antonio.
    Gracias por tu trabajo que nos ayuda mucho a los que vamos como pollo sin cabeza en algunos temas.

    He probado el método 2, increíble. Me funciona perfectamente porque lo que busco es que si en el carrito aparece un artículo con gastos de envío Gratuitos afecte esa regla a todos los demás artículos.
    Mi duda es si existe una forma más rápida de configurar el plugin. Es decir, si tengo 2835 artículos en mi tienda la mitad van con gastos de envío gratuito, y ponerlos 1 a 1 es un …….azo.

    Como podría decirle al plugin “todos los artículos que su precio sea superior a “X”€ van con gastos de envío gratuitos.
    Y con una simple orden se haga, con este plugin o con otro que me aconsejes. Porque si tengo que poner a mano 1 a 1 toooodos los artículos que les afecta esta regla. Puede que el Plugin explote.

    Un saludo y gracias por tu tiempo.

    1. Hola Vicente!

      Deberías agrupar los productos en una clase de envío llamada por ejemplo «Envío gratis» y en el plugin de envíos configurar una regla que active el envío gratis cuando en el carrito haya algún producto perteneciente a esa regla de envío.

      Para asignar por bloques esos productos a una clase de envío sin tener que ir uno a uno, te explico cómo hacerlo aquí

      Espero que te sirva.

      Saludos!

  5. Hola.
    Yo quiero hacerlo para productos con variantes y el método 1 no soy capaz de hacerlo.
    Es decir, al ser un producto variable no me deja marcarlo como Virtual.
    Alguna idea?.
    Me valdría el módulo para lo que quiero?.
    Mil gracias.

  6. Hola, a mi me gustaría poner que unos productos de un proveedor no sumen para llegar a los gastos gratuitos de 30€ pero con estas indicaciones no me sale. Como podría hacerlo? Gracias un saludo

    1. Hola Iker!

      Eso lo puedes hacer con Super Shipping y su opción de cálculo de envío basado en clases de envío.

      Agruparías esos productos en una clase de envío («Sin envío gratis» por ejemplo) y el resto en otra clase diferente (también podrías dejar estos últimos sin clase).

      Y después con Super Shipping decirle que solo los productos que NO son de esa clase «Sin envío gratis», tendrán envío gratis a partir de 30€ de gasto ?

      Tienes toda la info y una demo del plugin aquí.

      Saludos!

      1. Muchas gracias por tu respuesta, el otro día compré el plugin Booster Plus for WooCommerce, podría hacerlo con este? veo que son parecidos pero es que no consigo configurarlo tampoco por clases diferentes.

        https://prnt.sc/sym3uj

        Saludos

        1. Hola Iker!

          No he probado antes Booster Plus for WooCommerce, pero según he podido ver en la captura que me has compartido, parece que si se puede hacer.

          Saludos!

          1. Hola Antonio, no sabía que el plugin supershipping era tuyo. Voy a comprarlo y probar lo que me dices porque con el otro no lo consigo. Gracias

          2. Vale lo tengo, si me puedes echar un cable con la configuración del plugin.

            Lo que necesito es que unos productos de un proveedor o de una categoría tengas sus propios gastos de envío (que son 0) ya que se hace dropshipping, y los demás productos tengan los gastos de envío ya configurados en wordpress. Y que si hay un producto de cada proveedor o categoría en el carrito cada uno funcione con sus propios gastos de envío.

            Muchísimas gracias
            P.D.: si necesitas mis credenciales para verlo mejor desde dentro puedo mandarlas.

          3. Hola Iker!

            Para eso tienes que usar el tipo de cálculo «Por clase de envío» y agrupar los productos de dropshipping en una clase de envío para aplicarles costes de envío de 0€.

            Tienes más información sobre cómo configurarlo aquí.

            Para las consultas de soporte técnico del plugin usa el formulario que verás el clicar en el enlace «Consultas» del enlace que te he dejado antes 😉

            Saludos!

  7. Tengo activado el envío gratuito de forma correcta, pero al ir al pago me desaparece el método de envío contrareembolso con comisión, ya que el pedido aparece como envío gratis por superar el importe fijado.

    Como podemos hacer para que aunque el envío sea gratis si eligen envío contrareembolso se les aplique el recargo de 3,5€?

    Gracias, y un saludo

  8. Hola, tengo un producto concreto que no quiero que disponga de recogida en tienda-envío gratuito. Por tanto, lo que necesito es que sólo en ese producto se muestre el coste de envío a domicilio normal, y en el resto que siga tal cual lo tengo configurado.
    ¿Es posible? ¿Me podrías indicar cómo?

    Un saludo

  9. Hola Antonio.

    Gracias por el post.

    Te cuento que he aplicado el método 2 con el plugin con el código añadido en functions.php

    Hasta hace unas semanas funcionaba todo bien, pero ahora se me ha desconfigurado solo y no hay merara de volverlo a poner como estaba.

    Todo funciona bien excepto en el último paso, cuando elijo la opción «only product in cart» no me deja asociarla a un producto determinado. Me sale una círculo como si estuviera buscando el producto y se queda «pensando» eternamente.

    Creo que este error puede estar asociado a la última actualización o bien del plugin o bien de woocommerce y puede estar afectando a más usuarios.

    Hay alguna solución? Quizá una modificación en el código?

    Gracias de antemano.

  10. Tratando de hacerlo como en la primera opción al poner el código al final del fichero functions.php me aparece esto:

    Parse error: syntax error, unexpected end of file in /homepages/11/d612505656/htdocs/clickandbuilds/Almanatur/wp-content/themes/Activello-master/functions.php on line 269

    y la web ya no me funciona. Agradecería ayuda, no tengo ni idea de como solucionarlo.

    1. Hola Zazu,

      El mensaje de error que muestras indica que has añadido el snippet en un lugar del archivo functions.php que no es el correcto y por eso te genera el error.

      La forma más fácil de corregirlo es entrar a la carpeta de tu tema a través de FTP, abrir el archivo functions.php con un editor de código y eliminar el trozo de código que has añadido para dejar el archivo como estaba al principio. Por último, solo tienes que subir los cambios y listo.

      Otra opción es reemplazar el archivo functions.php completo por una versión anterior al día que añadiste el snippet.

      Aquí tienes un ejemplo de cómo hacerlo https://www.youtube.com/watch?v=P4yHt97Cf5I

      Insisto. El snippet funciona correctamente, pero si no se tienen conocimientos sobre el archivo functions.php, mejor delegar esa tarea en alguien experto, precisamente para evitar este tipo de situaciones desagradables.

      Espero que lo resuelvas pronto.

      Saludos!

  11. Muchas gracias, por tus posts.

    Me he decidido por el método del plugin, pero tiene un problema: Si añades 2 productos de envio gratis, se aplica coste al envio, ya que no cumple la norma «only product in cart».

  12. ¡¡Feliz año!!
    gracias por el post, me ha ayudado
    sin embargo, tengo un problema que no consigo resolver:
    – si en el carrito sólo añado productos simples – virtuales, no hay costes de envío. OK
    – si en el carrito sólo añado un producto variable para el que tengo configurada la regla que has indicado (he añadido a mi archivo funtions el código que has puesto), no me aplica costes de envío. OK
    – sin embargo si en el carrito añado productos simples – virtuales y el variable que tengo con la regla, si me aplica los costes de envío
    es decir, si no los tengo juntos en el carrito todo va bien, pero si mezclo productos (virtuales + variables con regla) me aplica el envío cuando no debería aplicarlo
    ¿podéis ayudarme?
    gracias

  13. Genial este pluging!

    A mi me pasa justo lo contrario a lo que propones con el snippet.
    He configurado para que todo en una categoría especifica sea envío gratis a España, pero en cuanto se le añade al carrito otro producto de otra categoría diferente desaparece el envío gratis.

    Quisiera que si se usa por ejemplo la categoría con envío gratis «X» y a la cesta se le suma otro producto de la categoría «Y» siga siendo gratis pues ya lleva «X»

      1. Hola Lidia!

        Creo que no puedes conseguir esa configuración con el plugin del que hablo en este post.

        Sin embargo, si que puedes hacer eso con mi plugin WooCommerce Super Shipping.

        Solo tendrías que usar las clases de envío para agrupar los productos de la categoría que quieras que tenga envío gratis y después darle una prioridad mayor que al resto de productos. De esta forma te aseguras que si en el carrito hay productos de la categoría gratis y de otras categorías, SIEMPRE se muestre la opción de envío gratis 😉

        Puedes probar la demo del plugin desde aquí

        Saludos!

  14. Hola Antonio,

    Es posible configurar el envío gratuito para los clientes nuevos ? solo por la primer compra?
    PROMO: ENVÍOS GRATIS EN TU PRIMER COMPRA DE 2 LB DE CAFÉ

    Gracias! excelente blog

  15. Buenos días Antonio,

    Mi problemilla es que tengo estipulado el envío gratis a partir de 60€ pero al existir productos virtuales (sin envío) y producto físicos (con envío) me los suma para llegar a esos 60€.
    Lo que no sé si se puede es decirle que para esos 60€ sólo tenga en cuenta los productos que son físicos.

    Un saludo y gracias por el blog, ayudas a mucha mucha gente con el.

    1. Hola Carlos,

      No estoy seguro, pero quizás se pueda hacer creando una regla específica para productos virtuales con el plugin del que hablo en el artículo.

      Échale un vistazo y me cuentas.

      Saludos!

  16. Una pregunta tonta,
    no encuentro la forma de decirle a woocommerce : si la compra es + de XX eur los gastos de envio gratis.
    ¿Donde se configuran estas reglas?

  17. Hola Antonio muchas gracias por tu post funciona perfectamente, lo único es que con la opción 1 sin pluging al final deshabilita la opción de pago en destino, (logico si es descargable) ¿conoces alguna forma para que sea descargable pero con la opción de pago en destino?. Muchas gracias por tu trabajo.

  18. GRacias por el artículo. Este blog (como ya he comentado anteriormente me sirve para mucho).

    A mi me surge lo siguiente:

    Tengo un producto que vale 22 € que tiene los gastos de envío incluidos en el precio. ¿sería posible que si alguien comprase este producto, el resto de pedido le saliera gratis?

    Un saludo

    1. Claro que si Juan.

      Lo puedes hacer con el 2º método que explico, creando una regla del tipo cuando el carrito «Contiene producto» igual a tu producto de 22€. De esta forma ya se aplica el gasto de envío gratis a todo el pedido.

      Un saludo!

  19. Antonio tengo una duda. Tengo articulos en mi tienda que el precio sobrepasa ya de por si loa gastos de envio que lo tengo limitado a 150 euros. Y ahí va la pregunta:

    Hay alguna forma para que en la pagina de productos muestre sobre de la foto una leyenda de ENVIO GRATIS. Como cuando se le aplica la opcion de nuevo que sale una etiqueta sobre la foto que dice artículo nuevo.

    He hecho una chapucilla y consiste en traducir la etiqueta new! Por ENVIO GRATIS.

    Si marco el articulo como nuevo me sale. Pero anulo la opción de articulo nuevo.

    Hay alguna forma de hacerlo??

    Gracias por tus aportes que son geniales.

  20. En el momento me gustaria una opcion que me permita colocar dos presios de envios uno al cual se refiera a envio normal o basico el cual tendra un pago fijo y otro que seria el nevio rapido o dia siguiente el cual tendra otro valor, al igual tambien que me permitiera seleccionar si quiero que ese envio m ellegue por cobrar. Gracias.

  21. Buenas tardes Antonio, llevo siguiendo tu blog hace unos meses y la verdad es que me ha servido de mucho. Muchisimas gracias por tu ayuda ^^

    MIra te voy a comentar algo que no consigo solucionar por mas que leo y seguro que es muy sencillo.

    Me estoy volviendo loco con la configuracion de los envios, pues no consigo que me muestre lo que quiero. Tan simple como poner un precio unico, segun peninsula, ceuta y melilla, etc por ejemplo hasta 5 kilos y si pasa de eso x€ por kilo, por ejemplo. Y que cuando se haga una compra, segun el codigo postal, te muestre un precio u otro pero no aparezcan el resto de opciones, nos e si me explico.

    Es que estoy haciendo compras simuladas y no acierta ningun gasto de envio y eso puede ser un problema. Que solo muestre el precio que yo le ponga, has un peso concreto y ya esta.

    Un saludo y de nuevo muchas gracias.

    1. Hola Jordi,

      Llevas razón.

      El plugin aplica envío gratuito a todo el carrito en el caso de que alguno de los productos tengan configurado envío gratis.

      En este caso, la solución que expongo en el artículo sólo serviría para pedidos de un mismo producto. Es decir, si en el mismo pedido se incluyen productos con gastos de envío y productos con envío gratuito, entonces esta solución no es válida.

      Tendré que buscar otras soluciones.

      Gracias por avisar.

      Saludos!

      1. ¡Buenas Antonio, Jordi!

        ¿Han encontrado una solución? Me gustaría usar el plugin evitar los productos en oferta y otros seleccionados, no puedan ser aplicable en envío gratuito.

        ¿Saben cómo hacerlo?

  22. Hola,

    yo he querido utilizar la opción de «clase de envío», para no añadir uno por uno los productos y no funciona. Bueno, a medias. Si uno de los productos tiene esa clase de envío, da igual el resto de productos, el envío es gratuito. Alguna idea?

  23. WordpressUpToDate

    Un gran artículo, si señor! El envío es siempre una fase complicada para la gente más novata. Pero con esto resuelves bien el tema.

    Un saludo,

    Kai

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Responsable: Antonio Cantero, siendo la Finalidad; envío de mis publicaciones así como correos comerciales. La Legitimación; es gracias a tu consentimiento. Destinatarios: tus datos se encuentran alojados en mi plataforma de email marketing Active Campaign ubicada en EEUU y acogida al Privacy Shield. Podrás ejercer Tus Derechos de Acceso, Rectificación, Limitación o Suprimir tus datos en contacto@woodemia.com

Scroll al inicio