Диагностика проблемы: почему вложения не приходят с email WooCommerce
Часто возникает задача прикрепить к уведомлениям WooCommerce PDF-счета, договоры или иные файлы. Несмотря на использование стандартных хуков, вложения не приходят или приходят не ко всем письмам. Причины обычно связаны с неправильным использованием фильтров, отсутствием проверки условий, либо ошибками в путях к файлам.
Для начала нужно убедиться, что ваш код срабатывает и что файлы доступны для чтения сервером. Важно понимать, что WooCommerce использует фильтр woocommerce_email_attachments для добавления вложений к письмам.
Пошаговое решение: как правильно добавить вложения к email WooCommerce
1. Подключение вложений через хук woocommerce_email_attachments
В functions.php вашей темы или в кастомном плагине добавьте следующий код:
add_filter('woocommerce_email_attachments', 'add_attachment_to_woocommerce_emails', 10, 3);
function add_attachment_to_woocommerce_emails($attachments, $email_id, $order) {
// Список email, к которым нужно добавить вложение
$target_emails = array(
'customer_completed_order',
'new_order'
);
if (in_array($email_id, $target_emails)) {
$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;
}Объяснение:
$email_id— идентификатор email-уведомления (например,customer_completed_order— заказ завершен,new_order— новый заказ).- Формируем путь к PDF-файлу в папке загрузок WordPress.
- Проверяем, что файл существует, прежде чем добавить его в массив вложений.
2. Автоматическая генерация PDF-счета (пример с использованием TCPDF)
Если у вас еще нет PDF, можно сгенерировать его программно при смене статуса заказа:
add_action('woocommerce_order_status_completed', 'generate_invoice_pdf_on_order_completed');
function generate_invoice_pdf_on_order_completed($order_id) {
if (!$order_id) return;
$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->get_order_number() . '.pdf';
if (file_exists($file_path)) {
return; // Уже сгенерирован
}
// Подключаем TCPDF (установите библиотеку через composer или вручную)
if (!class_exists('TCPDF')) {
require_once WP_CONTENT_DIR . '/libs/tcpdf/tcpdf.php';
}
$pdf = new TCPDF();
$pdf->AddPage();
$pdf->SetFont('helvetica', '', 12);
$content = 'Invoice for order #' . $order->get_order_number() . "\n";
$content .= 'Customer: ' . $order->get_billing_first_name() . ' ' . $order->get_billing_last_name() . "\n";
$content .= 'Total: ' . $order->get_formatted_order_total() . "\n";
$pdf->Write(0, $content);
$pdf->Output($file_path, 'F');
}Проверка результата после внедрения
1. Сделайте тестовый заказ в WooCommerce и переведите его в статус «Завершен» (если добавляете вложение к этому уведомлению).
2. Проверьте, что в папке wp-content/uploads/invoices/ появился PDF-файл с номером заказа.
3. Убедитесь, что email-уведомление содержит вложение PDF. Для этого можно отправить тестовое письмо через стандартный функционал WooCommerce или использовать плагин WP Mail Logging для просмотра отправленных писем.
Частые ошибки и как их исправить
- Файл не прикрепляется к письму: проверьте, что путь к файлу правильный и файл существует на сервере.
- Ошибка прав доступа: убедитесь, что веб-сервер имеет права на чтение папки и файла вложения.
- Письмо отправляется без вложения: возможно, неверно указан
$email_idв условии. Используйте отладку, например, добавьтеerror_log($email_id);внутри фильтра, чтобы узнать точный ID. - PDF не генерируется: проверьте, что библиотека TCPDF подключена корректно, и что папка для сохранения существует и доступна для записи.
Практические советы по безопасности и производительности
- Не храните PDF-файлы в общедоступных папках без защиты: если документы конфиденциальные, настройте доступ через .htaccess или используйте приватные хранилища.
- Генерируйте PDF один раз: избегайте генерации PDF при каждом отправлении письма — это нагрузит сервер. Лучше создавать файл при смене статуса заказа.
- Кэширование: если в письмах часто используются одни и те же вложения, рассмотрите использование кэширования с условием обновления при изменении заказа.
- Логи для отладки: используйте плагин WP Mail Logging https://wpshop.ru/plugins/clearfy?utm_source=wpmail.ru&utm_medium=article&utm_campaign=kak-dobavit-vlozheniya-k-email-uvedomleniyam-woocommerce для отслеживания отправленных писем и вложений.
Сравнение способов добавления вложений к email WooCommerce
| Способ | Описание | Плюсы | Минусы |
|---|---|---|---|
Использование woocommerce_email_attachments | Фильтр для добавления файлов к письмам | Гибкость, работает со всеми email | Нужно самостоятельно контролировать условия и пути |
| Плагин для PDF счетов (например, WooCommerce PDF Invoices & Packing Slips) | Генерация и добавление счетов без кода | Простота установки, множество функций | Может грузить систему, ограничение кастомизации |
| Использование webhook + внешняя генерация PDF | Генерация PDF на отдельном сервисе | Не нагружает сервер, масштабируемость | Сложность настройки, зависит от сторонних сервисов |