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_mail
funció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
AddCustomHeader
método de laPHPMailer
instancia:Aquí podemos ver que hay dos formas de usarlo:
Ejemplo 1:
Aquí solo pasamos la información del encabezado en la
$name
cadena de entrada, que está separada con:
Ejemplo # 2:
Aquí están ambos
$name
y$value
no vacíos:fuente
$args['headers'] = 'key: value'
través de filtros WP.phpmailer_init
gancho se activa más tarde que cuandowp_mail
se 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
headers
son cadenas. No puede analizarlos como matriz. Debe agregar un encabezado adicional como cadena\r\n
para asegurarse de que se agregue en la siguiente línea.Ejemplo:
También tenga en cuenta agregar encabezados adicionales por fin con prioridad
99
para que ningún otro complemento pueda reemplazarlo si no está verificando que los encabezados ya estén presentes. Si es necesario, hazlo999
.fuente
wp_mail
acepta una matriz para el argumento del encabezado y WP se encargará de agregar \ r \ nPHP headers
lo quewp_mail
acepta. Por fin los encabezados son cadenas. ¡Lo que síwp_mail
acepta no era la pregunta! @ JanBeck