Normalmente no modificamos los mails prediseñados de WooCommerce, pero lo cierto es que conviene modificarlos y no solo el estilo, sino añadirle funcionalidades cómo por ejemplo que muestre los número de seguimiento del pedido.
En este tutorial vamos a ver cómo añadir una función a cada correo, y cuales son las mejores funcionalidades que podemos añadir, todo sin plugins, solo a código.
Índice
Formas de modificar los emails en WooCommerce
Existen 3 formas diferentes en las que podemos cambiar las plantillas de correo electrónico de WooCommerce. Estas nos permiten modificar diferentes aspectos de las plantillas de correo electrónico. Las 3 se pueden combinar para formar un resultado único:
- La configuración de los mails: Es todo lo que podemos cambiar entorno a la plantilla de correo desde el mismo WooCommerce, ya sean colores, textos predefinidos, si enviarlos o no… Esto tiene muy poca personalización.
- Cambiar las plantillas de los correos manualmente: En cada tipo de correo podemos modificarlos desde la plantilla, no recomiendo esto, puesto que cada vez que actualicemos el WooCommerce se pierden los cambios.
- Hooks o Ganchos: Esto es lo que vamos a aprender en este tutorial. Consiste en añadir contenido a ciertas zonas del mail sin cambiar la configuración del mail. Esto es lo más efectivo, ya que aunque actualicemos el WooCommerce los cambios se mantienen.
Además puede leer shortcodes de WooCommerce para automatizar aún mas el proceso.
Tipos de correos en WooCommerce
Lo primero de todo vamos a identificar todos los correos que mandamos al usuario desde nuestro WooCommerce. En este caso los encontraremos en WooCommerce > Ajustes > Correos electrónicos. Estos son todos los que puede recibir el cliente si están activos:

Y estas son las ID´s de cada uno que modificaremos en el propio correo, están en el mismo orden que la anterior imagen:
if ( $email->id == 'customer_on_hold_order' ) {}
if ( $email->id == 'customer_processing_order' ) {}
if ( $email->id == 'customer_completed_order' ) {}
if ( $email->id == 'customer_refunded_order' ) {}
if ( $email->id == 'customer_invoice' ) {}
if ( $email->id == 'customer_note' ) {}
if ( $email->id == 'customer_reset_password' ) {}
if ( $email->id == 'customer_new_account' ) {}
Identificar el lugar dónde lo vamos a añadir
WooCommerce posee hooks o zonas dónde se puede añadir el contenido en sus propios emails, en este caso son:
add_action( 'woocommerce_email_header', array( $object, 'email_header' ) );
add_action( 'woocommerce_email_footer', array( $object, 'email_footer' ) );
add_action( 'woocommerce_email_order_details', array( $object, 'order_details' ), 10, 4 );
add_action( 'woocommerce_email_order_details', array( $object, 'order_schema_markup' ), 20, 4 );
add_action( 'woocommerce_email_order_meta', array( $object, 'order_meta' ), 10, 3 );
add_action( 'woocommerce_email_customer_details', array( $object, 'customer_details' ), 10, 3 );
add_action( 'woocommerce_email_customer_details', array( $object, 'email_addresses' ), 20, 3 );
Os dejo un par de capturas para que podáis identificar estas zonas más fácilmente en el correo:


Añadir contenido al email
En este ejemplo vamos a informar en el correo de procesando con un texto, que debido a que estamos de vacaciones en la empresa los pedidos se enviarán a partir de la semana que viene, por lo que tendríamos que añadir el siguiente código:
add_action( 'woocommerce_email_before_order_table', 'dl_añadir_contenido_email_woo', 30, 4 ); // En este caso decimos que el cotenido esté antes de la tabla.
function dl_añadir_contenido_email_woo( $order, $sent_to_admin, $plain_text, $email ) {
if ( $email->id == 'customer_processing_order' ) { //Aqui ponemos el ID del correo que queremos modificar
echo '<p>Debido a que estamos de vacaiones esta semana en mitiendaonline.com lo pedidos serán procesados a la siguiente semana. Lamentamos las molestias</p>'; // Entre las dos p modificamos el mensaje que queremos mostrar
}
}
Y nos quedaría un resultado en el mail tal que así:

Otro ejemplo: Valóranos en Google Business
En este caso vamos a añadir el enlace de Google My Business para que nos valore una vez hemos completado el pedido para mejorar nuestro SEO y autoridad de marca. Este caso es un complemento a las notificaciones automáticas de valoraciones que explicaba aquí.
add_action( 'woocommerce_email_customer_details', 'dl_añadir_contenido_email_woo_2', 30, 4 ); // Después de la tabla de contenido
function dl_añadir_contenido_email_woo_2( $order, $sent_to_admin, $plain_text, $email ) {
if ( $email->id == 'customer_completed_order' ) { //Aqui ponemos el ID del correo completado
echo '<p>Estaríamos muy agradecidos que nos valorases como tienda en Google en este enlace</p>'; // Entre las dos p modificamos el mensaje que queremos mostrar
}
}
Resumen y Resolución
Añadir este tipo de contenido de forma automática en los correos electrónicos te ayudará a conseguir aquello que necesites: conectar más con el cliente, generar confianza, tener más valoraciones, poder seguir el pedido…
Si queréis dar un repaso por los ajustes básicos por si hay algo que se os escapa o queréis hacer esto mismo con un plugin, pasaros por este post.
Cualquier duda que necesitéis estoy en comentarios. Añadir que en los desarrollos de WooCommerce que hago estas modificaciones van incluidas!
Hola Diego!
A parte de esto, sabes si existe algún plugin para implementarlo?
Gracias
Hola Mónica,
Lo menciono en el mismo post, casualmente subí uno el miércoles dónde te doy recomendaciones de los plugins ya que me lo han pedido mucho por privado. Al final de este post tienes los que recomiendo tanto gratuitos cómo de pago: https://diegol.top/woocommerce/personalizar-los-correos-electronicos-en-woocommerce/
Un saludo!
Genial! Voy ahora mismo a echarle un vistazo para implementarlo 😉
Hola Diego!
Muchas gracias por el tutorial, justo me encuentro con esta problemática y me resulta muy interesante. El único problema que le veo aparece en una instalación multilingüe. ¿Cómo añado contenido en dos idiomas si estoy inyectando el código en un solo idioma?
¡Muchas gracias!
Hola Ferran,
Depende de que sistema multilingüe estés usando. Yo lo uso en multilingual press y lo creo en cada subcarpeta con la traducción.
Un saludo!
Gracias Diego por tu trabajo. Una pregunta, sabes si puedo personalizar email según tipo de envio ?
Gracias.
Hola Misha,
Se puede personalizar cualquier cosa en WooCommerce. Tanto el correo de pedido completado, procesando, etc. Como si eliges un transportista concreto te salga un correo diferente por seleccionar ese.
Un saludo!
hola amigo como puedo quitar el campo cantidad de los correos de woocommerce? gracias por tan preciada informacion. saludos!
Hola Jesus!
Para eso necesitas algo más que un simple código, sino retoar las plantillas, Te dejo aquí un enlace dónde lo explica: https://stackoverflow.com/questions/52771772/remove-the-column-quantity-from-email-notifications-in-woocommerce
Hola Diego, muchas gracias por este post tan completo.
Por otra parte, sabes si existe algún plugin que realice esto de forma más «sencilla» o «automática». Voy a tratar de personalizar los mails de la tienda con tu método, pero igualmente me gustaría conocer si existe alguna alternativa con un plugin.
Saludos y gracias,
Joel
Hola Joel, gracias por tu comentario.
Este es un post más de código. Los plugins los menciono en este artículo dónde lo explico los correos de WooCommerce en general: https://diegol.top/woocommerce/personalizar-los-correos-electronicos-en-woocommerce/
Son Visual Email Designer for WooCommerce que es gratis del repositorio o más completo Email Customizer for WooCommerce with Drag and Drop Email Builder de COdecanion.
Espero que te sirva,
Un saludo!
Hola diego, me gustó tu post, pero tengo una duda, quiero quitar el campo «precio» , estoy usando esta función en el functions.php:
function adjust_woocommerce_get_order_item_totals( $totals ) {
unset($totals[‘cart_subtotal’] );
return $totals;
}
Esta función elimina el campo subtotal de la tabla, pero no hayo la manera de eliminar la columna del precio.
Si me pudieras ayudar, estaría muy agradecido
Hola Christian,
Puedes probar a eliminarlo mediante CSS:
function dl_ocultar_columna_de_precios_email()
{
?>
Pero con ¿Si se modifica el Css de la tabla, aplica a la platilla de correo que le llega al cliente cuando realiza una compra?.
El código anterior es para el correo que le llega al cliente.
function adjust_woocommerce_get_order_item_totals( $totals ) {
unset($totals[‘cart_subtotal’] );}
unset($totals[‘*********’] ); **** -> Aquí es donde me falta un parámetro de la tabla (el de la columna precio).
return $totals;
}