¿Hay alguna forma de enviar correos electrónicos con formato HTML usando la función wp_mail() de WordPress?

7 sept 2011, 00:08:38
Vistas: 152K
Votos: 74

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

1
Comentarios

Mira este increíble artículo sobre wp_mail() https://www.phparticles.com/wordpress/how-to-use-wp-mail-with-wordpress/

Mr.Happy Mr.Happy
4 oct 2020 15:34:56
Todas las respuestas a la pregunta 5
6
175

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 );
26 jul 2015 18:01:32
Comentarios

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

deepakssn deepakssn
17 feb 2018 20:54:57

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

Alex Standiford Alex Standiford
6 dic 2019 21:12:35

Esta debería ser la respuesta aceptada

CaptainNemo CaptainNemo
27 sept 2020 21:49:20

¡Esta respuesta debería ser la aceptada!

Fernando Torres Fernando Torres
30 jun 2021 23:46:10

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 Rick Hellewell
6 ago 2022 01:37:14

Esta solución es mucho mejor porque con la técnica de add_filter() es muy fácil olvidar el remove_filter('wp_mail_content_type'); y dejar todo en desorden para otros plugins.

Brian C Brian C
8 oct 2023 15:04:17
Mostrar los 1 comentarios restantes
12
79

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.

7 sept 2011 00:23:34
Comentarios

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

racl101 racl101
7 sept 2011 00:31:04

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 Milo
7 sept 2011 00:45:32

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 Otto
7 sept 2011 03:29:46

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

racl101 racl101
7 sept 2011 10:44:03

¿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
28 jul 2012 02:21:08

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

Blowsie Blowsie
28 ene 2013 14:48:30

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

Jeremy Jeremy
2 nov 2016 01:05:40

@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
2 nov 2016 05:20:54

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

Jeremy Jeremy
2 nov 2016 23:12:13

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

Simon Josef Kok Simon Josef Kok
24 oct 2017 09:08:04

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

Flimm Flimm
4 abr 2019 15:31:42

@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 Mark Berry
11 feb 2020 03:22:47
Mostrar los 7 comentarios restantes
1
14

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

2 ene 2015 16:25:25
Comentarios

¿Esto no debería ser un comentario en lugar de una respuesta?

Bob Diego Bob Diego
26 jul 2017 17:31:07
0

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

5 abr 2020 08:39:47
0

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.

5 mar 2020 05:28:13