Anteriormente habíamos visto un artículo de cómo Mostrar un mensaje según la zona de envío en WooCommerce, sin embargo en algunos casos el mensaje que queremos mostrar no queremos que dependa de la zona de envío, sino de un método de envío seleccionado.
Resultado Final
Al final lo que obtendremos será algo similar a como se muestra en la siguiente imagen.

Generalidades
Primero, he configurado algunos métodos de envío, incluido uno de recogida en local, desde: WooCommerce > Ajustes > Envío, tal como se muestra en la imagen adjunta.

Mensaje de acuerdo al método de envío recogida en local
Puedes insertar el siguiente código en el archivo functions.php de tu child-theme.
En el código anterior:
- Utilizamos los hooks de WooCommerce: woocommerce_cart_totals_after_shipping y woocommerce_review_order_after_shipping
Estos hooks hacen referencia a la función mostrar_mensaje_tipo_envio() - Dentro de la función, obtenemos la variable $chosen_method, es una cadena que esta serializada, es por eso que usamos la función de PHP explode()
- El primer elemento del array contendrá el nombre del método de envío, en nuestro caso será local_pickup
- Si cumple la condición entonces construimos el mensaje, el cual se integrará como parte de la tabla HTML
Conclusión
Como hemos podido ver, es posible agregar un mensaje adicional cuando se selecciona un determinado método de envío, en nuestro caso lo hemos realizado para el envío de recogida en local, lo hemos hecho a través de código y evitado el uso de un plugin adicional.
¿Aún con dudas?, en el siguiente video se detalla los puntos anteriores.
Extraordinario, muchas gracias por tus tutoriales, nos ayudan bastante!!!
Gracias Omar.
Saludos.
Hola, estoy creando una web para un restaurante y funcionan de tal forma que hacen envío gratuito, pero con un pedido mínimo.
La cuestión es que la cantidad mínima varia en función del pueblo/ciudad.
Cuando el usuario llega a esa cantidad mínima, automáticamente se le selecciona el envío gratuito, pero si no, le aparece como que no hay opciones de envío disponibles.
Habría alguna forma de hacer un mensaje personalizado que pueda configurarse por zonas de envío y que aparezca sin tener que seleccionar ningún método de envío?
De esta forma, si el pedido mínimo para X pueblo es de 20€ y el usuario quiere gastarse 15, que la aparezca un mensaje como “el pedido mínimo para tu zona es de 20€”.
Me da igual si el mensaje también sale cuando el cliente ya supera el pedido mínimo, ya que se le selecciona envio gratuito automáticamente.
Ahora estoy usando el código que compatiste en este articulo (https://decodecms.com/mostrar-mensaje-segun-zona-de-envio-en-woocommerce/), pero el mensaje solo aparece si hay un método de envio seleccionado.
Muchas gracias por todo lo que aportas.
Un saludo!
Hola, lo que sucede es que necesita un Hook para disparar el código. Revisa este artículo que usa otro Hook que podría servirte: https://businessbloomer.com/woocommerce-show-message-after-state-selection-checkout/
Jhon, Muchas gracias por compartir esta información que me ha andado muy bien para un sitio en que estoy trabajando, junto al código que compartiste anteriormente para la zona de envío.
Una consulta, y si quiero mostrar el mensaje en una instancia del método de envió?
Hola Luis, a qué te refieres cuando dices “una instancia del método de envió”?
Con instancias me refiero a que utilizando el mismo tipo de método de envió (en mi caso flat_rate) tengo dos métodos de envió diferentes en la misma zona (en mi caso Envío a Domicilio y Entrega en Estación de Metro) https://www.screenpresso.com/=bQozd
Lo ideal sería mostrar un mensaje diferente para cada uno de ellos y no el mismo.
Por cierto, gracias por responder
Hola, Luis
Puedes revisar este artículo: https://decodecms.com/mostrar-mensaje-segun-zona-de-envio-en-woocommerce/ , verás en el código de ese artículo que se usa $chosen_method[1], que es el ID de la zona $chosen_method[0] es el método de pago, por lo tanto con ambos datos puedes combinarlos para lo que necesites.
Hola Luis
Quería saber si lograste implementarlo.
Tengo el mismo caso tengo dos flat_rate con distinto nombre,
Yo intente cambiando el ID así como dice John, pero no me funcionó.
Gracias
Estoy igual que Gustavo, tengo dos flat_rate con distinto nombre pero no se como cambiar el texto según el ID de método de envío…
@Gustavo Bueno lo conseguí! 😉 No tengo ni idea de programación pero ahí vamos:
Inspeccioné el código de los dos métodos de envío y vi que eran:
shipping_method_0_local_pickup1
shipping_method_0_local_pickup3
Por lo tanto ya sabía que ambos métodos estaban diferenciados y el que quería cambiar era el “shipping_method_0_local_pickup3”.
Sabía que un método era “local_pickup” pero el otro no sabía como averiguar el nombre y me puse a probar aleatoriamente:
if ( $chosen_method[3] == ‘local_pickup’ ){
if ( $chosen_method[0] == ‘local_pickup3’ ){
if ( $chosen_method[0] == ‘local_pickup_3’ ){
Pero no tenía éxito, no funcionaba. Luego pensé que debía mostrar los metodos y probé:
echo $chosen_method;
pero el resultado era “local_pickup”. Sabía que estaba cerca pero no sabía como mostrar el otro método. Luego busqué en Google y vi que los datos se almazenaban en ARRAYS y para ver los arrays había que poner la siguiente instrucción: var_dump($array); y puse:
var_dump($chosen_method);
y me mostró:
array(2) { [0]=> string(12) “local_pickup” [1]=> string(1) “3” }
Por fin había obtenido el nombre del método, que resultó ser “3”, ya solo quedaba añadirlo:
if ( $chosen_method[0] == ‘3’ ){
Pero no, no funcionó. Luego me fijé que el resultado de ese Array podía mostrarse más fácilmente:
array(2) {
[0]=> string(12) “local_pickup”
[1]=> string(1) “3”
}
Lo que me llevó a ver que el método 3 tenía el [1] y no el [0] como el local_pickup. Pues ya solo me quedaba probar:
if ( $chosen_method[1] == ‘3’ ){
… y sorpresa, funcionó!”” jjajaaj No me lo creo ni yo mismo! 😉
Resumen, cambia la línia:
if ( $chosen_method[0] == ‘local_pickup’ ){
por:
if ( $chosen_method[1] == ‘3’ ){
(cambia el [1] por el 2,3,4.. y tambien el [3] por el 2,3,4… ves probando a ver… )
Hola!!, en esta linea lo que hice fue cambiar el ‘:’ por ‘.’
$chosen_method = explode(‘.’, reset($chosen_method) );
Con ello puedes usar el “value” completo, en mi caso ‘flexible_shipping_single:56’, ‘flexible_shipping_single:57’ y así con todos lo metodos creados en la zona. Yo tenia Flexible Shipping por eso me salen así, pero si solo usas el precio fijo de woocommerce o retiro local lo verás diferenciado por ‘rate_flate:46’ por ejemplo.
Con esa modificación en el código pude agregar un mensaje por cada metodo, solo deben ir agregando mas instancias IF con el Value del metodo correspondiente y cambiando el mensaje.
El mensaje de este codigo se muestra con fondo rojo y letras blancas.
Hola Oscar, gracias por el aporte.
Hola, no sé si es el foro correcto. En la configuración de las zonas de envío en woocommerce tengo establecidas correctamente las zonas de envío. Sin embargo, me aparece en primer lugar la siguiente zona de envío:
Nombre de la zona: Ubicaciones no cubiertas por tus otras zonas
Editar | Borrar
Región: En todas partes
Métodos de envío: Precio fijo/Envío gratuito
No puedo cambiar de posición esta zona de envío ni borrarla ni tampoco editar la región. Necesito que se elimine o que aparezca en último lugar para que se apliquen el orden del resto de zonas establecidas, ¿me podrías ayudar?
Hola, podrías probar eliminando todas las zonas y crearlas nuevamente y verificar si te sucede lo mismo. Saludos.
Hola, muchas gracias por tu pronta respuesta. He eliminado todas las zonas y esa no hay forma de eliminarla. Necesito modificar la región de esa zona para que me permita establecer la jerarquía del resto de zonas pero no encuentro la manera, ¿se te ocurre otra opción?
Amigo tengo 3 metodos de envío configurado, como hago para personalizar cada uno de ellos? gracias
Hola
Simplemente agrega más condicionales if
Hola, muy buen video gracias por compartir la información.
Pero tengo una duda cuando un cliente coloque una dirección de envió que no existe en la zona de envió, aparece un mensaje “No se han encontrado opciones de envío para”. Me gustaría que también apareciera un mensaje personalizado, lo trate de hacer como en tu video para encontrar el código a utilizar pero no me aparece ningún chosen code.
Hola el texto de ese mensaje podrías evaluar cambiarlo en las cadenas de traducción, revisa: https://decodecms.com/cambiar-textos-de-traduccion-en-wordpress/ , puedes usar un plugin como Loco Translate
Hola, tengo un problema con mi tienda online de woocommerce, cuando pongo el código postal para calcular el envío me pone “no se han encontrado opciones de envío para esa zona” tengo configurada una zona que es peninsula y baleares en la misma configuración, o sea metí todo menos canarias ceuta y melilla. No hay forma de hacer que funcione. También he probado de separar las zonas y tampoco.
Hola,
Muchas gracias por tu valiosa información. Cómo debería hacer para que en lugar de añadir un texto con el horario de recogida, que el método de envío local pickup muestre directamente la dirección de la tienda donde recoger el producto en lugar de “Recogida en tienda” que no aporta ningún valor. Muchas gracias.
Hola, revisa el punto de mostrar un mensaje, puedes cambiarlo por la dirección
https://decodecms.com/mostrar-mensaje-al-seleccionar-envio-recogida-en-local-en-woocommerce/#Mensaje_de_acuerdo_al_m%C3%A9todo_de_env%C3%ADo_recogida_en_local
Hola Jhon muchas gracias por tu aporte. Te queria hacer una pregunta.
Si lo que quiero es quitar algunos campos del check out cuando es recogida local tipo Dirección etc..??
Muchas gracias de Antemano
Hola, evaluaré esto que comentas ya que no lo he probado. Saludos.
Hola Jhon, gracias por tu ayuda.
Hace un par de dias configuré las zonas de envios sin problemas. El cliente podria seleccionar el tipo de envio de su preferencia y todo normal:. http://prntscr.com/10j1zkf
De golpe y sin previo aviso, dejó de mostrar la opcion para seleccionar y coge el primer registro de las “Zonas de Envios” sin opciones: http://prntscr.com/10j235i
He intentado desabilitando y volviendo a habilitar, eliminar las Zonas de Envios y volviendo a crear, pero nada !!
Probablemente sea alguna cosa menor, pero no doy con la tecla… HELP!
Hola, entiendo que no tiene que ver con el código de este artículo y sólo has realizado configuraciones, podrías probar desactivando plugins, es posible que alguno te cause un conflicto.
Hola, muy interesante tu articulo, en mi caso estoy tratando de agregar (esto ya lo tengo programado) un campo adicional al registro del pedido para almacenar los datos del seguimiento del envio, campo “SegEnvio”. La idea es de acuerdo al tipo de envío que el cliente haya seleccionado (no se muestra en el pedido en la pantalla ni en los mails, solo se graba en la base del pedido) se inicializa con un texto diferente. Tengo tres tipos de envíos posibles : “Por Moto”, “Retira en Domicilio”, “DHD – Andreani” lo que no me queda claro es como obtener el método de envío elegido y como se que valores corresponde a cada uno. (en que tabla queda esta codificación de métodos de envíos?). Por otro lado voy a incorporar un nuevo estado de los pedidos (ya tengo la codificación) “Enviado” y que dispare un mail al cliente con los datos del pedido agregando el contenido del campo”SegEnvio”. La parte del mail he visto algunos php que lo hacen pero no me queda claro como puedo hacer que tengan el mismo diseño (plantilla) que por ejemplo agregue el valor del campo SegEnvio en la misma posición que lo hace cuando le envio una nota al cliente (detalla el pedido pero agrega la noticia) Es decir quiero construir un mail como el de las notas al cliente. Me puedes ayudar con algunos de estos puntos. Gracias.
Hola
El Hook que comento en el artículo te puede servir para realizar la acción que creas conveniente cuando el usuario cambia el método de envío. Puedes guardar tus datos como metadata de la orden ya que al final es un CPT.
Hola John. Gracias por este articulo, esta genial como todos los que publicas.
Hola John. Gracias por este articulo, esta genial como todos los que publicas.
Tengo una consulta, existe la forma de que al elegir del método de envió “Recogida Local”, al mismo tiempo que aparece el mensaje, se oculte también el precio del método de envió “Precio Fijo”, de manera que el cliente no vea el valor de este método de envió si selecciono otro y piense que se le esta cobrando igual. Ciertamente ese monto se refleja en el total a pagar, pero he tenido clientes que no leen bien y me llaman para decirme que porque el retiro local cuesta lo mismo que el envió a una dirección. Gracias
Gracias a Max, Omar y sobre todo a Jhon Marrero. He podo solventar!!