Añadir una segunda dirección de correo electrónico a un pedido completado en WooCommerce
Antes de hacer esta pregunta, sé que existe una hesitación (legítima) para responder preguntas aquí sobre productos de Woo ya que tienen su propio soporte y se debería animar a sus usuarios a utilizarlo. Soy un usuario de pago de Woo pero no pude resolver esto con su soporte técnico, y mi pregunta es sobre la sobreescritura de clases en WP así que espero que reciba una consideración justa.
Mi pregunta: cuando se envía un correo electrónico de pedido completado a un cliente, también necesito recibir este correo, textualmente y automáticamente, exactamente como se envía al cliente en lugar de otro formato como el que crean los diversos plugins de facturas PDF para WooCommerce. Puedo lograr esto muy fácilmente cambiando la siguiente línea en /woocommerce/classes/emails/class-wc-email-customer-completed-order.php
:
$this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
para que lea:
$this->send( $this->get_recipient(), $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
$this->send( me@myemail.com, $this->get_subject(), $this->get_content(), $this->get_headers(), $this->get_attachments() );
Sin embargo, obviamente un hack como este no sobrevivirá a una actualización. Tengo un tema hijo que sobrescribe las plantillas de WooCommerce. ¿Existe algún mecanismo equivalente mediante el cual pueda sobrescribir una clase de manera similar encapsulada? ¿O pueden recomendar un enfoque alternativo (además de configurar el servidor SMTP para poner en copia oculta todos los correos salientes a la segunda dirección) para lograr mi tarea específica de recibir este correo cuando el cliente también lo recibe?

Existe un filtro que puedes utilizar, mira en abstract-wc-email.php
, línea 214:
return apply_filters( 'woocommerce_email_recipient_' . $this->id, $this->recipient, $this->object );
Puedes agregar lo siguiente en tu functions.php:
add_filter( 'woocommerce_email_recipient_customer_completed_order', 'your_email_recipient_filter_function', 10, 2);
function your_email_recipient_filter_function($recipient, $object) {
$recipient = $recipient . ', me@myemail.com';
return $recipient;
}
El único inconveniente es que el destinatario verá tanto tu dirección como la suya en el campo Para:.
Alternativamente, basándote en la respuesta de Steve, puedes usar el filtro woocommerce_email_headers
. El objeto $object pasado te permite aplicar esto solo al correo de pedido completado:
add_filter( 'woocommerce_email_headers', 'mycustom_headers_filter_function', 10, 2);
function mycustom_headers_filter_function( $headers, $object ) {
if ($object == 'customer_completed_order') {
$headers .= 'BCC: Mi nombre <my@email.com>' . "\r\n";
}
return $headers;
}

Esto se ve muy prometedor. ¿Tu sugerencia es crear un plugin para esta funcionalidad?

Eso funciona perfectamente, muchas gracias. Esto realmente superó todas las expectativas.

El código que aparece como "Alternativamente, basándose en la respuesta de Steve..." no parece funcionar con WC 2.3... ¿Alguna sugerencia?

Ninguno de los códigos funciona en WC 2.5.5, ¿sabes si cambiaron el nombre del filtro? ¡Gracias!

Sigue funcionando para mí en WC 2.5.5. Si no te funciona probablemente sea un conflicto con algún plugin. El filtro sigue siendo el mismo: https://github.com/woothemes/woocommerce/blob/2.5.5/includes/emails/class-wc-email.php#L281

Y hay otro filtro que te dará acceso a la variable $header, lo cual puede permitirte enviar copias ocultas (BCC) de tus correos electrónicos para que recibas una copia de cada email que se envía a tus clientes en Woocommerce. Esto es igual de sencillo que el código anterior, excepto que tus clientes no verán tu dirección de correo.
Al igual que la solución anterior, añadirías el siguiente código:
add_filter( 'woocommerce_email_headers', 'mycustom_headers_filter_function', 10, 2);
function mycustom_headers_filter_function($headers, $object) {
$headers = array();
$headers[] = 'Bcc: tu nombre <yo@micorreo.com>'; // Traducido el texto dentro del código
$headers[] = 'Content-Type: text/html';
return $headers;
}
Este filtro se aplica a todos los $headers y también establece el tipo como text/html de forma fija. Ten en cuenta que no debes incluir '/r/n' en la declaración del tipo de contenido - esto podría causar un error en wp_mail() - que es lo que Woocommerce usa para enviar tus mensajes.
Estoy usando este código para verificar que funciona en Woocommerce v2.0.14. También debería funcionar en versiones anteriores, pero no estoy seguro de cuánto tiempo ha estado incluido este filtro.

¿Por qué no usar /r/n? Creo que ese error solo aparece cuando agregas /r/n en el array de headers. Tu ejemplo en realidad sobrescribe la configuración de contenido, que podrías reutilizar.

He respondido en SO con un método para agregar BCC solo a correos electrónicos específicos y mantener los headers existentes.
