WooCommerce: как успешно настроить генерацию PDF-фактур без плагинов

Диагностика задачи: почему нужна своя генерация 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
Нагрузка на сайтМожет быть высокойОптимизировано под задачу
Обновления и поддержкаОбновляются разработчикамиТребует поддержки разработчика
БезопасностьЗависит от качества плагинаКонтролируется вручную
Скорость внедренияБыстрая установкаТребует времени на разработку
Оптимизация загрузки и отображения библиотек JS и CSS в WordPress
25.12.2025
Оптимизация загрузки пользовательских файлов в WordPress
07.02.2026
Создать конструктор форм в WordPress с помощью PremiumWP
06.11.2025
Двойная авторизация в WordPress: настройка двухфакторной аутентификации с плагином PHTMLMFA
11.02.2026
Как создать автоматический импорт пользовательского контента в WordPress
05.04.2026