Диагностика проблемы: почему вложения не добавляются в email WooCommerce
WooCommerce по умолчанию не поддерживает добавление вложений к уведомлениям email. Многие разработчики сталкиваются с задачей добавить PDF-счёт, договор или прайс-лист к письмам, но стандартного интерфейса для этого нет. Если вложения не появляются, необходимо проверить, правильно ли реализован код, и корректно ли подхватывается нужный email-уведомление.
Пошаговое решение: добавляем вложения в письма WooCommerce
1. Определяем нужный хук
Для добавления вложений используется фильтр woocommerce_email_attachments. Он позволяет добавить массив путей к файлам, которые будут прикреплены к письму.
2. Пример базового кода для добавления вложения
add_filter('woocommerce_email_attachments', 'add_attachment_to_woocommerce_email', 10, 3);
function add_attachment_to_woocommerce_email($attachments, $email_id, $order) {
// Добавляем вложение только к email с ID 'customer_completed_order'
if ($email_id === 'customer_completed_order' && $order instanceof WC_Order) {
// Путь к файлу на сервере
$upload_dir = wp_upload_dir();
$file_path = $upload_dir['basedir'] . '/invoices/invoice-' . $order->get_order_number() . '.pdf';
if (file_exists($file_path)) {
$attachments[] = $file_path;
}
}
return $attachments;
}В этом примере вложение прикрепится только к письму о завершённом заказе, если файл существует в папке /wp-content/uploads/invoices/.
3. Генерация вложения (PDF) динамически
Если необходимо сгенерировать PDF-счёт на лету, для этого можно использовать библиотеки вроде TCPDF или mPDF. Пример упрощённой генерации и сохранения файла:
function generate_invoice_pdf($order) {
$upload_dir = wp_upload_dir();
$file_path = $upload_dir['basedir'] . '/invoices/invoice-' . $order->get_order_number() . '.pdf';
if (!file_exists($file_path)) {
// Подключаем TCPDF (пример)
require_once 'tcpdf_include.php';
$pdf = new TCPDF();
$pdf->AddPage();
$pdf->SetFont('helvetica', '', 12);
$pdf->Write(0, 'Invoice for order #' . $order->get_order_number());
// Можно добавить больше данных заказа
$pdf->Output($file_path, 'F');
}
return $file_path;
}И использовать в фильтре:
add_filter('woocommerce_email_attachments', 'add_dynamic_invoice_attachment', 10, 3);
function add_dynamic_invoice_attachment($attachments, $email_id, $order) {
if ($email_id === 'customer_completed_order' && $order instanceof WC_Order) {
$file_path = generate_invoice_pdf($order);
if ($file_path && file_exists($file_path)) {
$attachments[] = $file_path;
}
}
return $attachments;
}Проверка результата после внедрения
- Оформите тестовый заказ и переведите его в статус «Завершён».
- Проверьте, что в письме с уведомлением есть вложение PDF-файла.
- Если письма не приходят, временно включите логирование email через плагин
WP Mail Loggingили аналогичный. - Убедитесь, что файл существует и доступен серверу по указанному пути.
Частые ошибки и как их исправить
- Вложение не появляется: проверьте правильность ID email (
$email_id) — для разных писем он разный (например,customer_processing_order,customer_completed_order). - Файл не найден: убедитесь, что путь к файлу абсолютный и файл реально существует. Используйте
file_exists(). - Письма не отправляются после добавления кода: возможен синтаксический сбой или конфликт с другим плагином. Включите WP_DEBUG и просмотрите ошибки.
- Большой размер вложений замедляет отправку: оптимизируйте PDF или используйте ссылки вместо вложений.
Практические советы по безопасности и производительности
- Не храните генерируемые PDF в публичных папках без ограничений доступа — можно настроить .htaccess или использовать приватные папки.
- Добавляйте вложения только к нужным типам писем, чтобы не создавать лишнюю нагрузку и не увеличивать трафик.
- Очистка старых PDF-файлов: настройте CRON-задачу для удаления файлов старше, например, 30 дней.
- Используйте кеширование генерации PDF, чтобы не создавать файл при каждом письме.
Сравнение способов добавления вложений в WooCommerce Email
| Метод | Плюсы | Минусы | Когда использовать |
|---|---|---|---|
| Добавление статического файла | Просто реализовать, не требует дополнительных библиотек | Файл всегда один и тот же, не персонализирован | Прикрепить прайс-лист, инструкцию |
| Генерация PDF динамически | Персонализация, актуальность данных | Требует ресурсов, библиотек, кэширования | Счета, договоры, индивидуальные предложения |
| Добавление ссылки вместо вложения | Меньше нагрузки, проще масштабировать | Зависимость от доступности сайта, не всегда удобно | Большие файлы, часто обновляемые материалы |