Диагностика проблемы: вложения к email WooCommerce не добавляются
Пользователи WooCommerce часто сталкиваются с задачей добавить PDF-счета, инструкции или другие файлы к email-уведомлениям, например, к письмам о заказе или доставке. Однако стандартного функционала для вложений в WooCommerce нет, и попытки добавить файлы через хуки часто не работают. Основные симптомы:
- Вложения отсутствуют в отправленных письмах
- Проблемы с правильным формированием пути к файлу
- Ошибки в логах PHP или почтового сервера
Для успешного добавления вложений нужно корректно использовать хук woocommerce_email_attachments и правильно формировать массив вложений.
Пошаговое решение: добавление вложений в email WooCommerce
Шаг 1. Подключаем хук woocommerce_email_attachments
Этот фильтр позволяет добавить массив путей к файлам, которые будут вложены в email. Важно проверять тип письма, чтобы вложения добавлялись только в нужные уведомления.
add_filter('woocommerce_email_attachments', 'add_attachments_to_woocommerce_emails', 10, 3);
function add_attachments_to_woocommerce_emails($attachments, $email_id, $order) {
// Проверяем тип email
if (in_array($email_id, array('customer_completed_order', 'new_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;
}
Шаг 2. Формируем и сохраняем PDF-счет заранее
Если вам нужно вложить PDF-счет, его нужно сгенерировать и сохранить на сервере до отправки письма. Обычно это делают при смене статуса заказа:
add_action('woocommerce_order_status_processing', 'generate_pdf_invoice_for_order');
function generate_pdf_invoice_for_order($order_id) {
$order = wc_get_order($order_id);
$upload_dir = wp_upload_dir();
$invoice_dir = $upload_dir['basedir'] . '/invoices/';
if (!file_exists($invoice_dir)) {
wp_mkdir_p($invoice_dir);
}
$file_path = $invoice_dir . 'invoice-' . $order_id . '.pdf';
// Реализация генерации PDF здесь (через TCPDF, FPDF или другой PHP-библиотекой)
// Например, используйте сторонний сервис или плагин
// Для примера создадим пустой файл
file_put_contents($file_path, 'PDF content for order ' . $order_id);
}
Проверка результата после внедрения
- Создайте тестовый заказ в WooCommerce и переведите его в статус «Обработка» (processing).
- Проверьте, что в папке
wp-content/uploads/invoices/появился PDF для заказа. - Дождитесь отправки письма «Заказ завершён» (customer_completed_order) и проверьте вложение в письме.
- Если почта не приходит или вложение отсутствует, проверьте логи сервера и отладочную информацию WooCommerce.
Частые ошибки и как их исправить
- Неправильный путь к файлу: Часто используют URL вместо абсолютного пути. В
woocommerce_email_attachmentsнужны именно полные пути на сервере. - Файл не существует: Проверьте, что PDF действительно создан до отправки письма.
- Права доступа к файлу: Убедитесь, что веб-сервер имеет права читать файл.
- Добавление вложений ко всем письмам: Используйте проверку
$email_id, чтобы не класть вложения в лишние уведомления. - Кэширование: Если используете кеш-плагины, временно отключите их при отладке.
Практические советы по безопасности и производительности
- Не генерируйте PDF «на лету» в хуках отправки почты — это увеличит время отправки и нагрузку сервера.
- Сохраняйте PDF в отдельной защищённой папке с правами доступа только для серверного пользователя.
- Очистка старых PDF: настройте CRON-задачу для удаления устаревших счетов, чтобы не засорять диск.
- Используйте проверенные библиотеки генерации PDF (TCPDF, Dompdf) и избегайте вызовов внешних сервисов при массовой отправке.
Сравнение вариантов добавления вложений к email WooCommerce
| Метод | Описание | Плюсы | Минусы |
|---|---|---|---|
| Плагин (например, WooCommerce PDF Invoices) | Генерация и вложение PDF автоматически | Готовое решение, простая настройка | Может быть платным, нагрузка на сайт |
| Код на хуках (пример выше) | Своя генерация и вложение через фильтр | Полный контроль, кастомизация | Нужно писать и отлаживать самому |
| Внешние сервисы | Генерация PDF вне сайта, вложение ссылок | Снижение нагрузки на сервер | Зависимость от сторонних сервисов |