Диагностика задачи: почему нужна своя генерация PDF-фактур
Во многих интернет-магазинах на WooCommerce стандартных email-сообщений с заказами недостаточно для бухгалтерии и клиентов. Часто требуется формальный документ — PDF-фактура с реквизитами, таблицей товаров и итогами. Плагины иногда создают лишнюю нагрузку, а кастомные решения позволяют гибко управлять дизайном и содержимым. В этом руководстве покажу, как реализовать генерацию PDF-фактур на базе PHP-библиотеки TCPDF без сторонних плагинов.
Что нужно подготовить и проверить перед началом
- Убедитесь, что на сервере установлен PHP с поддержкой
mbstringиgd(для изображений). - Скачайте и распакуйте библиотеку TCPDF в папку
/wp-content/plugins/woocommerce-pdf-invoices/tcpdf/или в любое удобное место. - Проверьте, что тема или плагины не конфликтуют с выводом PDF (например, через буферизацию вывода).
Пошаговое решение: интеграция TCPDF для генерации PDF-фактур
1. Подключаем библиотеку TCPDF
if ( ! class_exists('TCPDF') ) {
require_once WP_CONTENT_DIR . '/plugins/woocommerce-pdf-invoices/tcpdf/tcpdf.php';
}2. Создаем функцию генерации PDF-фактуры
function premiumwp_generate_pdf_invoice( $order_id ) {
if ( ! class_exists('TCPDF') ) return;
$order = wc_get_order( $order_id );
if ( ! $order ) return;
$pdf = new TCPDF();
$pdf->SetCreator(PDF_CREATOR);
$pdf->SetAuthor('Мой магазин');
$pdf->SetTitle('Фактура №' . $order->get_order_number());
$pdf->SetMargins(15, 27, 15);
$pdf->AddPage();
// Заголовок
$pdf->SetFont('dejavusans', 'B', 16);
$pdf->Cell(0, 15, 'Фактура №' . $order->get_order_number(), 0, 1, 'C');
// Информация о заказе
$pdf->SetFont('dejavusans', '', 12);
$html = '<b>Дата заказа:</b> ' . $order->get_date_created()->date('d.m.Y') . '<br>';
$html .= '<b>Покупатель:</b> ' . $order->get_billing_first_name() . ' ' . $order->get_billing_last_name() . '<br>';
$html .= '<b>Адрес:</b> ' . $order->get_billing_address_1() . ', ' . $order->get_billing_city() . '<br><br>';
// Таблица товаров
$html .= '<table border="1" cellpadding="4">
<thead>
<tr>
<th>Товар</th><th>Количество</th><th>Цена</th><th>Итого</th>
</tr>
</thead>
<tbody>';
foreach( $order->get_items() as $item ) {
$product_name = $item->get_name();
$qty = $item->get_quantity();
$price = wc_price( $item->get_total() / $qty );
$total = wc_price( $item->get_total() );
$html .= "<tr><td>{$product_name}</td><td>{$qty}</td><td>{$price}</td><td>{$total}</td></tr>";
}
$html .= '</tbody></table><br>';
// Итог
$html .= '<b>Всего к оплате:</b> ' . wc_price( $order->get_total() ) . '<br>';
$pdf->writeHTML( $html, true, false, true, false, '');
// Вывод PDF в браузер
$pdf->Output('Invoice-' . $order->get_order_number() . '.pdf', 'I');
exit;
}3. Добавляем кнопку скачивания PDF в админке WooCommerce
add_action( 'woocommerce_admin_order_actions_end', function( $order ) {
$order_id = $order->get_id();
$url = add_query_arg( [
'download_pdf_invoice' => '1',
'order_id' => $order_id
], admin_url('edit.php?post_type=shop_order') );
echo ' <a class="button tips" href="' . esc_url($url) . '" target="_blank" data-tip="Скачать PDF-фактуру">PDF</a>';
});
add_action( 'admin_init', function() {
if ( ! empty($_GET['download_pdf_invoice']) && ! empty($_GET['order_id']) ) {
$order_id = intval($_GET['order_id']);
premiumwp_generate_pdf_invoice( $order_id );
}
});Проверка результата после внедрения
- В админке WooCommerce в списке заказов должна появиться кнопка PDF рядом с каждым заказом.
- При клике на кнопку должен открываться PDF-файл с фактурой, содержащий корректные данные заказа.
- Проверьте, что PDF открывается без ошибок и отображается таблица товаров с ценами.
- Если браузер предлагает сохранить файл — это нормальное поведение.
Частые ошибки и как их исправить
- Белый экран или ошибка 500 при генерации PDF — проверьте наличие и правильность подключения библиотеки TCPDF, а также включены ли необходимые модули PHP (
mbstring,gd). - Проблемы с кодировкой текста в PDF — используйте шрифт с поддержкой UTF-8, например
dejavusans, и убедитесь, что текст передается в UTF-8. - Конфликты с буферизацией вывода — вызов
exit;после вывода PDF обязателен, чтобы избежать добавления лишнего контента. - Отсутствие кнопки PDF в админке — проверьте правильность хуков и URL параметров, а также права пользователя.
Практические советы по безопасности и производительности
- Генерируйте PDF только для авторизованных пользователей с правами просматривать заказы.
- Кешируйте сгенерированные PDF-файлы на сервере, если заказы не меняются, чтобы не создавать нагрузку при каждом запросе.
- Ограничивайте размер и сложность PDF, чтобы избежать проблем с памятью и временем выполнения.
- Используйте HTTPS для безопасной передачи PDF-файлов клиентам и администраторам.
Сравнительная таблица: плагины vs кастомный код для PDF-фактур WooCommerce
| Критерий | Плагины | Кастомный код (TCPDF) |
|---|---|---|
| Гибкость дизайна | Ограничена настройками | Полный контроль через PHP и HTML |
| Нагрузка на сайт | Может быть высокой | Оптимизировано под задачу |
| Обновления и поддержка | Обновляются разработчиками | Требует поддержки разработчика |
| Безопасность | Зависит от качества плагина | Контролируется вручную |
| Скорость внедрения | Быстрая установка | Требует времени на разработку |