Incluir archivo de plantilla HTML en wp_mail
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.

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);

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.

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');

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

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.

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.

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/
