¿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!
deepakssn
Esta es generalmente la mejor manera de hacerlo. La respuesta principal interferirá con otros plugins y causará problemas.
Alex Standiford
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.
Rick Hellewell
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?
racl101
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í.
Milo
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.
Otto
ah sí, ja ja. Qué novato soy. Supongo que es el ID de esta publicación.
racl101
¿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
@AlxVallejo si estás enviando desde un archivo probablemente necesitarás leer el archivo como una cadena primero.
Blowsie
pasar los encabezados directamente es un método más eficiente que añadir un hook. -1
Jeremy
@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
@Milo Tienes razón pero para esta pregunta los encabezados son la respuesta correcta.
Jeremy
Esto romperá tu correo de restablecimiento de contraseña, porque el enlace de restablecimiento está envuelto en <>.
Simon Josef Kok
¿No rompe esto cualquier otro código que espere que wp_mail envíe correos de texto plano, en lugar de correos HTML?
Flimm
@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
Mark Berry
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.