¿Hay alguna forma de enviar correos electrónicos con formato HTML usando la función wp_mail() de WordPress?
¿Existe algún action_hook o algo similar que pudiera ayudarme a lograr esto?
Intenté agregar marcado HTML en una variable string de PHP y simplemente envié un correo con la función wp_mail()
así:
$email_to = 'someaddress@gmail.com';
$email_subject = 'Email subject';
$email_body = "<html><body><h1>Hello World!</h1></body></html>";
$send_mail = wp_mail($email_to, $email_subject, $email_body);
¿Pero apareció como texto plano?
¿Alguna idea?

Como alternativa, puedes especificar el encabezado HTTP Content-Type en el parámetro $headers:
$to = 'sendto@example.com';
$subject = 'El asunto';
$body = 'El contenido del cuerpo del correo electrónico';
$headers = array('Content-Type: text/html; charset=UTF-8');
wp_mail( $to, $subject, $body, $headers );

Esto funciona mejor ya que el add_filter a veces aparece como adjunto. ¡Gracias por compartir!

Esta es generalmente la mejor manera de hacerlo. La respuesta principal interferirá con otros plugins y causará problemas.

Por lo que puedo leer del código fuente de wp_mail(), los encabezados no pueden ser un array, sino que deben estar en el formato 'to: joe@domain.com'. Todavía estoy probando esto, y dejaré que desarrolladores más experimentados verifiquen mi afirmación.

de la página del codex de wp_mail:
El tipo de contenido por defecto es 'text/plain' que no permite usar HTML. Sin embargo, puedes establecer el tipo de contenido del correo electrónico usando el filtro 'wp_mail_content_type'.
// En el functions.php del tema o código del plugin:
function wpse27856_set_content_type(){
return "text/html";
}
add_filter( 'wp_mail_content_type','wpse27856_set_content_type' );
Ahora, cada vez que se llame a wp_mail
, ya sea en tu código, en el código de WordPress, en el código de un plugin o en el código de un tema, el tipo MIME se establecerá como text/html
. Si hay alguna invocación de wp_mail
que envíe texto plano, esas invocaciones ahora fallarán. Así que ten cuidado.

Mmm suena útil. Solo una pregunta, ¿alguna razón particular por la que nombraste tu función wpse27856_set_content_type?

No, es solo un nombre único basado en el id de esta pregunta en particular. wpse = wp stackexchange, 27856 es el id de esta pregunta en la URL. Solo hago eso para evitar posibles colisiones si la gente copia/pega código de aquí.

También puedes incluir directamente el Content-Type en los encabezados de tu correo. Echa un vistazo a cómo lo hace el plugin Notifly.

ah sí, ja ja. Qué novato soy. Supongo que es el ID de esta publicación.

¿El correo debería ser un archivo .txt o un archivo .html? Estoy usando este método pero si veo el código fuente es un archivo .txt y la imagen incrustada no se procesa.

@AlxVallejo si estás enviando desde un archivo probablemente necesitarás leer el archivo como una cadena primero.

pasar los encabezados directamente es un método más eficiente que añadir un hook. -1

@Jeremy claro, pero pasar los encabezados directamente no es una opción en muchos casos, como cuando no es tu código el que llama a wp_mail
.

@Milo Tienes razón pero para esta pregunta los encabezados son la respuesta correcta.

Esto romperá tu correo de restablecimiento de contraseña, porque el enlace de restablecimiento está envuelto en <>.

¿No rompe esto cualquier otro código que espere que wp_mail
envíe correos de texto plano, en lugar de correos HTML?

@SimonJosefKok, si estoy leyendo correctamente este informe de error, el problema de romper los correos de restablecimiento de contraseña se resolvió a partir de WordPress 5.4. Parece que decidieron eliminar los corchetes angulares de la dirección de correo. https://core.trac.wordpress.org/ticket/23578#comment:24

No olvides eliminar el filtro del tipo de contenido después de usar la función wp_mail. Siguiendo la nomenclatura de la respuesta aceptada, deberías hacer esto después de que wp_mail se ejecute:
remove_filter( 'wp_mail_content_type','wpse27856_set_content_type' );
Revisa este ticket aquí - Restablecer content-type para evitar conflictos -- http://core.trac.wordpress.org/ticket/23578

Otra forma sencilla que voy a compartir a continuación. Incluso puedes dar estilo al cuerpo del correo como desees. Quizás te sea útil.
$email_to = 'someaddress@gmail.com';
$email_subject = 'Asunto del correo';
// <<<EOD es la sintaxis heredoc de PHP
$email_body = <<<EOD
Esta es tu nueva <b style="color: red; font-style: italic;">contraseña</b> : {$password}
EOD;
$headers = ['Content-Type: text/html; charset=UTF-8'];
$send_mail = wp_mail( $email_to, $email_subject, $email_body, $headers );
Más sobre la sintaxis heredoc de PHP https://www.php.net/manual/en/language.types.string.php#language.types.string.syntax.heredoc

Usa ob_start
, ya que esto te permitirá utilizar variables/funciones de WP como bloginfo, etc.
Crea un archivo PHP y pega tu HTML en ese archivo (usa variables de WP dentro de ese archivo PHP si es necesario).
Utiliza el siguiente código:
$to = 'Dirección de correo electrónico';
$subject = 'Tu asunto';
ob_start();
include(get_stylesheet_directory() . '/plantilla-correo.php'); // Ruta del archivo de plantilla
$body = ob_get_contents();
ob_end_clean();
$headers = array('Content-Type: text/html; charset=UTF-8','From: Prueba <prueba@prueba.com>');
wp_mail( $to, $subject, $body, $headers );
Esto mantendrá tu código limpio y debido a ob_start también ahorraremos tiempo al cargar el archivo.
