Por defecto Woocommerce te deja poner un mensaje cuando seleccionamos un método de pago, pero no ocurre igual con los envíos. Aquí también es importante poner un mensaje sobretodo indicando el tiempo de envío, si lleva seguimiento o si es recogida en local indicar el lugar.
Así que en este artículo vamos a ver cómo implementarlo sin ningún plugin, con un simple código que modificaremos lo vamos a conseguir. Si no sabes cómo añadirlo aquí tienes un tutorial.
Abrir una notificación al seleccionar el envío
El primer ejemplo vamos a establecer que seleccionando el envío por MRW va a salir un mensaje diciendo cuando se aplican las 24 horas. En el functions.php de nuestra plantilla o bien con Code Snippets insertamos el siguiente código:
add_action( 'woocommerce_cart_totals_after_shipping' , 'dl_abrir_mensaje_seleccionando_envio' );
add_action( 'woocommerce_review_order_after_shipping' , 'dl_abrir_mensaje_seleccionando_envio' );
function dl_abrir_mensaje_seleccionando_envio() {
$chosen_method = WC()->session->get( 'chosen_shipping_methods' );
$chosen_method = explode(':', reset($chosen_method) );
if ( $chosen_method[0] == 'mrw' ){ //Aquí el metodo de envío
echo '<tr class="dl-msj-envio"><td colspan="2" style="text-align:center;background:#e0e0e0;">
//Cambiar estilos en linea
<strong>Lo recibirás mañana si lo pides antes de las 17:00!</strong> //Cambia tu mensaje
</td></tr>';
}
}
Dentro del snippet os digo dónde podéis cambiar el contenido, vamos con otro ejemplo, pero con recogida en tienda, avisando de dónde estamos:
add_action( 'woocommerce_cart_totals_after_shipping' , 'dl_abrir_mensaje_seleccionando_envio' );
add_action( 'woocommerce_review_order_after_shipping' , 'dl_abrir_mensaje_seleccionando_envio' );
function dl_abrir_mensaje_seleccionando_envio() {
$chosen_method = WC()->session->get( 'chosen_shipping_methods' );
$chosen_method = explode(':', reset($chosen_method) );
if ( $chosen_method[0] == 'local_pickup' ){
echo '<tr class="dl-msj-envio-2">
<td colspan="2" style="text-align:center;background:#e0e0e0;">
<strong>Contacta <a href="https://diegol.top/contactar/>aquí</a> para saber más.</strong>
</td>
</tr>';
}
}
¿Cómo saber el código de la URL de envío?
Muchos os preguntaréis: yo tengo Nacex, uso un plugin externo para los envíos y no se que código poner. Si sabéis algo de código lo podréis detectar fácilmente. En la zona de métodos de envío le damos clic a inspeccionar y en la zona del método en value esa es la palabra que tienes que copiar:

Con esto tenemos para hacer un mensaje en las formas de envío que queramos. Cualquier duda estoy en soporte y si necesitáis aplicar este u otros tutoriales personalizados en vuestra tienda virtual todo está incluido en mis servicios de mantenimiento en Woocommerce
Hola,
¿Se pueden crear diferentes snippets para diferentes métodos de envió? Estoy intentándolo pero me da error al crear otro snippet:
El fragmento de código ha sido desactivado debido a un error en la línea 5:
No se puede redeclarar la función dl_abrir_mensaje_seleccionando_envio.
Línea 5:
$chosen_method = WC()->session->get( ‘chosen_shipping_methods’ );
Y por defecto la url del método de envío es «free_shipping:3» y no la detecta tengo q eliminar «:3» y dejarlo «free_shipping» para q la detecte. Hay otro metodo de envío q no lo detecta de ninguna manera «flat_rated:10», ni siquiera «flat_rated»…
A ver si me puedes ayudar y gracias!
Hola Daniel,
No puedes crear otro snippet con el mismo nombre de la función, puedes modificar el de la copia dl_abrir_mensaje_seleccionando_envio_2 añadiendo un «_2» o cualquier cosa.
Igualmente no hace falta que crees otra función, con que dupliques a partir del condifional—> if ( $chosen_method[0] == ‘free_shipping:3’ ){
Así no te hará falta crear otra y te sirve la misma función. Si te sigue dando error coméntame.
Un saludo!
Muchas gracias por la respuesta!
Así está bien?
add_action( ‘woocommerce_cart_totals_after_shipping’ , ‘dl_abrir_mensaje_seleccionando_envio’ );
add_action( ‘woocommerce_review_order_after_shipping’ , ‘dl_abrir_mensaje_seleccionando_envio’ );
function dl_abrir_mensaje_seleccionando_envio() {
$chosen_method = WC()->session->get( ‘chosen_shipping_methods’ );
$chosen_method = explode(‘:’, reset($chosen_method) );
if ( $chosen_method[0] == ‘free_shipping’ ){ //Aquí el metodo de envío
echo ‘
Recibe tu compra en casa de lunes a domingo de 7-23hs
‘;
}
if ( $chosen_method[0] == ‘local_pickup’ ){ //Aquí el metodo de envío
echo ‘
Recoje tu compra en tienda de lunes a domingo de 7-23hs
‘;
}
if ( $chosen_method[0] == ‘flat_rate’ ){ //Aquí el metodo de envío
echo ‘
Tu compra en tienda de lunes a domingo de 7-23hs
‘;
}
}
Las URL de cada método de envío son así: ‘free_shipping:1’, ‘local_pickup:2’ y ‘flat_rated:9’ y para que funcione debo escribirlas sin el ‘:1’
Los números creo que se deben a que tengo creado varios metodos de envío iguales (Envio Gratuito, Recogida Local y Precio Fijo) para distintas zonas.
Sabes como podría reconocerlo con el número ‘:1’ ??
Un saludo y gracias
Efectivamente son correctos Daniel.
Muy cierto lo que mencionas, con los números no funcionan. Te recomiendo Flexible Shipping si tienes varios tipos de envíos fijos, ya que crea un value para cada uno y no hay fallos, lo uso en casi todas las instalaciones. Te dejo aquí el artículo: https://diegol.top/woocommerce/configurar-envios-en-woocommerce/
Un saludo!
Lo estoy probando, tiene buena pinta lo único q para los envios con Precio Fijo el coste que añado no es un cantidad fija, si no un porcentaje del 30% [fee percent=»30″] y en este plugin hay q añadir una catidad excata en €
Otra pregunta relacionada con los metedos de envío. ¿Sabrías ocultar un método de envío Precio Fijo si no llega hasta cierta cantidad, por ejemplo 40€?
Un saludo y gracias 😉
En porcentaje ya la versión premium jajaja
Respecto a lo que mencionas el mismo plugin lo permite pones de rango de 40 a infinito un precio y ya está, para uno más bajo no sale.
Un saludo!
Hola, he modificado una linea de codigo
$chosen_method = explode(‘.’, reset($chosen_method) );
de este modo puedes poner if ( $chosen_method[0] == ‘table_rate:4:1’ ) tal cual como en html. Ami funciona de maravilla.
Hola Misha,
Gracias por el aporte, lo probaré cuando tenga tiempo!
Un saludo
Hola Diego, realmente mejor es quitar la linea
// $chosen_method = explode(‘:’, reset($chosen_method) );
Y ya funciona todo sin tener que filtrar
Muchísimas gracias por el aporte me ayudo mucho tu código