Quiero agregar un encabezado adicional a los correos electrónicos salientes en mis sitios, para poder determinar fácilmente qué sitio envió un correo electrónico determinado. (Puse un complemento de funcionalidad estándar en todos mis sitios, por lo que es bastante fácil de hacer, y configurar mi cliente de correo electrónico para filtrar y, de lo contrario, actuar en este encabezado sería un ahorro de tiempo increíble).
Pensé que esto sería una simple cuestión de conectarse a la wp_mailfunción, pero evidentemente no lo es.
Primero, probé esto:
add_filter('wp_mail', 'ws_add_site_header');
function ws_add_site_header() {
return array('headers' => 'X-WU-Site: ' . parse_url(get_site_url(), PHP_URL_HOST));
}
Aquí, mi matriz tenía prioridad sobre cualquier otra cosa que modificara la configuración del correo (por ejemplo, Gravity Forms), por lo que los correos electrónicos HTML comenzaron a aparecer como HTML simple y sin formato. Tiene sentido, ya que se eliminó el encabezado Content-type: que GF agregó. Pero mi encabezado fue agregado al correo electrónico. Dado que otros también dependen de recibir bonitos correos electrónicos (estoy seguro de que todos los desarrolladores de contenido y usuarios finales de mis sitios, entre otros), eso no es aceptable.
Uno de mis colegas sugirió enrutar mis cosas a través de wp_parse_args (), por lo tanto:
add_filter('wp_mail', 'ws_add_site_header');
function ws_add_site_header($args) {
$new_header = array('headers' => 'X-WU-Site: ' . parse_url(get_site_url(), PHP_URL_HOST));
return wp_parse_args($args, $new_header);
}
Con eso, es como si mi función no existiera: mi encabezado no se agrega, pero tampoco se eliminan los encabezados y la configuración de correo de los demás.
¿Cuál es la forma correcta de agregar un encabezado a un correo electrónico saliente, sin codificar ningún otro filtro que pueda existir?

Respuestas:
Gracias a lo anterior, me di cuenta de mi error central: no me di cuenta de que los argumentos que se pasaban eran una matriz multidimensional.
Por ahora, he vuelto a implementar la función así:
Mi lectura de la fuente wp_mail () (ver: https://core.trac.wordpress.org/browser/tags/4.4.2/src/wp-includes/pluggable.php#L235 ) me lleva a creer que los encabezados El componente puede ser una matriz, o una cadena grande, o posiblemente una mezcla horrible de los dos, pero que usar una matriz es probablemente la opción más segura / correcta.
Me gustan las diversas respuestas de phpmailer, pero parece un poco más limpio tratar de hacer cosas usando las funciones integradas de WordPress.
fuente
Aquí hay una alternativa usando directamente el
AddCustomHeadermétodo de laPHPMailerinstancia:Aquí podemos ver que hay dos formas de usarlo:
Ejemplo 1:
Aquí solo pasamos la información del encabezado en la
$namecadena de entrada, que está separada con:Ejemplo # 2:
Aquí están ambos
$namey$valueno vacíos:fuente
$args['headers'] = 'key: value'través de filtros WP.phpmailer_initgancho se activa más tarde que cuandowp_mailse aplica el filtro y los encabezados personalizados de ese filtro también se agregan a través delAddCustomHeader()método, por lo que yo entiendo. @sumitPHP
headersson cadenas. No puede analizarlos como matriz. Debe agregar un encabezado adicional como cadena\r\npara asegurarse de que se agregue en la siguiente línea.Ejemplo:
También tenga en cuenta agregar encabezados adicionales por fin con prioridad
99para que ningún otro complemento pueda reemplazarlo si no está verificando que los encabezados ya estén presentes. Si es necesario, hazlo999.fuente
wp_mailacepta una matriz para el argumento del encabezado y WP se encargará de agregar \ r \ nPHP headerslo quewp_mailacepta. Por fin los encabezados son cadenas. ¡Lo que síwp_mailacepta no era la pregunta! @ JanBeck