Диагностика проблемы: почему вложения не отправляются с WooCommerce письмами
По умолчанию WooCommerce не поддерживает отправку вложений к стандартным email-уведомлениям, например, при смене статуса заказа или отправке счета. Многие разработчики и владельцы магазинов сталкиваются с задачей прикрепить PDF-файл, договор или сертификат к письму, но при попытке добавить вложение через стандартные хуки письма вложения не приходят.
Основная причина в том, что класс WC_Emails и его методы не предусматривают передачу дополнительных вложений напрямую, а стандартный фильтр woocommerce_email_attachments нужно использовать с правильной логикой и параметрами.
Пошаговое решение: добавляем вложения в email-уведомления WooCommerce через хук
1. Определяем, к каким письмам нужно прикрепить вложение
Для начала нужно решить, к каким именно типам уведомлений требуется добавить вложения. Например, к письму с заказом в статусе "выполнен" (completed_order) или "обработка" (processing_order).
2. Используем фильтр woocommerce_email_attachments
Этот фильтр позволяет добавить массив путей к файлам, которые будут прикреплены к email. Важно проверить тип письма и ID заказа, чтобы вложения добавлялись только там, где нужно.
3. Пример кода для functions.php или собственного плагина:
add_filter('woocommerce_email_attachments', 'add_attachment_to_woocommerce_emails', 10, 3);
function add_attachment_to_woocommerce_emails($attachments, $email_id, $order) {
// Проверяем, что $order это объект WC_Order
if (! is_a($order, 'WC_Order')) {
return $attachments;
}
// Указываем, к каким email добавлять вложение
$emails_with_attachments = array(
'customer_completed_order', // заказ выполнен
'customer_processing_order' // заказ в обработке
);
if (in_array($email_id, $emails_with_attachments)) {
// Путь к файлу вложения, например PDF счет
$upload_dir = wp_upload_dir();
$file_path = $upload_dir['basedir'] . '/invoices/invoice-' . $order->get_id() . '.pdf';
if (file_exists($file_path)) {
$attachments[] = $file_path;
}
}
return $attachments;
}Проверка результата после внедрения
Чтобы убедиться, что вложение уходит с письмом:
- Создайте тестовый заказ в WooCommerce и переведите его в статус, к которому вы добавляете вложение (например, "выполнен").
- Проверьте, что письмо пришло на почту и в нем есть нужный PDF-файл или другой вложенный файл.
- Если письма не приходят, убедитесь, что путь к файлу указан правильно и файл существует.
- Для отладки можно добавить в код
error_log()для вывода информации о вложении и параметрах email.
Частые ошибки и как их исправить
- Неправильный путь к файлу: Частая ошибка — указать неправильный абсолютный или относительный путь. Используйте
wp_upload_dir()для построения пути к файлам в папке загрузок. - Передача неверного объекта заказа: Фильтр передает третий параметр — объект
WC_Order. Если приходит null или другой тип, вложения не будут добавлены. - Добавление вложений к неподдерживаемым email: Если не проверить идентификатор письма, вложения могут добавляться не к тем письмам или вообще не работать.
- Проблемы с правами доступа к файлам: Сервер должен иметь права на чтение вложений.
Практические советы по безопасности и производительности
- Храните вложения вне публичных каталогов, если они содержат конфиденциальные данные, и генерируйте их динамически, если возможно.
- Оптимизируйте размер вложений, чтобы не перегружать почтовые серверы и не вызывать блокировки.
- Кэшируйте генерируемые PDF, чтобы не создавать их заново при каждом письме.
- Проверяйте корректность MIME-типов, если используете нестандартные форматы вложений.
Сравнение способов добавления вложений к email WooCommerce
| Метод | Плюсы | Минусы |
|---|---|---|
Использование фильтра woocommerce_email_attachments | Простая реализация, гибкое добавление вложений по email ID | Нужно контролировать пути и проверять права доступа |
| Использование сторонних плагинов (например, PDF Invoice) | Автоматическая генерация счетов, интеграция с письмами | Зависимость от плагина, возможные ограничения в кастомизации |
| Перехват и модификация email через SMTP-сервер | Гибкость в обработке почты на уровне сервера | Сложность настройки, не всегда доступно |