Incluir archivo de plantilla HTML en wp_mail

18 abr 2013, 22:38:54
Vistas: 33.9K
Votos: 4

Estoy usando wp_mail() para enviar un correo electrónico HTML. Pero hay bastante código HTML en el correo, así que en lugar de incluir todo el código en mi función wp_mail(), ¿es posible tener el código en una plantilla separada y simplemente incluir esta plantilla en la función? Esto es lo que tengo:

<?php if ( isset( $_POST['submitted'] )) {
   add_filter('wp_mail_content_type',create_function('', 'return "text/html"; '));
   $emailTo = 'person@gmail.com' ;
   $subject = 'Este es el asunto';
   $body = get_template_part( 'includes/my_email_template' );
   $headers = 'From: Mi Nombre' . "\r\n";
   wp_mail($emailTo, $subject, $body, $headers);
}?>

Me gustaría poder poner todo mi código HTML en 'my_email_template' pero cuando intento esto, no se envía ningún correo electrónico. ¿Estoy incluyendo la plantilla de forma incorrecta? Gracias de antemano por cualquier respuesta.

5
Comentarios

Error de sintaxis: $emailTo = person@gmail.com ; prueba con $emailTo = 'person@gmail.com';.

fuxia fuxia
18 abr 2013 22:42:04

Estás llamando a la plantilla incorrectamente - consulta el codex para get_template_part

vancoder vancoder
18 abr 2013 22:44:56

Gracias a ambos. Ese error de sintaxis fue solo un descuido mío al copiar/pegar/ajustar. Confirmo que está correcto en mi plantilla real.

Xav Xav
18 abr 2013 22:53:46

@vancoder Ni siquiera estoy seguro de que debería estar usando get_template_path. El archivo solo contiene HTML y algunas variables que he definido en el archivo que lo llama. Tal vez include (TEMPLATEPATH . 'includes/my_email_template.php'); sea la opción correcta?

Xav Xav
18 abr 2013 22:58:20

¿Tu archivo de plantilla retorna un string? Si solo lo incluyes, cualquier HTML o echo se imprimirá directamente en pantalla en lugar de asignarse a $body. Imagino que eso también causará algunos errores con wp_mail.

s_ha_dum s_ha_dum
18 abr 2013 23:29:55
Todas las respuestas a la pregunta 3
2
13

Aquí tienes el código de ejemplo para usar el almacenamiento en búfer de salida. Podrás acceder a todas las variables dentro de la plantilla que están definidas encima de la "línea de inclusión".

WordPress: Incluir plantilla en el correo electrónico.

ob_start();
include(get_stylesheet_directory() . '/assets/email-templates/booking-details-template.php');
$email_content = ob_get_contents();
ob_end_clean();
$headers = array('Content-Type: text/html; charset=UTF-8');
wp_mail($to_email, "Detalles de la reserva", $email_content, $headers);
6 nov 2018 01:39:27
Comentarios

Esta es la forma más fácil de personalizar wp_mail sin duda

Kevin Mamaqi Kevin Mamaqi
8 dic 2019 09:22:17

También lo usé para obtener el encabezado y pie de página predeterminados de Woocommerce en mi función personalizada de envío de correos electrónicos, reemplazando la línea include con un do_action de woocommerce_email_header. ¡Gracias!

Suika Suika
9 mar 2020 03:33:35
0

Como mencioné en mi comentario a tu pregunta, creo que el problema es que incluir archivos, ya sea directamente o usando get_template_part, probablemente no te dará una cadena para pasar a $body y eso causará errores en el código, o al menos un comportamiento inesperado.

Recomendaría evitar leer archivos en memoria y simplemente crear una función que retorne el contenido de tu $body.

function get_email_body_wpse_96357() {
    $body = '<p>Hola</p>';
    return $body;
}

Luego usa $body = get_email_body_wpse_96357(); según sea necesario. Una ventaja de este método es que puedes pasar parámetros fácilmente a la función si decides hacerlo en el futuro. También podrías usar variables en un archivo incluido, pero puede volverse complicado.

Si no deseas cargar esa función todo el tiempo, entonces colócala en un archivo separado e inclúyelo solo cuando necesites la función.

19 abr 2013 00:11:01
5

La función get_template_part() no retorna el HTML sino que lo imprime directamente (utiliza locate_template() que carga el archivo - echo).

Puedes activar el buffer de salida usando ob_start() y guardar el buffer en tu variable o puedes usar file_get_contents().

En tu caso creo que la mejor solución es esta:

$body = file_get_contents(TEMPLATEPATH . 'includes/my_email_template.php');
18 abr 2013 23:40:49
Comentarios

Gracias por tu respuesta ItayXD, pero ahora lo tengo funcionando usando la respuesta de arriba

Xav Xav
19 abr 2013 00:37:36

Lo vi, la respuesta de arriba es muy inferior en mi opinión. file_get_contents es exactamente lo que estabas buscando, y es mucho más fácil escribir un archivo html normalmente que usar la solución anterior. De hecho, no veo cómo es mejor, solo puedo ver las desventajas.

ItayXD ItayXD
19 abr 2013 00:43:05

Esto es más limpio y fácil. Mucho más MVC al tener la lógica en functions.php y la plantilla en su propio archivo.

rebellion rebellion
24 ago 2014 20:48:19

¿Cómo pasar variables a las plantillas?

mpsbhat mpsbhat
4 jun 2016 04:29:01

He visto que se pasan variables usando str_ireplace como en str_ireplace('[username]',$user_login, $message_template); -- ¿es esta la forma ideal/mejor práctica? - De este enlace: http://www.avtex.com/blog/2012/03/14/creating-dynamic-html-e-mail-templates-in-wordpress/

ejntaylor ejntaylor
30 dic 2016 21:50:55