Wróć do Polski PROv1.28.3 (53 wydań)

Historia zmian Polski PRO

Historia zmian dostępnej wtyczki Polski PRO: aktualizacje, poprawki i rozwój funkcji dla WooCommerce.

v1.28.3
  • Fixed: abandoned cart tracking wrote a row for every front-end visitor, including a plain anonymous request with nothing in the cart. A cart is now recorded only once it holds items, and the checkout email is stored only against a cart with items.
v1.28.2
  • Fixed: abandoned cart recovery never ran. The job that marks carts abandoned and sends the three recovery emails was scheduled on an every-15-minutes interval that was only registered after the scheduling call, so WordPress rejected it and the event never existed. The interval is now registered first, and the job runs every 15 minutes.
  • Fixed: invoice PDF downloads (My Account, admin, and the email link), the invoice ZIP, UBL and JPK_FA XML, the tax rules export, the withdrawal audit CSV and the cached product feeds now discard anything another plugin or theme left in the output buffer before sending the file, so a stray notice or blank line can no longer corrupt or truncate it.
v1.28.1
  • Fixed: an install without its vendor directory killed the site with a fatal error instead of showing the admin notice written for exactly that case. There were three separate guards against it, on load, on activation and on boot, and none of them stopped the line that followed, so each one fataled in turn. They are replaced by a single check that runs before anything is required or registered.
v1.28.0
  • Fixed: a quote request sent no email to anyone. The module has carried a recipient address, an admin subject line, a customer subject line and a customer-confirmation switch since its first release, and nothing ever read them: every request landed in the Quote requests list and the shop was told nothing, so a lead sat there until somebody happened to open the screen. The shop is now notified with the customer's address as Reply-To, and the customer gets the confirmation when that switch is on.
  • Fixed: the "run daily" switch on the tax rules engine did nothing. The daily sweep, which walks the whole catalogue in batches, was scheduled and run on every shop whatever the setting said.
  • Fixed: the tax rules log kept 10 000 rows whatever "log retention" was set to. The trim call ignored the setting and used the hardcoded constant.
  • Removed: two settings that duplicated a working one and were never read, "renewal_notice" (the subscription box prints the cycle format) and "reminder_days" (the reminders use the first and second reminder days).
v1.27.8
  • Fixed: this plugin registered its own `billing_nip` checkout field on the same filter and priority as the FREE "NIP - Verification and Autocomplete" module, so it silently overwrote it. The field lost the attribute the GUS autocomplete binds to, and it appeared on checkout even with that module switched off. The checkout field, its validation and its save now belong to the FREE module alone; PRO keeps only the editable NIP row on the admin order screen, and only while the module is on.
v1.27.7
  • Fixed: on multisite the birthday points cron awarded points to the customers of every site on the network. One users table is shared by the whole network, and the query 1.27.6 introduced matched the stored birthday alone; the get_users() call it replaced was scoped to the current site by WordPress itself. That scoping is back, as a join on this site's capabilities meta, the batching is unchanged, and a test fails if it is removed again.
  • Changed: two things 1.27.6 claimed about building a feed were wrong, and are now stated without a number rather than with another estimate. The query count it quoted for a 20 000 product catalogue counted the catalogue walk only; every product that reaches a feed also costs a category lookup, which the caches WooCommerce primes for the batch do not answer, so the real cost is far higher. And "one batch of products at a time" was true of the product objects only: the post and meta caches primed for each batch are never flushed during the run, so peak memory still grows with the catalogue.
  • Changed: the Inventory Forecast screen now says what it costs. It walks the whole catalogue while drawing an admin page and runs a sales query for every stocked product it finds, each kept in its own hour-long transient; the table itself is kept for an hour too, and the first render after that hour pays for the walk again. 1.27.6 argued that a catalogue walk belongs on cron, put one on a page render, and said nothing about it.
v1.27.6
  • Fixed: the price-comparison feeds paged the catalogue by offset. A shop stays open while a feed is built, so a product selling out mid-run (with "exclude out of stock products" on, which is the default) pulled every later page one row along and left a product out of the feed altogether, while a product published mid-run could be listed twice. The catalogue is now walked with a cursor on the product id, which only moves forward. The Inventory Forecast screen read the catalogue the same way and was changed with it.
  • Fixed: the birthday points cron loaded every customer who had a birthday stored, as full user objects, then compared the dates in PHP. The database now returns only the ids of the customers whose birthday is today, 200 ids per query.
  • Changed: a feed URL no longer builds a feed. It serves the cached file whatever its age and asks WP-Cron for a rebuild in the background; before the first build exists it answers 503 with a Retry-After header instead. Building a feed walks the whole catalogue and looks up the categories of every product it emits, so what it costs grows with the catalogue. That is a cron job and not something a web request should carry.
  • Changed: this corrects 1.27.5, which said the memory-exhaustion failure was fixed for both jobs. It is fixed for the points expiry cron. The feed holds one batch of product objects at a time and nothing else is bounded: WooCommerce primes the post and post meta caches for every batch and WordPress does not flush them during the run, and the whole XML document is assembled in memory before it is written. Peak memory still grows with the catalogue, so a large enough one can still exhaust the memory limit while a feed is built. That build now only ever happens on cron.
  • Changed: three things 1.27.5 altered without saying so. The expiry query gained ORDER BY id ASC where it had no ordering at all and took whatever the storage engine gave it. Its NOW() is now evaluated once per batch instead of once per run, so points falling due during a long run are picked up by that same run. And the Ceneo group name is cast back to a string: PHP turns a numeric array key into an integer, so a category named only with digits ("2024") handed an integer to DOMElement::setAttribute and made the whole Ceneo feed fatal under strict types.
  • Changed: the one-off feed build is unscheduled on deactivation and uninstall along with the five recurring events. It carries the platform as an argument, so all six are now cleared with wp_unschedule_hook(), which matches an event whatever arguments it was scheduled with.
v1.27.5
  • Fixed: the loyalty points expiry cron read every due row into memory before deducting any of them, so a large backlog could exhaust the memory limit and expire nothing at all. It now walks the backlog with a cursor on the row id, 200 rows per query, and the same points expire in the same order. The price-comparison feeds stopped asking for the whole catalogue in one query in this release too; 1.27.6 records what that first attempt got wrong and what it did not fix.
v1.27.4
  • Fixed: arrow glyphs in the admin menu paths, and in the strings handed to translators. An arrow inside a translatable string makes the glyph every translator's problem and changes the layout in any locale that drops it.
v1.27.3
  • Fixed: all five scheduled events (abandoned cart, unpaid orders and the three tax-rules sweeps) survived both deactivation and uninstall. The plugin had no deactivation hook at all, and its uninstall routine sat behind the merchant's "remove data on uninstall" opt-in. Unscheduling is not data removal, so it now happens either way.
v1.27.2
  • Fixed: gift cards, product bundles, subscriptions, add-ons, frequently bought together and request a quote all rendered unstyled on the storefront, and the frequently-bought-together and quote scripts never ran at all. Eight stylesheets and scripts were being loaded from the free plugin's folder rather than this one, so the browser asked for files that were never there and got nothing back. Nothing about the features changed; they simply arrive with their appearance and behaviour now.
v1.27.1
  • Fixed: the customer's points history showed English. The activity type was printed as its internal value ("Earn", "Redeem", "Expire") and the reason was stored in the database as an English sentence when the points were awarded, so no translation could reach either. Both are now translated when the table is drawn, which also fixes rows recorded before this release.
v1.27.0
  • Added: catalog mode can now be set per product. The service has always read five product meta keys for this and nothing in wp-admin ever wrote any of them, so the only way to override catalog mode for one product was to write the meta from code. The Polski PRO tab on the product screen now carries all five. Price and Add to cart are three-way (follow the global setting, hide, show) rather than checkboxes, because the service reads any stored value as a deliberate override.
  • Fixed: InPost reported itself available on the enabled checkbox alone, ignoring the API token, so a shop that ticked the box without a token got a silent 401 on every tracking lookup and an empty status that reads as "no update from the carrier yet". It now requires the token, as DPD, DHL and Poczta Polska already did.
  • Removed: a 34-entry PRO feature map assembled on every admin page load for a filter that does not exist. FREE has never applied `polski/admin/localize_data`, so the listener could not run, and nothing read the map anyway. A new check fails the build if PRO ever again listens on a `polski/` hook nothing fires.
v1.26.3
  • Fixed: the consent export endpoint accepted a `format` parameter and ignored it, so asking for CSV returned JSON with no error. `format=csv` now returns a real CSV download; anything else still returns the JSON it always did. Also corrected the documentation for this module, which described an audit endpoint and two action hooks that were never built.
v1.26.2
  • Fixed: leaving a gift card's minimum or maximum custom amount empty on the product screen stored a zero instead of nothing, and a stored bound overrides the global one, so a buyer who typed their own amount got a gift card worth 0.00. An empty field now stays empty and the global limits keep applying; a zero you type yourself is still saved as a zero. The same rule now covers every number field on the panel.
v1.26.1
  • The product panel added in 1.26.0 now hides the fields that do not apply. Tick "Sell as a gift card" and the amount fields appear; leave it off and they stay out of the way, and out of the keyboard tab order. Same for pre-orders and subscriptions. Nothing is gated: with JavaScript off every field is visible and saved exactly as before, and the motion is skipped for anyone whose system asks for reduced motion.
v1.26.0
  • Added: a "Polski Pro" tab on the product screen for the five modules that are configured per product. Gift cards, pre-orders, subscriptions, product bundles and frequently bought together each decide whether to run by reading a product meta key, and no screen ever wrote one, so on a fresh install none of the five could be switched on for any product.
  • Fixed: the KSeF status shown by the free plugin's order badge and order panel stayed at "pending" forever. The status is kept on the invoice record, which the free plugin cannot see, and it is now mirrored onto the order as each submission changes state.
  • Fixed: a loyalty redemption coupon is now tied to the customer who spent the points on it. The owner was stored on the coupon and never checked, so the code worked for anyone who had it.
  • Fixed: an Autopay payment notification whose amount differs from the amount quoted at checkout is now refused, and a payment made through a different bank than the one selected is recorded on the order. Both values were stored for exactly this check and the check was never written.
  • Fixed: the GPSR manufacturer is now included in the product feed. It read a meta key the plugin does not write.
  • Changed: the PlanetPay payment method and refund reference are recorded in the order notes, where they can be read, instead of in order meta that nothing displayed.
  • Added: the AI description box shows when the last text was generated and with which tone. Every run recorded it and nothing showed it.
  • Removed: three order and coupon meta keys that were written and never read back, an affiliate referral token (the referral is matched by affiliate ID), an abandoned-cart ID on the recovery coupon and a cancellation timestamp on unpaid orders (both are already in the coupon code and the order note).
v1.25.1
  • Fixed: the plugin's WooCommerce emails could be silently absent for a whole request. Loading the mailer is not enough on its own: if anything built it before this plugin registered its filter, and third-party plugins do build it on plugins_loaded, the cached mailer was assembled without our classes and the filter could never run again. Measured in a test install: zero of the classes present instead of all of them. The mailer is now topped up when that happens.
v1.25.0
  • Fixed: 167 storefront and email texts across the quote, catalogue mode, frequently bought together, pre-order, add-ons, bundles, gift card, subscription and affiliate modules could not be translated. They were Polish sentences written straight into the settings file, which is not a translatable string, and activation copied them into the database, so no language pack could reach them either. A shop running in German or English got Polish buttons, table headings and customer emails with nothing to do about it but retype all 167 by hand. The wording is now a proper translatable default, delivered in Polish through the Polish language pack exactly as before, and on update every one of those settings that still holds the old Polish is released so the site language takes over. Anything you typed yourself is left exactly as you typed it.
v1.24.0
  • New: automatic handling of unpaid bank transfer orders. WooCommerce's own hold-stock timer only cancels orders left in Pending, while a bank transfer sits in On hold, so an unpaid transfer could hold the last unit of stock indefinitely. Two independent clocks, both measured from the order date: a payment reminder to the customer, then an automatic cancellation that releases the stock. Every order is re-read and re-checked the moment before either fires, and neither touches an order that has been paid, carries an invoice, or has a withdrawal or a return in progress. Both emails are ordinary WooCommerce emails, edited under WooCommerce, Settings, Emails. Requested by 5trid3rr in wppoland/polski#74.
v1.23.0
  • Fixed: "Require receipt with NIP" did nothing. The rule wrote a marking on the product and no code anywhere read it, so a shop that configured it saw no change at checkout. A marked product in the cart now makes the buyer's VAT ID mandatory, on both the classic and the block checkout. The free plugin owns that field, so this needs Polski 1.36.0; against an older free plugin the marking stays inert rather than breaking anything.
  • Removed: the duplicate "Assign JPK_V7 code" rule action. It appeared beside "Assign GTU code", was fed the same list of GTU codes by the same picker, and wrote a separate marking that nothing read, so choosing it had no effect on the invoice. Rules saved under the old name keep working and now reach the invoice, and any code they had stored is moved onto the GTU marking on update unless one is already set there.
v1.22.0
  • Fixed: fifteen modules sold with this plugin could not be switched on. Order fulfillment statuses, the delivery date picker, abandoned cart recovery, gift cards, subscriptions, affiliates, pre-orders, product bundles, product add-ons, frequently bought together, catalog mode, AI product descriptions, the inventory forecast, customer insights and automatic tax rules all check a module switch before they do anything, and no switch for any of them existed on the Modules screen in any released version. Each one now has a card there, with its own settings. They stay off until you turn them on, because several of them change what a shopper sees, and there is a one-time admin notice pointing at the screen. Requires Polski for WooCommerce 1.34.0 or later.
v1.21.0
  • Fixed: a GTU marking assigned by a tax rule was written to the product and then read by nothing. It did not reach the invoice, any report, or the KSeF document, so the automatic GTU assignment sold here produced no output at all in any released version. It is now declared per line as the optional GTU element of FA(2) when an invoice goes to KSeF, and a code that is not one of the thirteen in the schema is left out rather than sent, because it would have the whole document rejected.
  • Changed: the feature list said more about GTU assignment than the code did. Corrected, and it now names where the GTU field lives: entering one by hand is part of the free plugin from 1.33.0, and this plugin assigns it by rule and sends it to KSeF.
  • Note: the JPK_V7 code and the receipt NIP flag are still only stored on the product. Nothing reads them yet, and the feature list now says so.
v1.20.0
  • New: reusable GPSR responsibility profiles and safety presets. Save a manufacturer, EU responsible person and importer once under Polski > GPSR profiles, then pick them from a dropdown on the product instead of retyping them. The product stores only which profile it uses, so correcting an address later corrects every product pointing at it. Anything typed on the product itself always wins, so a profile can cover a range and be overridden on the one item that differs. Requires Polski for WooCommerce 1.32.0 or later.
v1.19.2
  • Fixed: the plugin title label on Freemius notices rendered white on a background measuring 2.37:1, where WCAG AA wants 4.5:1 for text that size. The label now uses the same grey WordPress core uses, at 4.61:1.
v1.19.1
  • Fixed: the invoice request field never appeared on the block checkout. It was registered on `woocommerce_init`, which WooCommerce has already fired by the time Polski boots on `init` priority 0, so the registration went into an event that had already passed.
v1.19.0
  • The plugin's source strings are now English. About 130 of them were written in Polish, which is how the plugin started, but it left every other language being translated out of Polish rather than out of the original. Nothing changes on a Polish shop: each converted string carries its old Polish wording as the Polish translation, and the German and Spanish catalogues were moved onto the new strings rather than discarded.
  • Housekeeping: the translation catalogues were realigned to the code. They had drifted, so the Polish catalogue was missing 76 strings that exist in the plugin and were never translated. Those are now visible as untranslated instead of silently absent.
v1.18.3
  • Declared compatibility with WordPress 7.1. The plugin header still said 7.0, which also disagreed with the readme; both now say 7.1.
v1.18.2
  • **Correction: the KSeF module cannot file invoices, and it is not a matter of switching something on.** The client was written for KSeF 1.0. The Ministry of Finance disabled the KSeF 1.0 test environment on 1 September 2025 and permanently shut down KSeF 1.0 production on 1 February 2026, together with the old Certificate and Authorisation Module. Since then KSeF 2.0 is the only system, and it uses different addresses, a different authentication flow and a different submission flow. Requests from this plugin do not fail validation, they never reach a server. Earlier changelog entries said submissions went to the Ministry test environment, which stopped being true before those entries were written; that was our mistake and we are correcting it here rather than leaving it.
  • The settings hints for the KSeF fields said things like "switch to production for live invoices". They now say what is actually the case, so nobody configures a module expecting it to file.
  • What is unaffected and does work: KSeF readiness in the free plugin (detecting which orders require KSeF, the orders-list column and the status line), the per-invoice UBL/PEPPOL XML download, and the JPK_FA report. None of these contact the KSeF API.
  • A rewrite against the KSeF 2.0 API is in progress. No date promised. Do not generate a KSeF token for this plugin yet; there is nothing that can use one.
v1.18.1
  • The multi-step checkout now honours the free plugin's Checkout button module. Both the classic and the block multi-step checkout read that setting directly, so switching the module off left the custom wording on the place-order button anyway.
  • Minimum WordPress raised to 6.9, matching the free plugin.
v1.18.0
  • The KSeF environment selector now works. The client read a `test_mode` key that nothing ever wrote, so every store was pinned to the Ministry test endpoint regardless of the setting. Choosing "production" now really means production. Only that exact value opts in; anything else, including an empty or unrecognised value, stays on the test endpoint.
  • Safety measure for the above: if your store already had "production" stored, this update resets it to "test" once. That value was chosen while the setting did nothing, and an update should not be the reason a store starts filing legally binding invoices. Set it back deliberately when you are ready. Authentication has still not been proven end to end against a live test account.
  • The Product add-ons module toggle now does something. Add-ons ran on every store regardless of the switch, because the service never read it. To avoid removing a working feature, this update turns the module on automatically for any store that already has add-ons configured on at least one product.
  • Removed the accounting settings group. It collected API credentials for wFirma, Fakturownia and iFirma to perform a push that no code path could carry out, so the plugin was storing third-party API keys and doing nothing with them. Stored values are left untouched in the database and are no longer read or editable. For accountants, the per-invoice UBL/PEPPOL download and the JPK_FA report remain, and all three services import those files.
v1.17.0
  • Fixed a fatal error in the KSeF submission endpoint. `POST /polski-pro/v1/invoices/{id}/ksef` called a method that does not exist, so the request died instead of returning a response. It now queues the submission and answers 202, with 422 for document types KSeF does not accept (receipts, proformas, packing slips), 409 for an invoice already submitted, and 503 when Action Scheduler is unavailable.
  • Fixed the KSeF token setting, which had never been read. The settings endpoint saves the token as `api_token` while the background job looked for `auth_token`, so every submission stopped immediately with a "no auth token" status even when a token was filled in.
  • Fixed the KSeF retry backoff. The delay was calculated and then discarded, so a persistent API fault produced four submissions within seconds instead of spacing them out.
  • KSeF submissions still go to the Ministry test environment only, and the authentication flow has not been proven end to end against a live test account. Nothing in wp-admin triggers a submission; the REST endpoint is the only entry point.
  • Corrected the plugin description and the in-plugin upgrade screen. Direct transmission to wFirma, Fakturownia and iFirma is not enabled in this version, and courier label generation is not available for any carrier. What ships is the per-invoice UBL/PEPPOL XML download, the JPK_FA report, and live shipment tracking. The documentation has been rewritten to match.
v1.16.0
  • AI Act (art. 50) transparency: product copy created by the AI description generator is now marked (machine-readable) and gets a short disclosure on the storefront. A new "Label AI-generated content" option (on by default, in the free plugin's AI settings) controls the on-page disclosure.
v1.15.4
  • Accessibility: honour the OS reduce-motion preference in the multi-step checkout and deactivation forms.
v1.15.3
  • Plugin Check: escaping/sanitisation/i18n/hygiene fixes.
v1.15.2
  • Hardening: added direct file access protection to the template and configuration files that were missing it, so they cannot be loaded outside of WordPress.
v1.15.1
  • Fixed an order fulfillment status issue that could prevent settings from loading on stores using the Packed/Shipped/Delivered statuses.
  • Completed the Polish translation for the order fulfillment statuses and the tax-rules command, and corrected several Polish strings.
  • Internal quality: restored the PHPStan bootstrap so static analysis runs again, and the analyzer now verifies that every settings-backed service is wired correctly.
v1.15.0
  • Licensing and updates now run through Freemius (one-step activation, automatic updates), replacing the in-house license manager. Standalone premium distribution via wppoland.com.
  • Security hardening: escaped all admin/storefront output (XSS), bound SQL table and identifier names with %i placeholders across every repository, and documented request handlers that rely on WooCommerce/WordPress nonce verification.
  • Internal quality: working WPCS, PHPStan (level 6), and PHPUnit gates for the Pro plugin.
v1.14.0
  • Withdrawal Pro: one-click refunds from the admin and via REST (`POST /polski-pro/v1/withdrawals/{id}/refund`), with defensive epsilon rounding and payload re-validation on the refunded amount.
  • Withdrawal Pro: refund PDF credit notes, withdrawal audit log, reporting, and accounting-integration hooks.
  • Withdrawal Pro: one-time admin guide covering the Pro-specific withdrawal decisions.
v1.13.0
  • Automation engine: rule-based automation UI with a filter system for triggering store actions.
v1.12.0
  • Catalog Mode: full "disable shop" mode. New `polski_catalog.disable_shop` toggle (off by default) blocks shop archive, cart, and checkout routes when active so the storefront becomes a pure showcase. Independent sub-toggles per route family (`disable_shop_archive`, `disable_cart`, `disable_checkout`) so merchants can keep, for example, the cart up while hiding the public shop. Admins (manage_woocommerce) bypass the block so they can still preview from wp-admin. Routes early on `template_redirect` priority 1 with a 302 to home_url; filterable via `polski/catalog_mode/disabled_redirect` (return empty string for a 404 instead).
  • Catalog Mode: ABSPATH direct-access guard on the service file (Plugin Check requirement).
v1.11.1
  • GUS auto-fill button: now works in **Block checkout** in addition to classic. The inline script handles both legacy (`#billing_nip`) and WC 8.6+ additional-fields (`#polski-nip`, `input[name="polski/nip"]`) field IDs, uses React's native input setter so controlled inputs pick up programmatic value changes, and watches the DOM with `MutationObserver` so it survives Block checkout's async hydration.
  • GUSClient: short-circuits to `WP_Error('gus_no_soap')` when the PHP soap extension is missing instead of throwing, so the REST endpoint returns a clean 501 without needing an outer try/catch.
  • GUSClient: object cache for the NIP table read (`wp_cache_get`/`wp_cache_set`/`wp_cache_delete`), `%i` placeholder for the table name, and a translators comment on the SOAP fault message - clears the remaining Plugin Check warnings on this file.
  • GUSClient: tighter return type on the cache helper to match the public `lookupByNip` shape.
v1.11.0
  • New: GUS auto-fill button at checkout. The classic WooCommerce checkout now shows a "Pobierz dane z GUS" button next to the NIP field; on click the new POST `/wp-json/polski-pro/v1/gus/lookup` endpoint queries GUS via the existing `Polski\Pro\Validation\GUSClient`, validates the NIP with `Polski\Util\NipValidator`, and fills `billing_company`, `billing_address_1`, `billing_postcode`, `billing_city`, and `billing_regon`. Includes a per-IP rate limit (default 10 lookups / hour, filterable via `polski-pro/gus/rate_limit_window_seconds` and `polski-pro/gus/rate_limit_max_attempts`). Block-checkout integration is left for a follow-up - the REST endpoint is reusable.
v1.10.0
  • New module: AI Feed - invoice Markdown endpoint. `GET /wp-json/polski-pro/v1/invoices/{id}/markdown` returns a Markdown representation of an invoice (number, type, parties NIP, item table with net/VAT/gross, totals, KSeF reference and status, correction reason) so accounting agents and customer-service AI can ingest invoice data without parsing PDF. Auth: shop managers can fetch any invoice; the order owner can fetch their own when authenticated. New filter `polski-pro/ai_feed/invoice_markdown` for customizing the output. Service `Polski\Pro\AIFeed\InvoiceMarkdownBuilder`.
v1.9.0
  • OSS integration helper: `Polski\Pro\TaxRules\OssHelper::isEnabled()` lets invoice, tax-rule and shipping code branch on OSS state without coupling to the FREE `OssObserverService` directly. Reads the `polski_tax_oss_enabled` filter exposed by polski 1.10.0.
v1.8.3
  • Subscriptions: price-change notifications. `Repository::updateRecurringAmount()` now diffs the previous amount and fires `polski_subscription_amount_changed`; the service listens on this action and emails the customer with old/new price, effective renewal date, and a one-click cancel link. Filters `polski_subscription_amount_change_body` / `_headers`; action `polski_subscription_amount_change_notified`.
v1.8.2
  • Subscriptions: extensibility hooks for renewal reminders, filters `polski_subscription_reminder_windows`, `polski_subscription_reminder_subject`, `polski_subscription_reminder_body`, `polski_subscription_reminder_headers`, `polski_subscription_skip_reminder`; actions `polski_subscription_reminder_sent`, `polski_subscription_reminder_failed`.
v1.8.1
  • Performance: bundle flatpickr 4.6.13 locally (checkout LCP improvement, eliminates third-party origin on `cdn.jsdelivr.net`).
  • Performance: upgrade `wp_enqueue_script` calls to array strategy with `defer` (Tax Rules admin, flatpickr).
v1.8.0
  • Tax Rules: WP-CLI command `wp polski tax-rules {list,run,export,import}`.
  • Tax Rules: Bulk action on products list ("Apply tax rules" / "Dry-run tax rules").
  • Tax Rules: 31 unit tests for model serialization + engine condition evaluation.
v1.7.2
  • Tax Rules: Smart Pickers in editor (categories, tags, tax classes, GTU codes).
  • Tax Rules: Weekly and Monthly cron triggers.
v1.7.1
  • Tax Rules: custom taxonomy condition, rule groups, search/filter, JSON import/export.
v1.7.0
  • New module: Tax Rules engine for auto-assigning GTU, JPK_V7 codes and tax classes.
v1.6.0
  • Initial release of PRO.