Подключение HTML шаблона в wp_mail

18 апр. 2013 г., 22:38:54
Просмотры: 33.9K
Голосов: 4

Я использую 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', но когда я пробую это сделать, письмо не отправляется. Правильно ли я подключаю шаблон? Заранее спасибо за любые ответы.

5
Комментарии

Синтаксическая ошибка: $emailTo = person@gmail.com ; попробуйте $emailTo = 'person@gmail.com';.

fuxia fuxia
18 апр. 2013 г. 22:42:04

Вы неправильно вызываете шаблон - см. кодекс для get_template_part

vancoder vancoder
18 апр. 2013 г. 22:44:56

Спасибо вам обоим. Эта синтаксическая ошибка была просто из-за моего неаккуратного копирования/вставки/правки. Подтверждаю, что в моём реальном шаблоне всё верно.

Xav Xav
18 апр. 2013 г. 22:53:46

@vancoder Я даже не уверен, стоит ли мне использовать get_template_path. Файл содержит только HTML и несколько переменных, которые я задал в файле, вызывающем его. Возможно, include (TEMPLATEPATH . 'includes/my_email_template.php'); будет правильным вариантом?

Xav Xav
18 апр. 2013 г. 22:58:20

Ваш шаблонный файл возвращает строку? Если вы просто подключите его, любой HTML или echo просто выведутся на экран, а не будут присвоены переменной $body. Думаю, это также может вызвать ошибки с wp_mail.

s_ha_dum s_ha_dum
18 апр. 2013 г. 23:29:55
Все ответы на вопрос 3
2
13

Вот пример кода для использования буферизации вывода. Вы сможете получить доступ ко всем переменным внутри шаблона, которые определены выше строки включения.

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);
6 нояб. 2018 г. 01:39:27
Комментарии

Это самый простой способ настроить wp_mail из всех возможных

Kevin Mamaqi Kevin Mamaqi
8 дек. 2019 г. 09:22:17

Также использовал этот метод, чтобы добавить стандартные шапку и подвал писем WooCommerce в свою функцию отправки кастомных писем, заменив строку с include на do_action для woocommerce_email_header. Спасибо!

Suika Suika
9 мар. 2020 г. 03:33:35
0

Как я уже упоминал в комментарии к вашему вопросу, проблема заключается в том, что использование include для файлов, будь то напрямую или через get_template_part, скорее всего не даст строку для передачи в $body, что вызовет ошибки в коде или, как минимум, неожиданное поведение.

Я бы избегал загрузки файлов в память и просто создал функцию, возвращающую содержимое для $body.

function get_email_body_wpse_96357() {
    $body = '<p>Привет</p>';
    return $body;
}

Затем используйте $body = get_email_body_wpse_96357(); по необходимости. Преимущество этого метода в том, что вы можете легко передавать параметры в функцию, если решите это сделать. Вы также могли бы использовать переменные в подключаемом файле, но это может быть грязно.

Если вы не хотите загружать эту функцию постоянно, поместите её в отдельный файл и подключайте только тогда, когда функция нужна.

19 апр. 2013 г. 00:11:01
5

Функция get_template_part() не возвращает HTML, а выводит его напрямую (она использует locate_template(), который загружает файл и выводит его содержимое).

Вы можете либо включить буферизацию вывода с помощью ob_start() и поместить буфер в переменную, либо использовать file_get_contents().

В вашем случае, я считаю, лучше всего подойдёт такое решение:

$body = file_get_contents(TEMPLATEPATH . 'includes/my_email_template.php');
18 апр. 2013 г. 23:40:49
Комментарии

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

Xav Xav
19 апр. 2013 г. 00:37:36

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

ItayXD ItayXD
19 апр. 2013 г. 00:43:05

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

rebellion rebellion
24 авг. 2014 г. 20:48:19

Как передавать переменные в шаблоны?

mpsbhat mpsbhat
4 июн. 2016 г. 04:29:01

Я видел, что переменные передаются с помощью 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/

ejntaylor ejntaylor
30 дек. 2016 г. 21:50:55