Диагностика задачи: зачем нужна автоматизация накладных
В интернет-магазинах на WooCommerce часто возникает необходимость автоматически формировать накладные (товарные чеки) и отправлять их клиентам после оформления заказа. Это экономит время, исключает ошибки ручного оформления и повышает уровень сервиса. Ручное создание накладных неудобно при большом потоке заказов и требует дополнительных плагинов или кастомного кода.
Как автоматически создавать PDF накладную в WooCommerce
Для автоматического создания PDF накладной можно использовать библиотеку FPDF или TCPDF. В примере ниже покажу, как сгенерировать простую PDF накладную на основе данных заказа.
Пример кода генерации накладной
add_action('woocommerce_order_status_completed', 'generate_and_send_invoice_pdf', 10, 1);
function generate_and_send_invoice_pdf($order_id) {
if (!$order_id) return;
$order = wc_get_order($order_id);
if (!$order) return;
// Подключаем библиотеку FPDF
if (!class_exists('FPDF')) {
require_once __DIR__ . '/lib/fpdf/fpdf.php'; // путь к FPDF
}
$pdf = new FPDF();
$pdf->AddPage();
$pdf->SetFont('Arial', 'B', 16);
$pdf->Cell(40, 10, 'Накладная к заказу #' . $order->get_order_number());
$pdf->Ln(20);
$pdf->SetFont('Arial', '', 12);
$pdf->Cell(0, 10, 'Клиент: ' . $order->get_billing_first_name() . ' ' . $order->get_billing_last_name());
$pdf->Ln(10);
$pdf->Cell(0, 10, 'Телефон: ' . $order->get_billing_phone());
$pdf->Ln(15);
$pdf->Cell(80, 10, 'Товар', 1);
$pdf->Cell(30, 10, 'Количество', 1);
$pdf->Cell(40, 10, 'Цена', 1);
$pdf->Ln();
foreach ($order->get_items() as $item) {
$name = $item->get_name();
$qty = $item->get_quantity();
$total = wc_price($item->get_total());
$pdf->Cell(80, 10, $name, 1);
$pdf->Cell(30, 10, $qty, 1);
$pdf->Cell(40, 10, $total, 1);
$pdf->Ln();
}
$pdf->Ln(10);
$pdf->Cell(0, 10, 'Итого: ' . $order->get_formatted_order_total());
// Сохраняем PDF во временную папку
$upload_dir = wp_upload_dir();
$file_path = $upload_dir['basedir'] . '/invoices/invoice-' . $order_id . '.pdf';
if (!file_exists(dirname($file_path))) {
wp_mkdir_p(dirname($file_path));
}
$pdf->Output('F', $file_path);
// Отправка накладной по email
send_invoice_email_with_attachment($order, $file_path);
}
function send_invoice_email_with_attachment($order, $file_path) {
$mailer = WC()->mailer();
$recipient = $order->get_billing_email();
$subject = 'Ваша накладная к заказу #' . $order->get_order_number();
$message = 'Здравствуйте! В приложении вы найдете накладную по вашему заказу.';
// Создаем email
$email = $mailer->emails['WC_Email_Customer_Completed_Order'];
$headers = array('Content-Type: text/html; charset=UTF-8');
// Используем wp_mail с вложением
wp_mail($recipient, $subject, $message, $headers, array($file_path));
}Пошаговое решение
- Скачайте и подключите библиотеку FPDF в папку вашего плагина или темы (https://www.fpdf.org/).
- Добавьте код из примера в functions.php вашей темы или в кастомный плагин.
- Убедитесь, что директория
wp-content/uploads/invoicesдоступна для записи. - При смене статуса заказа на "завершен" автоматически создается PDF с накладной и отправляется на email клиента.
Как проверить, что всё работает
- Создайте тестовый заказ в WooCommerce и переведите его в статус "Завершен".
- Проверьте папку
wp-content/uploads/invoices— должен появиться PDF файл с именемinvoice-{order_id}.pdf. - Проверьте почту клиента — должен прийти email с вложенной накладной.
- Откройте PDF и убедитесь, что данные заказа корректны.
Частые ошибки и их исправление
- FPDF не подключена или путь указан неверно — ошибка загрузки класса. Проверьте путь в
require_onceи наличие библиотеки. - Папка для накладных недоступна для записи — PDF не сохраняется. Создайте папку вручную или используйте
wp_mkdir_p. - Email не отправляется — проверьте настройки почты WordPress, используйте SMTP-плагин для надежной доставки.
- Некорректное отображение символов в PDF — используйте UTF-8 и шрифты, поддерживающие кириллицу (в FPDF нужно подключать специальные шрифты).
Практические советы по безопасности и производительности
- Не храните PDF в публичных папках без защиты — можно ограничить доступ через
.htaccessили хранить во внепубличных директориях. - Для больших магазинов лучше использовать специализированные плагины с кешированием и очередями генерации PDF.
- Отправку email выполняйте асинхронно (через WP-Cron или внешние сервисы), чтобы не замедлять оформление заказа.
- Проверяйте права доступа и используйте nonce при интеграции с фронтендом.
Сравнение вариантов реализации
| Способ | Плюсы | Минусы | Пример |
|---|---|---|---|
| Кастомный код с FPDF | Полный контроль, бесплатный | Требует знаний, поддержка шрифтов | Пример в статье |
| Плагин WooCommerce PDF Invoices | Быстро, много функций | Может быть избыточным, платные расширения | Clearfy Pro (оптимизация сайта) |
| Внешние сервисы (API) | Мощные шаблоны, стабильность | Стоимость, зависимость от внешних сервисов | API-интеграции PDF генерации |