Skip to content

Todo para WordPress, el desarrollo web — y mucho más

📝 Añadir notas de pedido de WooCommerce a los correos: una guía completa

📝 Añadir notas de pedido de WooCommerce a los correos: una guía completa

Un cliente realiza un pedido y usted deja una nota en el panel de administración: aclaró la fecha de entrega, agregó un número de seguimiento o simplemente escribió «llamar antes de enviar». Pero el cliente no ve esto. Las notas de pedido en WooCommerce solo existen en el panel de administración por defecto, en la barra lateral de edición del pedido. No aparecen en los correos electrónicos enviados al comprador.

El problema se resuelve con un solo fragmento de código en functions.php. Sin plugins, sin editar plantillas, solo un hook limpio que muestra las notas en el cuerpo del correo. En la práctica, hemos usado este enfoque en tiendas de clientes durante varios años, sin fallos tras las actualizaciones de WooCommerce. En esta guía, cubriremos cómo WooCommerce almacena las notas de pedido, qué hook usar y cómo personalizar la salida según sus necesidades.

💡 Resumen rápido:

  • Cómo almacena WooCommerce las notas de pedido: el tipo de comentario order_note y la función wc_get_order_notes()
  • Dos enfoques para personalizar correos: sobrescritura de plantillas o hooks, y cuándo elegir cada uno
  • Un fragmento listo para usar que muestra notas en el correo de pedido completado, con un desglose línea por línea
  • Personalización: estilizar la lista, filtrar solo notas de cliente, dar soporte a correos en texto plano
  • Pruebas mediante la vista previa de correo en el panel de administración, sin molestar a clientes reales

Paso 1: Cómo almacena WooCommerce las notas de pedido

WooCommerce almacena las notas como comentarios de WordPress del tipo order_note. Cada acción sobre un pedido (cambio de estado, reembolso, nota de administrador o mensaje del cliente) se registra en la tabla wp_comments con la bandera comment_type = 'order_note'.

La diferencia entre notas internas y de cliente se determina mediante el metadato is_customer_note. Si la casilla «Visible en Mi cuenta» está marcada al añadir una nota, WooCommerce establece is_customer_note = true y el comprador la ve en su cuenta. Las notas internas normales (is_customer_note = false) no se muestran al cliente en ningún lugar.

Con el lanzamiento de High Performance Order Storage (HPOS) en WooCommerce 8.2+, las notas se trasladaron a una tabla separada wp_wc_order_notes. Las consultas SQL directas a wp_comments con HPOS habilitado pueden devolver resultados vacíos. Por lo tanto, en lugar de get_comments(), es mejor usar wc_get_order_notes(), que funciona correctamente independientemente del modo de almacenamiento.

Paso 2: Plantillas o hooks, qué enfoque elegir

WooCommerce ofrece dos caminos para personalizar correos: sobrescritura de plantillas y hooks de acción. Cada uno tiene su caso de uso.

Sobrescritura de plantillas. Usted copia un archivo de woocommerce/templates/emails/ a yourtheme/woocommerce/emails/ y edita el HTML directamente. La ventaja es el control total sobre el marcado. La desventaja es que, tras actualizaciones mayores de WooCommerce, su plantilla puede divergir de la versión actual y los correos pueden empezar a fallar. La documentación sobre la estructura de plantillas está ahora en woocommerce.com, no en el antiguo docs.woothemes.com.

Hooks. Usted adjunta una función de retrollamada a la acción woocommerce_email_order_meta y WooCommerce llama a su función en el lugar correcto del correo. La ventaja es que no depende de las versiones de las plantillas y funciona sin problemas tras las actualizaciones del núcleo. La desventaja es que está limitado a la posición del hook (se ejecuta en el bloque de metadatos del pedido, después de la tabla de productos).

Criterio

Plantillas

Hooks

Control sobre el marcado

Total

Dentro de la posición del hook

Resistencia a actualizaciones

Baja

Alta

Complejidad de implementación

Mayor

Menor

Ideal para

Rediseño completo del correo

Añadir un solo bloque

Para nuestra tarea de mostrar notas, un hook es más que suficiente. Si necesita rediseñar por completo la maquetación de los correos, use plantillas y planifique actualizarlas cada seis meses aproximadamente.

Paso 3: Añadir el código a functions.php

El hook woocommerce_email_order_meta se ejecuta en todos los correos transaccionales de WooCommerce: confirmación de pedido, completado, cancelación, factura y otros. Se pasan cuatro parámetros a la función de retrollamada: el objeto de pedido $order, la bandera $sent_to_admin, la bandera $plain_text y el objeto de correo $email.

Coloque este código en el archivo functions.php de su tema activo (o mediante el plugin Code Snippets, que es más seguro ya que no se perderá al cambiar de tema):

1add_action( 'woocommerce_email_order_meta', 'sd_add_order_notes_to_email', 10, 4 );
2
3function sd_add_order_notes_to_email( $order, $sent_to_admin, $plain_text, $email ) {
4 // Don't break the plain-text version of the email
5 if ( $plain_text ) {
6 echo "\n\n" . esc_html__( 'Order Notes:', 'woocommerce' ) . "\n";
7
8 $notes = wc_get_order_notes( array(
9 'order_id' => $order->get_id(),
10 'type' => 'customer',
11 ) );
12
13 if ( empty( $notes ) ) {
14 echo esc_html__( 'No notes for this order.', 'woocommerce' ) . "\n";
15 return;
16 }
17
18 foreach ( $notes as $note ) {
19 echo '- ' . wp_strip_all_tags( $note->content ) . "\n";
20 }
21 return;
22 }
23
24 // HTML version: get only customer notes
25 $notes = wc_get_order_notes( array(
26 'order_id' => $order->get_id(),
27 'type' => 'customer',
28 ) );
29
30 if ( empty( $notes ) ) {
31 return;
32 }
33
34 echo '<h2>' . esc_html__( 'Order Notes', 'woocommerce' ) . '</h2>';
35 echo '<ul class="order-notes-list" style="list-style:none;padding:0;margin:0 0 24px;">';
36
37 foreach ( $notes as $note ) {
38 $note_date = sprintf(
39 '%1$s at %2$s',
40 date_i18n( get_option( 'date_format' ), strtotime( $note->date_created ) ),
41 date_i18n( get_option( 'time_format' ), strtotime( $note->date_created ) )
42 );
43
44 printf(
45 '<li style="background:#f9f9f9;border-left:4px solid #7f54b3;padding:12px 16px;margin-bottom:10px;border-radius:0 4px 4px 0;">'
46 . '<div style="margin-bottom:4px;">%s</div>'
47 . '<small style="color:#888;">%s</small>'
48 . '</li>',
49 wp_kses_post( nl2br( $note->content ) ),
50 esc_html( $note_date )
51 );
52 }
53
54 echo '</ul>';
55}

Esto es lo que sucede línea por línea:

  • Línea 1. Registramos el hook con prioridad 10 y aceptamos los 4 parámetros. Sin 10, 4, WooCommerce pasará solo el primer argumento y obtendrá un error.
  • Líneas 5-20. Manejo de correos en texto plano. Algunos correos se envían en formato de texto, así que mostramos las notas como una lista con guiones, sin HTML.
  • Líneas 24-28. wc_get_order_notes() solicita solo notas de cliente (type => 'customer'). Elimine el filtro para mostrar todas las notas, incluidas las internas (cambios de estado, reembolsos). Si el array está vacío, no mostramos nada y no saturaremos el correo.
  • Líneas 34-38. Formateamos la fecha usando date_i18n(), que respeta la configuración regional del sitio y el formato de fecha/hora.
  • Líneas 40-48. printf() muestra cada nota en un bloque estilizado: barra morada a la izquierda, fondo claro, fecha en gris debajo.

El código no usa dependencias externas y es compatible con WooCommerce 3.2+ (la función wc_get_order_notes se introdujo en esta versión) y HPOS (soporte nativo desde 8.2+).

Paso 4: Probar sin molestar a los clientes

Después de añadir el código, no espere a un pedido real para probar. WooCommerce proporciona una vista previa de correo integrada: WooCommerce → Ajustes → Correos electrónicos → haga clic en cualquier correo → botón «Vista previa» en la parte inferior. Verá el correo tanto en HTML como en texto plano, usando un pedido real (se usa el más reciente). Si no hay pedidos, cree uno de prueba manualmente.

Qué comprobar:

  • Una nota de cliente con «Visible en Mi cuenta» habilitado aparece en el correo;
  • Una nota interna (sin la casilla marcada) no aparece (si mantuvo type => 'customer');
  • La versión en texto plano del correo no está rota (cambie mediante el enlace debajo de la vista previa);
  • El bloque de notas no está duplicado en los correos de administrador (añada una comprobación if ( $sent_to_admin ) return; si es necesario).

Si está usando Code Snippets, simplemente desactive el fragmento para revertir. Si editó functions.php, comente o elimine el código. No queda ningún rastro en la base de datos.

⁉️🤔 Preguntas frecuentes

¿Puedo mostrar TODAS las notas, no solo las de cliente?

Sí. Reemplace 'type' => 'customer' por 'type' => 'internal' para obtener solo las notas internas. Elimine el parámetro type por completo para obtener todas las notas. Tenga en cuenta que las notas internas pueden contener información de servicio (IDs de reembolso, importes) que los clientes no deberían ver. Para la mayoría de las tiendas, 'type' => 'customer' es suficiente. Si desea separar la salida, cree dos bloques: primero las notas de cliente con el encabezado «Comentarios del pedido», luego las notas internas bajo el encabezado «Detalles de gestión» (esto es para correos de administrador, usando la bandera $sent_to_admin).

¿El código funciona para un correo específico o para todos?

El hook woocommerce_email_order_meta se ejecuta en todos los correos transaccionales: Pedido completado, Pedido en procesamiento, Pedido en espera, Factura de cliente, etc. Si necesita limitar la salida solo al correo de pedido completado, envuelva el código en una comprobación:

1> if ( 'customer_completed_order' !== $email->id ) {
2> return;
3> }
4>

La lista completa de IDs de correo está disponible en la documentación de WooCommerce: customer_completed_order · customer_processing_order · customer_on_hold_order · customer_invoice · customer_refunded_order · customer_new_account · new_order · cancelled_order · failed_order.

¿Es seguro editar functions.php en un sitio en producción?

Editar functions.php directamente es un enfoque arriesgado. Un error de sintaxis (un paréntesis extra, una comilla sin cerrar) hará que todo el sitio muestre una pantalla en blanco. Es más seguro usar el plugin Code Snippets, que le permite añadir fragmentos PHP desde el panel de administración y desactiva automáticamente el código con errores fatales. Una alternativa es WPCode (versión gratuita en wordpress.org), que ofrece la misma funcionalidad más lógica condicional (solo administrador, solo páginas específicas). Si aun así edita functions.php, haga una copia de seguridad del archivo y tenga acceso FTP a mano. Una pantalla en blanco se soluciona reemplazando functions.php con el original de su copia de seguridad.

Las notas se duplican en los correos, ¿qué hice mal?

Dos causas probables. Primera: añadió el código tanto en functions.php como mediante un plugin de fragmentos, por lo que el hook se ejecuta dos veces. Conserve solo uno. Segunda: su tema u otro plugin ya está adjuntando una función de retrollamada a este mismo hook. Compruébelo buscando en el código del proyecto (grep -r "woocommerce_email_order_meta" wp-content/). Si la duplicación proviene de un plugin, simplemente elimine su código. Si proviene de un tema, envuelva su función de retrollamada en remove_action() antes de add_action() para asegurarse de que solo se ejecute un manejador.

Conclusión: ¿vale la pena añadir notas a los correos de cliente?

La transparencia en la comunicación es una de las formas más económicas de reducir la carga de trabajo de soporte. Cuando un cliente ve «Número de seguimiento: X123456789, entrega el 15 de junio» en el correo, no acude al chat preguntando «¿dónde está mi pedido?». Un fragmento, cero plugins, cinco minutos para implementar, y el efecto se mide en docenas de tickets ahorrados por mes.

Si sus correos ya están personalizados mediante plantillas, incruste la salida de notas directamente en la plantilla en lugar de usar un hook. Si usa un plugin de personalización de correos (Kadence, YayMail, ShopMagic), cada uno tiene su propio mecanismo para añadir bloques dinámicos, así que use ese en lugar de código.

Pruébelo con un tipo de correo (Pedido completado), pruébelo en un pedido de prueba y, después de una semana, evalúe si recibe menos preguntas repetitivas de los clientes. Casi seguro que sí.