Подключение HTML шаблона в wp_mail
Я использую wp_mail()
для отправки HTML-писем. Но в письме довольно много HTML-кода, поэтому вместо того, чтобы включать весь код в функцию wp_mail()
, возможно ли хранить код в отдельном шаблоне и просто подключать этот шаблон в функции? Вот что у меня есть:
<?php if ( isset( $_POST['submitted'] )) {
add_filter('wp_mail_content_type',create_function('', 'return "text/html"; '));
$emailTo = 'person@gmail.com' ;
$subject = 'Это тема письма';
$body = get_template_part( 'includes/my_email_template' );
$headers = 'From: Мое Имя' . "\r\n";
wp_mail($emailTo, $subject, $body, $headers);
}?>
Я хотел бы поместить весь мой HTML-код в 'my_email_template', но когда я пробую это сделать, письмо не отправляется. Правильно ли я подключаю шаблон? Заранее спасибо за любые ответы.

Вот пример кода для использования буферизации вывода. Вы сможете получить доступ ко всем переменным внутри шаблона, которые определены выше строки включения.
WordPress: Включение шаблона в электронное письмо.
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, "Детали бронирования", $email_content, $headers);

Как я уже упоминал в комментарии к вашему вопросу, проблема заключается в том, что использование include
для файлов, будь то напрямую или через get_template_part
, скорее всего не даст строку для передачи в $body
, что вызовет ошибки в коде или, как минимум, неожиданное поведение.
Я бы избегал загрузки файлов в память и просто создал функцию, возвращающую содержимое для $body
.
function get_email_body_wpse_96357() {
$body = '<p>Привет</p>';
return $body;
}
Затем используйте $body = get_email_body_wpse_96357();
по необходимости. Преимущество этого метода в том, что вы можете легко передавать параметры в функцию, если решите это сделать. Вы также могли бы использовать переменные в подключаемом файле, но это может быть грязно.
Если вы не хотите загружать эту функцию постоянно, поместите её в отдельный файл и подключайте только тогда, когда функция нужна.

Функция get_template_part()
не возвращает HTML, а выводит его напрямую (она использует locate_template()
, который загружает файл и выводит его содержимое).
Вы можете либо включить буферизацию вывода с помощью ob_start()
и поместить буфер в переменную, либо использовать file_get_contents()
.
В вашем случае, я считаю, лучше всего подойдёт такое решение:
$body = file_get_contents(TEMPLATEPATH . 'includes/my_email_template.php');

Спасибо за ваш ответ ItayXD, но теперь у меня это работает с использованием ответа выше

Я видел, ответ выше значительно хуже по моему мнению. file_get_contents - это именно то, что вам нужно, и гораздо проще писать html-файл обычным способом, чем использовать предложенное выше решение. Фактически, я просто не понимаю, чем это лучше - вижу только недостатки.

Это чище и проще. Более соответствует MVC, так как логика находится в functions.php, а шаблон - в отдельном файле.

Я видел, что переменные передаются с помощью str_ireplace, например: str_ireplace('[username]',$user_login, $message_template); — это идеальный/лучший способ? Из этой статьи: http://www.avtex.com/blog/2012/03/14/creating-dynamic-html-e-mail-templates-in-wordpress/
