Añadir una segunda dirección de correo electrónico a un pedido completado en WooCommerce

23 mar 2013, 11:44:36
Vistas: 52.7K
Votos: 15

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?

1
Comentarios

He utilizado gmail/google como servidores SMTP antes, y de hecho coloca todos los correos en la carpeta de enviados... (por si te sirve de ayuda en tu caso)

Ewout Ewout
23 mar 2013 13:20:20
Todas las respuestas a la pregunta 2
6
27

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;
}
23 mar 2013 13:28:29
Comentarios

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

Halle Halle
23 mar 2013 14:02:41

¡actualiza la respuesta!

Ewout Ewout
23 mar 2013 15:45:14

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

Halle Halle
23 mar 2013 16:02:36

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

drake035 drake035
22 jul 2015 15:07:39

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

Jaypee Jaypee
14 jun 2016 01:17:55

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

Ewout Ewout
17 jun 2016 12:02:09
Mostrar los 1 comentarios restantes
2
10

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.

28 sept 2013 22:29:54
Comentarios

¿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.

Ewout Ewout
6 mar 2014 15:37:03

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

helgatheviking helgatheviking
7 oct 2014 14:32:30