Kitgenix PDF Invoicing for WooCommerce turns WooCommerce orders into PDF documents: invoices, receipts, credit notes, pro forma invoices, packing slips, delivery notes and an order activity summary. Documents are rendered on your own server with the bundled Dompdf library – no external PDF service, account or API key.
Every figure comes from WooCommerce's own order, tax, refund and currency data. The plugin does not recalculate tax, change stored totals, or present information WooCommerce does not record (such as payment allocations or account balances) as fact.
Developed by
Kitgenix.
Document types
- Invoice – the invoice number is issued once, from its own sequence if you like, and never changes. Shows the real payment state: "Paid in Full", "Amount Due" (with an optional due date, payment terms and payment instructions), "Part Paid" when an extension reports verified part payments, or "Payment Pending" for cash on delivery orders that are not yet completed.
- Receipt – only produced once money has actually been received. Shows the amount received, payment date, method and reference, and lists later refunds without rewriting the payment.
- Credit Note – one per WooCommerce refund, each with its own number, the refund date, reason, refunded items and the tax credited per rate. A refund entered as an amount only is labelled as such; no tax split is invented for it.
- Pro Forma Invoice – its own numbering, clearly "not a tax invoice". Choose whether it is for information only or requests payment in advance (with your payment instructions).
- Packing Slip – an internal picking list: quantities still to pack after refunds, tick boxes, a "Picked" column and sign-off lines. No prices, totals or payment details, and only the contact details delivery needs.
- Delivery Note – the goods and quantities for the recipient, with an optional proof-of-delivery block. Shows a dispatch date and tracking number only when WooCommerce Shipment Tracking (or a filter) provides them.
- Order Activity Summary – the orders on a customer's account in a period, with totals, refunds and payment state. It is deliberately not a statement of account and shows no balance, because WooCommerce does not keep an account ledger. A store with a real ledger can supply it through a filter to produce a reconciled Statement of Account.
Tax details
- Tax summary per rate: taxable amount and tax for each WooCommerce tax rate, plus any amount that carried no tax.
- Seller's trading name, registered legal name, address, tax registration number and company registration number.
- Customer's VAT/tax number, read from the order meta keys common VAT-number plugins use (or one you set).
- Optional supply date / tax point, taken from the WooCommerce date you choose – never guessed.
- Optional reverse-charge note, in your own wording, on VAT-exempt orders where the customer gave a tax number.
- ISO currency codes, and reporting-currency figures when an extension supplies the exchange rate and its source.
- Terminology presets for Standard / Generic, UK VAT, EU VAT, US Sales Tax, Canada GST/HST and Australia GST, with label overrides for any other country. Under the UK, EU, Canada and Australia presets, tax figures always stay on invoices and credit notes for orders that carry tax.
- A "Document Checks" panel flags missing details that tax invoices commonly need for the selected preset.
Presets change wording and which tax details are always shown. They do not by themselves make documents meet any country's invoicing rules – that also depends on your business details, numbering and how you invoice. Check your local requirements.
Eight template families
Standard, Simple, Modern, Business, Luxury, Bold, Compact and Trade. Every family shows the same information for all seven document types, uses your logo and brand colours, and can be chosen globally or per document type. A visual designer adjusts alignment, logo size, density, panels, table style, totals emphasis and footer without editing templates. Theme overrides are supported for whole documents or single parts.
Fonts and character coverage
Documents use only the DejaVu fonts bundled with Dompdf – DejaVu Sans for text, DejaVu Serif for Luxury headings and DejaVu Sans Mono for SKUs – embedded in every PDF. They cover Latin (including Central and Eastern European languages), Greek, Cyrillic, Armenian, Georgian and most currency symbols (£ € $ ¥ ₹ ₺ ₽ ₩ ₪ ₫ ₦ ₱ ₴ ₸). See the FAQ for scripts that are not supported.
Numbering
Token-based number formats ({prefix}, {sequence}, {order_number}, {year}, {fiscal_year} and more) with padding and calendar- or fiscal-year resets. Numbers come from an atomic database sequence and are assigned under a per-order lock, so concurrent requests never produce duplicates. A number is stored on the order the first time a document is produced and kept from then on, whatever the settings say later. Formats that could repeat numbers are refused.
Secure downloads and storage
- Customers download their own invoices, receipts and credit notes from My Account. Guests can open a guest order's documents with WooCommerce's order key; the key never opens a registered customer's documents or any account-wide information.
- Packing slips, delivery notes and other customers' documents are staff-only.
- Issued documents are archived unchanged, under unguessable filenames, in a folder protected for Apache, LiteSpeed and IIS. System Status tests whether your server blocks direct access, and explains how to block it on nginx or move storage outside the web root with one constant.
- Re-issuing a document requires a reason, keeps the earlier PDF as a revision and is recorded in its history.
Also included
- Automatic attachments for WooCommerce emails, with a preview and test-send tool.
- Bulk ZIP export from the orders list.
- Order-list filter by document state.
- HPOS (High-Performance Order Storage) compatibility.
- Settings import/export and an event log.
- Developer filters and actions throughout.
- Install via Plugins → Add New (search for "Kitgenix PDF Invoicing"), or upload the plugin ZIP file.
- Activate the plugin. WooCommerce must already be installed and active – the plugin will deactivate itself with a notice if it isn't.
- Go to Kitgenix → PDF Invoicing. Enter your company details, choose the terminology preset for your country and review the Document Checks panel.
- Choose your number formats, template family and which documents to attach to which emails.
- Open any order to find the "Kitgenix PDF Invoicing" box with its document downloads.
- Recommended on nginx: open the System Status tab and follow the storage advice if it reports the archive folder as exposed.
PDFs are rendered with the bundled Dompdf library; no external service or API key is required. Batch ZIP export uses the PHP
zip extension when available, with an automatic fallback to WordPress's built-in ZIP support if it isn't.
2.2.2 (30 October 2026)
- Fix: Documents could print with the pre-2.2.0 layout under the new stylesheet – blank first pages, an oversized logo and unstyled tables – on sites updated from an earlier version. Template files from before the 2.2.0 redesign were left in the Standard, Business, Modern and Simple template folders, and the plugin used them in preference to the shared templates. Those files are removed, and the plugin now only ever uses its shared templates (or your theme's overrides), so a leftover file can no longer change your documents.
- Removed: The unused
FontManager class, left behind from the custom-font feature removed in 2.2.0.
2.2.1 (30 October 2026)
- Fix: Fixed a CSS issue not rendering correctly in 2.2.0.
2.2.0 (30 October 2026)
- Security: The Statement could reveal other people's orders. It listed every order with the same billing email address, so anyone could place a guest order using someone else's email, open its Statement with the order key from their own order confirmation, and see that person's order history, invoice numbers and totals. The account-wide document now covers only orders on the customer's own registered account (never matched by email), a guest order's covers that order alone, and an order key can no longer open it at all.
- Security: An order key no longer opens a registered customer's documents – the customer signs in – and never opens account-wide information. Guests keep access to their own order's invoice, receipt, pro forma invoice and credit notes with the key. All access is now decided in one place (
InvoicingModule::user_can_access_document()), and an unknown order and a wrong key get the same response, so order IDs cannot be probed.
- Security: The document download handler could be made to stream any file the web server can read (such as
wp-config.php) if a stored archive path in order meta was altered, which anyone with REST API access to orders can do. Stored paths are now checked to be a PDF inside the archive folder before anything is served.
- Security: Archives can be stored outside the web root by defining
KITGENIX_PDF_INVOICING_STORAGE_DIR in wp-config.php. Archive folders now also get web.config (IIS) and index.html guards, and System Status tests whether your server actually blocks direct access to them, with an nginx rule to add when it does not. Existing archives stay where they are.
- Security: Dompdf now runs with http/https removed from its allowed protocols, PDF JavaScript disabled, and local file access limited to the plugin's templates and your logo's folder (previously the whole uploads folder, including other customers' archived documents). The
kitgenix_dompdf_enable_php filter that could enable PHP execution inside documents has been removed.
- Security: An account summary is only attached to an email when the order's billing email is the customer account's own email address.
- Security: PDF downloads now send
X-Content-Type-Options: nosniff, X-Robots-Tag: noindex and Referrer-Policy: no-referrer.
- Changed: The Statement is now an Order Activity Summary. It listed orders with "Debit", "Credit", running and closing balances that WooCommerce cannot support – it records no payment allocations, credit balances or balances carried forward – so its "Closing Balance" was not an amount owed. The summary lists each order's total, refunds and payment state, with totals, and shows no balance. A store with an accounting ledger can supply it through
kitgenix_pdf_account_ledger to produce a Statement of Account, which is used only if it reconciles. It covers the last 365 days (filter: kitgenix_pdf_statement_period_days), in the order's currency only, in batches rather than one unbounded query, and is produced fresh each time rather than archived.
- Fix: Receipts could be issued for orders that had not been paid, showing an amount received of zero. A receipt is now only produced once a payment is recorded, and the order screen says why one is unavailable.
- Fix: Cash on delivery orders were treated as paid as soon as they reached "processing", before any money was collected, so invoices said "Paid in Full". They now show "Payment Pending" until the order is completed (filter:
kitgenix_pdf_deferred_payment_methods).
- New: Part payments. A deposits or part-payment extension can supply verified payments (
kitgenix_pdf_payment_records); invoices show the amount paid and due, and receipts the amount received with each payment's date, method and reference. No balance is printed when an order has both part payments and refunds, because WooCommerce does not record whether a refund returned money or reduced the balance.
- New: Tax summary on invoices, receipts, pro forma invoices and credit notes: the taxable amount and tax for each WooCommerce tax rate, plus any amount that carried no tax. Line tax now shows its rate. Under the UK VAT, EU VAT, Canada GST/HST and Australia GST presets, tax figures stay on invoices and credit notes for orders that carry tax even when "Show tax totals" is off.
- New: Seller's registered legal name and company registration number; the customer's VAT/tax number from common VAT-plugin order meta keys (or one you set); an optional supply date / tax point from the WooCommerce date you choose; an optional reverse-charge note in your own wording; reporting-currency figures when an extension supplies the rate and its source (
kitgenix_pdf_reporting_currency).
- New: Payment terms for invoices: a due date a set number of days after the invoice date, payment terms text and payment instructions, shown only on invoices with an amount due.
- New: Document Checks on the settings screen flag details that tax invoices commonly need for the selected preset, such as a missing address or tax registration number. They are a guide, not legal advice.
- Changed: The "Standard" preset is now generic ("Tax", "Tax ID") instead of assuming VAT, and new installs start with the preset for the store's country. Existing stores keep their documents' wording: a UK or EU store on Standard moves to the UK or EU VAT preset, and any other store keeps "VAT" through the label overrides. The EU VAT preset labels the seller's number "VAT ID", and US Sales Tax "Sales Tax Permit".
- Fix: The Australia GST preset titled pro forma invoices "Pro Forma Tax Invoice", implying a provisional document was a tax invoice. It is now "Pro Forma Invoice".
- Changed: Pro forma invoices have their own stored number (prefix
PF-, own format) and issue date, and say plainly what they are for: by default for information, not requesting payment and without payment instructions; or, with "Pro forma purpose" set to request payment in advance, the amount payable and your payment instructions. They no longer call the order total an "Estimated Total". Delivery notes also have their own stored number (DN-). Numbers and dates of pro forma invoices and delivery notes already archived are kept.
- New: Each credit note can be opened on its own – from the order screen, My Account and bulk export – and WooCommerce's refund email attaches the credit note for that refund. Credit notes for refunds made at the same time are numbered in the order the refunds were made.
- Fix: A refund entered as an amount only is now labelled "Refund (amount only)" with a note that no tax breakdown exists, instead of an unlabelled line. A credit note only says the money was returned when WooCommerce refunded it through the payment gateway.
- Changed: Packing slips show the quantity still to pack after refunded units ("2 ordered, 1 refunded"), add a write-in "Picked" column, count items net of refunds and leave out the billing address and email and the general document notes. Delivery notes say their quantities are those on the order, and show a dispatch date and tracking number only when WooCommerce Shipment Tracking (or
kitgenix_pdf_shipment_info) provides them.
- Changed: Re-issuing (regenerating) a document now requires a reason, which is recorded in its history, and voiding accepts one. The earlier PDF is always kept; if it cannot be copied, nothing is overwritten.
- Fix: Concurrent requests could issue a document twice with different numbers (for example a customer opening an invoice while an email attached it). Numbers are now assigned under a per-order database lock; the fallback counter used when the sequence table cannot be created is locked too.
- Fix: A number format that cannot give each document a unique number (such as
{prefix}{year}), or a yearly sequence reset with a format that has no year in it, could issue duplicate numbers. Both are now refused with an explanation.
- Fix: Saving the Brand & Styling or Email Attachments tab turned off every "Show …" option on the Settings tab and cleared the per-document template choices. Each tab now saves only its own fields. Unticking every email attachment can now be saved.
- Fix: The Document Generation Rules were never shown in settings. They are now on the Settings tab.
- Fix: Importing settings flattened the per-document template choices and removed line breaks from the company address and footer.
- Removed: Custom PDF font uploads. Documents use the DejaVu fonts bundled with Dompdf: DejaVu Sans for text, DejaVu Serif for Luxury headings and DejaVu Sans Mono for SKUs, each falling back to DejaVu Sans for any character it lacks. A saved font choice is ignored and its setting removed on upgrade. Uploaded font files are not deleted automatically; System Status offers to delete them. Archived PDFs are unaffected.
- Fix: Templates named the PDF core fonts Helvetica and Times first. Those are not embedded and cover Windows-1252 only, so names mixed two typefaces and characters such as ₿ or CJK printed as "?" in the text. Every font is now a DejaVu face embedded in the PDF.
- Removed: The settings screens no longer load the Manrope and Inter web fonts from Google Fonts; they use WordPress's system font stack, so the admin makes no request to an external font service.
- Build:
bin/build-release.sh builds the WordPress.org ZIP from a clean copy: it bundles the prefixed Dompdf runtime with every package's licence file and the DejaVu font licence, pre-builds Dompdf's font metric cache (so a read-only plugin folder is fine), leaves out development files listed in .distignore, then verifies and lints the result.
- Dev: Integration tests in
tests/ (run against a disposable WordPress + WooCommerce site): payment states, receipts, invoices, tax breakdowns, credit notes, pro forma invoices, fulfilment documents, the activity summary, email attachments, access control, path safety, numbering and concurrency, settings and migrations, PDF checks of all 56 template combinations, and HTTP checks of the download handler.
- New: Four new template families: Trade, Compact, Bold and Luxury, joining Standard, Simple, Modern and Business. Trade (industrial charcoal with a safety-amber accent, a monospaced SKU column and emphasised quantities) and Compact (narrow margins, smaller type and tight striped rows, also with a SKU column) are built for wholesale and trade orders. Bold sets the title and headline amount in a solid dark panel with an accent bar across every page. Luxury has a centred serif letterhead, letter-spaced small capitals and gold hairlines on an ivory page.
- Improved: Redesigned every template. All eight families now render the same shared markup (
templates/shared/), so a document shows the same information and fires the same hooks whichever family is selected, and a family is a stylesheet layered on a shared base (templates/shared/base.css). Previously each family had its own copy of every document (64 files) that had drifted apart: different labels, missing features, dozens of near-duplicate translatable strings, and Simple, Modern and Business ignored the visual designer settings entirely.
- Improved: Every document follows the structure accounting packages such as Xero, Stripe and Amazon use: a letterhead (your logo and the document title); the parties – Bill To, Ship To and your own details ("From") with address, contact details, tax and company registration numbers; a key-facts strip led by the headline amount (amount due, invoice number, invoice date, due date, order number, payment and shipping method); the line items, with a VAT/tax rate column whenever tax is shown; and the summary, with the tax summary and "How to Pay" beside the totals. A typical order fits on one page in every family except Luxury, whose wider spacing can run onto a second page.
- Fix: The footer text was cut off after two lines and could run off the page. The footer now grows with its text: the PDF is measured as it is laid out and, when the footer needs more room, rendered again with a taller footer and a matching bottom margin, so the whole footer prints on every page and content never runs underneath it.
- Fix: Brand & Styling and Visual Template Designer settings did not reliably reach every template. The designer options were CSS added after the template that some families' own rules outranked, so options such as table style or totals emphasis did nothing in those families, and some families never used the accent colour. Options are now applied as document classes styled to outrank every family, every family uses every colour setting, and automated tests check that each colour and each designer option visibly changes all eight families.
- New: "Table header text color" setting. Left empty, header text is black or white, whichever reads on the header background.
- Fix: Line spacing was about a quarter looser than intended (Dompdf spaces lines by the font's own height, which is taller than a browser's), wasting space and pushing totals onto a second page.
- Improved: Long document titles ("Pro Forma Invoice", "Order Activity Summary") are set smaller beside the logo so they stay on one line.
- Dev: Template stylesheets use short
--kgx-* colour variables; the --kitgenix-pdf-invoicing-for-woocommerce-* variables are still set for custom stylesheets. Designer options add kgx-{option}-{value} classes to <body> (Template_Families::get_body_classes()), and template families have two new layout flags, seller and facts_per_row.
- Improved: Brand colours are applied with restraint. The primary colour now marks only the document title, the headline total and structural bars; item names, the company name, reference numbers and labels stay in the neutral text colour, so a saturated brand colour no longer turns the whole page that colour.
- Improved: Each document has one headline figure ("Amount Due" on an unpaid invoice, the total on a paid one, "Amount Received", "Total Credited"); supporting totals are shown plainly instead of competing with it.
- Improved: Filled table-header bars and headline totals are painted as one block, removing the hairline seams PDF viewers showed between columns.
- Improved: "Header alignment" is now a layout rather than text alignment: Left puts the logo on the left and the title on the right, Right swaps them, and Centered stacks a centred letterhead with your details beneath the logo.
- Improved: A SKU column is only shown when at least one item has a SKU, "Ship To" is only shown when it differs from "Bill To", and "Excl./Incl. VAT" labels are only shown when the order carries tax.
- Improved: A footer background colour forms a band across the full page width; the footer text follows the "Footer alignment" setting.
- Fix: Invoices lost their Subtotal and Total rows when "Show tax totals" was turned off: rows were matched as tax rows after "(Excl. VAT)" had been appended to their labels.
- Fix: The order total was labelled "Total (Excl. VAT)" although it includes VAT. It now reads "Total (Incl. VAT)" when the order carries tax, and "Total" otherwise.
- Fix: Table-header and footer text could be unreadable when only the background colour was set (for example dark text on a navy header). Without a saved text colour, the text is now black or white, whichever reads on the background.
- Fix: The colour pickers' "Default" button restored the saved colour, so a colour could not be returned to the template's own. It is now a "Clear" button, and the settings screen explains that a cleared colour uses the selected template's colour.
- New: Every document type has its own layout. Invoices end on the real payment state ("Amount Due", or "Paid in Full") with a Paid / Unpaid / Part Paid badge. Receipts highlight "Amount Received" (never the order total) with a "Remaining Balance" row for part payments. Credit notes show the refund reason and the original invoice's number and date. Pro forma invoices carry a not-a-tax-invoice notice. Packing slips have a tick box per line and Picked By / Packed By lines. Delivery notes lead with the delivery address and end with a proof-of-delivery signature block. The account-wide document lists the customer's orders (see the Order Activity Summary entry above).
- New: "Page X of Y" in the footer of any document longer than one page (filter:
kitgenix_pdf_show_page_numbers).
- New: A theme can override a single template partial (header, addresses, line items, totals, footer, signatures) at
kitgenix-pdf-invoicing-for-woocommerce/{family}/partials/{name}.php without copying a whole document template.
- New: Filters
kitgenix_pdf_document_meta_rows (the key facts) and kitgenix_pdf_packing_slip_show_signoff.
- New: Each visual designer option has a new "Template default" choice, now the default, so a family keeps its own design unless an option is deliberately changed. Sites still on the previous defaults are moved to "Template default" automatically; an option that was changed is kept.
- Improved: Text stays legible whatever brand colours are chosen: text on accent and primary fills is set in black or white for contrast, and an accent too pale to read as text (such as yellow) is replaced by the primary colour wherever it would colour text.
- Changed: The Business family no longer prints an "Authorised Signature" line on invoices.
- Fix: The footer appeared only on the last page of multi-page documents. Dompdf repeats a fixed element on every page only when it is a direct child of
<body>, and every template placed it inside the document wrapper.
- Fix: Page margins were ignored. Every stylesheet set
html { margin: 0 }, which Dompdf applies in place of the @page margins, so documents relied on body padding that does not repeat per page and content could run under the footer from page two onwards.
- Fix: Packing slips and delivery notes in the Simple, Modern and Business families failed to generate at all ("Parent table not found for table cell").
- Fix: Bold, Compact, Modern and Trade printed "?" in place of currency symbols such as ₹ ₺ ₽ ₩ and of non-Western-European letters, for example in Polish, Greek or Cyrillic names and addresses. Their font stacks named fonts Dompdf does not bundle (Inter, Manrope, Arial) and resolved to Helvetica, which only covers Windows-1252. Every family now uses the bundled DejaVu fonts (see above), and Dompdf's own default font is now DejaVu Sans instead of Times. Bold also rendered product names in Times.
- Fix: The colour settings injected a second stylesheet after every template that forced full grid borders onto every table, overriding each family's own design. Colours are now applied only through CSS variables.
- Fix: The visual designer's defaults (including a fixed 12px text size and cell padding) were applied on top of every family even when never changed, flattening their differences.
- Fix: Labels were split mid-word ("TRANSAC TION ID") because
overflow-wrap: anywhere lets Dompdf shrink a column to a single character. Templates now use break-word, which only breaks a word that cannot fit.
- Fix: Line amounts now show the pre-discount line subtotal, matching WooCommerce's own order tables. They showed the post-discount amount while the "Subtotal" row beneath was pre-discount, so with a coupon the lines did not add up to the subtotal and the discount appeared to be applied twice.
- Fix: A credit note now documents only the refund its number was issued for. It listed every refund on the order, so an order's second credit note re-credited the first refund's lines and amount. Its number and date also come from that same refund, even after a later refund is deleted.
- Fix: Custom document CSS (
kitgenix_pdf_document_custom_css, which also carries the visual designer CSS) was HTML-escaped inside <style>, which corrupted quoted strings and > selectors. Tags are now stripped and <!-- neutralised instead. Stylesheets containing $ or backslashes are no longer altered when inlined.
- Fix: A theme template override without its own
html-document-wrapper.php was rendered with no stylesheet; it now uses the shared wrapper.
- Improved: Packing slips and delivery notes never show the payment method or transaction ID, and a pro forma never shows a transaction ID. WooCommerce's "Payment method" row is no longer repeated in the totals, total labels lose their trailing colon ("Subtotal (Excl. VAT)" rather than "Subtotal: (Excl. VAT)"), and statements show only the general document notes rather than one order's customer note.
- Dev: Removed CSS that Dompdf does not support and silently ignored: flexbox (inside
@supports blocks, which Dompdf discards), box-sizing and print-color-adjust.
- Dev: Removed the per-family document files (
templates/{family}/*.php). A family folder now holds only its stylesheet. Theme overrides are resolved as before.
- Security: When generating a PDF, an image is now only loaded from disk if it is an image file inside the uploads folder and not inside a server-protected folder such as
woocommerce_uploads. Previously every uploads URL in the document HTML was converted to a local file path, so an image reference that reached an order's content could embed a private file from the uploads folder into a customer's document.
- Security: Archived PDFs are now stored under an unguessable filename (a random suffix is added, e.g.
invoice-inv_0001-<random-->.pdf). Archives were stored at a predictable path built from the order ID and document number, so on servers that ignore the archive folder's .htaccess rules, such as nginx, anyone could download customers' invoices, receipts and credit notes directly by guessing the URL, bypassing the order-key, nonce and capability checks.
- Security: Documents archived by earlier versions, including superseded
.revN copies, are renamed the same way automatically: in small batches while an administrator uses wp-admin, and immediately whenever a document is opened, emailed or regenerated. A file that cannot be renamed is left in place and recorded in the Event Log.
- Fix: Regenerating a document now overwrites the archived file the order actually points to, rather than recomputing its filename.
- Security: Dompdf and its own dependencies are now bundled with their class and namespace names prefixed (
Kitgenix\PDF_Invoicing\Vendor\…), built with Strauss. Previously Dompdf shipped under its own unprefixed Dompdf\ namespace, which is also how several competing invoicing plugins bundle it; running two such plugins on the same site risked a fatal "cannot redeclare class" error. The release build (bin/build-release.sh) always produces this prefixed copy, and a new Site Health test ("Kitgenix PDF Invoicing PDF engine") flags a build that is missing it instead of letting document generation fail with an unclear error.
- Fix: Fixed a fatal error on every PDF ("Class ... FontLib... not found") introduced by the Dompdf namespace prefixing above. Dompdf's embedded font library (
php-font-lib) builds two of its own class names as plain strings at runtime instead of through use statements, and derives a font's type from a hardcoded position in its own class name - none of which a namespace-prefixing tool can see and rewrite automatically. The release build now corrects both after Strauss runs (bin/fix-dompdf-font-lib-namespaces.php), verified by actually loading a TrueType font and rendering a PDF that embeds it.
- Hardening: The logo preview on the settings screen is now built with DOM methods instead of joining HTML strings.
- Improved: Raised the minimum PHP version to 8.2 (
Requires PHP: 8.2). composer.json now also requires PHP 8.2.
- Improved: Tested with WordPress 7.1.4 and WooCommerce 11.2.1 (HPOS and legacy order storage), and reviewed for compatibility with PHP 8.2 to 8.5. The full codebase passes syntax checks on PHP 8.5 and a PHPCompatibility scan for PHP 8.2–8.5, and uses no dynamic properties or functions deprecated in PHP 8.2–8.5.
- Improved: Declared compatibility with the WooCommerce Cart and Checkout blocks (
cart_checkout_blocks), so WooCommerce no longer lists the plugin as possibly incompatible in the Checkout block editor.
- Dev: Removed the PluginScore verification code from the readme, as Kitgenix Plugin Score has been discontinued.
- Dev: Bumped the version to 2.2.0 across the plugin.
- Documentation: Regenerated the
.pot translation template for 2.2.0.
- Documentation: The readme changelog now lists only the current release. The full release history is in
CHANGELOG.md.
Full release history is available in the plugin's
CHANGELOG.md file.