Диагностика проблемы: Почему стандартный WooCommerce не поддерживает вложения в письмах
По умолчанию WooCommerce не предоставляет интерфейс для добавления вложений к email-уведомлениям. Это ограничение вызывает необходимость использовать хуки и фильтры для расширения функционала. Если вы пытаетесь добавить вложения через сторонние плагины, но они не работают или не дают гибкости, решение лежит в кастомном коде.
Пошаговое решение: Добавление вложений к email WooCommerce через хук woocommerce_email_attachments
1. Определение, к каким письмам нужно добавить вложения
Первым делом необходимо отфильтровать нужные email-уведомления. В WooCommerce идентификатор письма доступен как $email->id. Например, чтобы добавить вложение только к письму с новым заказом (new_order), проверяем этот ID.
2. Подключение файла вложения
Файл должен быть доступен на сервере и иметь корректный путь. Лучше использовать абсолютные пути и проверять существование файла, чтобы избежать ошибок.
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) {
// Добавляем вложение только к письму с новым заказом
if ($email_id === 'new_order' && $order instanceof WC_Order) {
$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;
}
В данном примере предполагается, что PDF счет-фактура для заказа хранится в папке wp-content/uploads/invoices/ с именем, соответствующим ID заказа.
Проверка результата после внедрения
Чтобы проверить, что вложение действительно добавляется:
- Создайте тестовый заказ в вашем магазине WooCommerce.
- Убедитесь, что в папке
wp-content/uploads/invoices/есть PDF-файл с именемinvoice-[ID_заказа].pdf. - Проверьте электронную почту, на которую отправляется уведомление о новом заказе — в письме должно быть вложение с указанным PDF.
Если вложение не приходит, проверьте логи сервера и убедитесь, что путь к файлу указан правильно и файл доступен для чтения.
Частые ошибки и их исправление
- Вложение не добавляется к письму: проверьте, что
$email_idсовпадает с нужным идентификатором письма. Для диагностики можно временно добавитьerror_log($email_id);в функцию. - Путь к файлу некорректен: используйте функцию
file_exists()для проверки доступности файла перед добавлением. Убедитесь, что путь абсолютный. - Файл не создаётся: если PDF формируется динамически, убедитесь, что процесс генерации завершается до отправки письма.
- Письма не отправляются после добавления кода: проверьте синтаксис PHP, наличие ошибок в логах, и что функция возвращает массив вложений.
Практические советы по безопасности и производительности
- Не храните вложения в директориях с публичным доступом без защиты, чтобы избежать утечки данных.
- Генерируйте вложения заранее, а не в момент отправки письма, чтобы не блокировать отправку.
- Используйте кеширование или отложенную генерацию PDF, если у вас большой поток заказов.
- Проверяйте права доступа к файлам и папкам, чтобы избежать ошибок чтения.
Сравнение способов добавления вложений к email WooCommerce
| Способ | Плюсы | Минусы |
|---|---|---|
Использование хука woocommerce_email_attachments | Гибкость, точечное добавление вложений к любым письмам | Требуется программирование, знание WooCommerce API |
| Плагины для вложений в письмах | Простота установки, не требует программирования | Могут быть ограничены по функционалу, конфликты с другими плагинами |
| Изменение шаблонов email | Можно добавить ссылки на вложения | Не добавляет настоящие вложения, требует понимания шаблонов |