В чем суть задачи: добавление пользовательских данных в email WooCommerce
Во многих проектах на WooCommerce требуется расширить стандартные email-уведомления дополнительной информацией, например, добавить кастомные поля заказа, примечания или ссылки. Для этого можно использовать хук woocommerce_email, но правильнее и удобнее — хук woocommerce_email_recipient_{$email_id} или фильтры для изменения содержимого писем. В статье подробно разберем, как через хук woocommerce_email_to добавить дополнительные данные непосредственно в тело письма, не меняя шаблоны.
Диагностика: почему стандартные методы не всегда подходят
Стандартные шаблоны WooCommerce email расположены в woocommerce/templates/emails/. При переопределении через тему вы можете добавить данные, но это требует работы с PHP и HTML шаблонами. Не всегда удобно и безопасно. Также, некоторые плагины могут конфликтовать с переопределениями.
Хук woocommerce_email_to позволяет программно вмешиваться в формирование тела письма, добавляя или фильтруя содержимое без редактирования шаблонов. Это реальный способ добавить динамические данные, например, содержимое пользовательского поля заказа, без риска поломать верстку.
Пошаговое решение: добавляем кастомные данные в email через хук woocommerce_email_to
1. Определяем нужный email ID
WooCommerce использует идентификаторы email уведомлений, например, new_order, customer_processing_order, customer_completed_order. Нужно выбрать, в какое письмо добавить данные. Пример ниже добавляет информацию в письмо о новом заказе.
2. Добавляем фильтр в functions.php или в плагин
add_filter('woocommerce_email_to_new_order', 'add_custom_data_to_new_order_email', 10, 2);
function add_custom_data_to_new_order_email($email_content, $order) {
if (!is_a($order, 'WC_Order')) {
return $email_content;
}
// Получаем значение кастомного поля из мета заказа
$custom_value = $order->get_meta('_custom_order_field');
if ($custom_value) {
// Формируем HTML для вставки
$custom_html = '<p><strong>Дополнительная информация:</strong> ' . esc_html($custom_value) . '</p>';
// Вставляем перед закрывающим тегом </body> или просто в конец
$email_content .= $custom_html;
}
return $email_content;
}3. Проверяем наличие кастомного поля в заказе
Кастомное поле _custom_order_field можно заполнить, например, при оформлении заказа через woocommerce_checkout_update_order_meta:
add_action('woocommerce_checkout_update_order_meta', 'save_custom_checkout_field');
function save_custom_checkout_field($order_id) {
if (!empty($_POST['custom_field'])) {
update_post_meta($order_id, '_custom_order_field', sanitize_text_field($_POST['custom_field']));
}
}4. Добавляем поле на страницу оформления заказа
Чтобы пользователь вводил данные, добавьте поле в форму:
add_action('woocommerce_after_order_notes', 'add_custom_checkout_field');
function add_custom_checkout_field($checkout) {
echo '<div id="custom_checkout_field">';
woocommerce_form_field('custom_field', array(
'type' => 'text',
'class' => array('custom-field-class form-row-wide'),
'label' => __('Дополнительная информация'),
'placeholder' => __('Введите данные для заказа'),
'required' => false,
), $checkout->get_value('custom_field'));
echo '</div>';
}Проверка результата после внедрения
1. Создайте тестовый заказ, заполнив дополнительное поле на оформлении.
2. Проверьте письмо «Новый заказ» (new_order) — в теле письма должна появиться ваша дополнительная информация.
3. Для локальной проверки можно использовать плагин WP Mail Logging или аналогичный, чтобы увидеть сформированный email.
Частые ошибки и как их исправить
- Пустое значение кастомного поля: Проверьте, что поле действительно сохраняется в мета заказа. Используйте var_dump или error_log для отладки.
- Письмо не содержит изменений: Проверьте, что используете правильный идентификатор email в фильтре. Для других писем нужно менять
woocommerce_email_to_{$email_id}. - HTML в письме ломается: Соблюдайте корректный HTML. Не вставляйте неэкранированный пользовательский ввод без
esc_html. - Конфликт с другими плагинами email: Временно отключите плагины, влияющие на email, чтобы проверить совместимость.
Практические советы по безопасности и производительности
- Всегда очищайте пользовательские данные через
sanitize_text_fieldили аналогичные функции перед сохранением и выводом. - Не вставляйте в письмо слишком большой объем данных — это может привести к блокировкам у почтовых провайдеров.
- Если требуется массовая рассылка, используйте отложенную отправку или сторонние сервисы SMTP/API.
- Для быстрой отладки email включайте WP_DEBUG_LOG и используйте логгеры почты.
Сравнение способов добавления данных в email WooCommerce
| Метод | Где менять | Плюсы | Минусы |
|---|---|---|---|
| Переопределение шаблонов | Тема | Высокий контроль над разметкой | Сложно поддерживать, конфликт с обновлениями |
Хук woocommerce_email_to_{$email_id} | functions.php или плагин | Легко внедрять, не требует редактирования шаблонов | Ограничен возможностями форматирования |
| Плагины для email кастомизации | Админка | Удобно, без кода | Могут быть тяжелыми и конфликтовать |