{"id":298859,"date":"2026-05-29T10:08:49","date_gmt":"2026-05-29T10:08:49","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/polski-for-woocommerce\/"},"modified":"2026-05-29T10:08:11","modified_gmt":"2026-05-29T10:08:11","slug":"polski","status":"publish","type":"plugin","link":"https:\/\/fr-ca.wordpress.org\/plugins\/polski\/","author":108511,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.17.0","stable_tag":"1.17.0","tested":"7.0","requires":"6.4","requires_php":"8.1","requires_plugins":null,"header_name":"Polski for WooCommerce","header_author":"WPPoland","header_description":"Polish and EU compliance helpers for WooCommerce: Omnibus lowest-30-days price, unit price, VAT display, and GDPR checkout consent checkboxes.","assets_banners_color":"e49dac","last_updated":"2026-05-29 10:08:11","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wppoland.com\/pl\/polski\/","header_author_uri":"https:\/\/wppoland.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":37,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.17.0":{"tag":"1.17.0","author":"motylanogha","date":"2026-05-29 10:08:11"}},"upgrade_notice":{"1.6.3":"<p>Plugin Check cleanup: annotated custom-table queries with justifications. No functional changes.<\/p>","1.6.2":"<p>WordPress.org review hardening update: safer input handling, expanded external service disclosure, and revised readme wording.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3553330,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3553330,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3553330,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3553330,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"polski\/copyright":{"name":"polski\/copyright","title":"Copyright notice"},"polski\/withdrawal-lookup":{"name":"polski\/withdrawal-lookup","title":"Polski \u2014 withdrawal lookup"},"polski\/withdrawal-info":{"name":"polski\/withdrawal-info","title":"Polski \u2014 Annex I(A) information"},"polski\/withdrawal-form":{"name":"polski\/withdrawal-form","title":"Polski \u2014 Annex I(B) form template"}},"tagged_versions":["1.17.0"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Module management dashboard with toggles and per-module settings","2":"GPSR product safety fields in the product editor","3":"GDPR consent checkboxes at checkout with audit trail","4":"Omnibus Directive - 30-day lowest price on sale products","5":"Withdrawal request action in My Account &gt; Orders","6":"DSA illegal content report form (shortcode)","7":"AJAX search and filters on the storefront","8":"Wishlist, compare, and quick view on product listings"}},"plugin_section":[],"plugin_tags":[131785,264911,209978,1370,286],"plugin_category":[45],"plugin_contributors":[264912],"plugin_business_model":[],"class_list":["post-298859","plugin","type-plugin","status-publish","hentry","plugin_tags-gdpr","plugin_tags-gpsr","plugin_tags-omnibus","plugin_tags-polish","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-motylanogha","plugin_committers-motylanogha"],"banners":{"banner":"https:\/\/ps.w.org\/polski\/assets\/banner-772x250.png?rev=3553330","banner_2x":"https:\/\/ps.w.org\/polski\/assets\/banner-1544x500.png?rev=3553330","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/polski\/assets\/icon-128x128.png?rev=3553330","icon_2x":"https:\/\/ps.w.org\/polski\/assets\/icon-256x256.png?rev=3553330","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p><strong>Polski for WooCommerce<\/strong> is a free, all-in-one toolkit that adapts your WooCommerce store to the Polish market and EU e-commerce practices. It bundles product safety information (GPSR), 30-day lowest price history (Omnibus), GDPR consent, the right of withdrawal, unit prices, KSeF-ready invoicing hooks, and a full set of storefront features into one modular plugin - so you can replace a stack of single-purpose plugins with one.<\/p>\n\n<p>Built for Polish online stores, dropshippers, and agencies, it keeps the most common Polish and EU requirements in one place and lets you turn each module on or off as you need it.<\/p>\n\n<p>This plugin helps you configure store workflows related to Polish and EU market practices. It does not provide legal advice or guarantee compliance. Always review your setup for your own business, products, and obligations.<\/p>\n\n<h4>Documentation and useful links<\/h4>\n\n<ul>\n<li><strong>Documentation<\/strong> - https:\/\/polski.wppoland.com\/<\/li>\n<li><strong>Plugin page (Polish)<\/strong> - https:\/\/wppoland.com\/pl\/polski\/<\/li>\n<li><strong>Plugin page (English)<\/strong> - https:\/\/wppoland.com\/en\/polski\/<\/li>\n<\/ul>\n\n<h4>Why Polski for WooCommerce?<\/h4>\n\n<ul>\n<li><strong>Broad module set<\/strong> - GPSR-related product fields, Omnibus price history, consent checkboxes, withdrawal requests, product data, and storefront modules in one plugin<\/li>\n<li><strong>Built for Polish stores<\/strong> - Focused on WooCommerce setups that sell in Poland<\/li>\n<li><strong>Free and open source<\/strong> - Core product, checkout, and storefront tools included<\/li>\n<li><strong>Modern codebase<\/strong> - PHP 8.1+, React admin panel, REST API, WP-CLI support<\/li>\n<li><strong>Block-ready<\/strong> - Full WooCommerce Blocks checkout and cart compatibility<\/li>\n<li><strong>HPOS compatible<\/strong> - Works with WooCommerce High-Performance Order Storage<\/li>\n<\/ul>\n\n<h4>Recent Tools Added<\/h4>\n\n<ul>\n<li><strong>Store health monitor<\/strong> - Passive background monitoring of front-end fatal errors, the checkout failure rate, and sales anomalies, with email and webhook alerts and a status dashboard<\/li>\n<li><strong>GPSR-related product fields<\/strong> - Manufacturer, importer, EU responsible person, product identifiers, safety warnings, and instructions with bulk CSV import or export<\/li>\n<li><strong>Withdrawal request flow<\/strong> - My Account withdrawal action with confirmation page, request logging, email confirmation, and audit trail<\/li>\n<li><strong>DSA report tools<\/strong> - Contact point settings, illegal content report form via shortcode [polski_dsa_report], admin report management page, and email notifications<\/li>\n<li><strong>KSeF integration hooks<\/strong> - NIP-based order flagging, action hooks for invoice plugin integration, and order list status column<\/li>\n<li><strong>Security incidents<\/strong> - Incident log for vulnerabilities, breaches, payment failures, third-party outages, and internal follow-up with CSV export<\/li>\n<li><strong>Product sustainability fields<\/strong> - Eco claim basis, certificate link, and expiry date fields<\/li>\n<li><strong>Verified purchase badge<\/strong> - Green badge on product reviews from customers who actually purchased the product<\/li>\n<\/ul>\n\n<h4>Checkout and Consent<\/h4>\n\n<ul>\n<li><strong>Consent checkboxes<\/strong> - Configurable consent checkboxes at checkout, registration, and reviews with full audit trail<\/li>\n<li><strong>Omnibus price history<\/strong> - Automatic 30-day lowest price display on sale products<\/li>\n<li><strong>Right of withdrawal<\/strong> - Withdrawal and return request flow with email confirmations<\/li>\n<li><strong>Double opt-in<\/strong> - Email verification for customer registration (GDPR best practice)<\/li>\n<li><strong>Store pages<\/strong> - Attach terms, privacy policy, and revocation content to WooCommerce emails<\/li>\n<li><strong>Dispute resolution<\/strong> - ODR platform notice for your imprint\/terms page<\/li>\n<li><strong>Consent audit trail<\/strong> - Logging of customer consents with timestamps, IP, and context<\/li>\n<\/ul>\n\n<h4>Product Display (Shopmarks)<\/h4>\n\n<ul>\n<li><strong>Unit prices<\/strong> - Display price per kg, litre, metre, or any custom unit<\/li>\n<li><strong>Delivery times<\/strong> - Show estimated delivery times on product pages and listings<\/li>\n<li><strong>Tax notices<\/strong> - Display gross\/net price information and VAT rate<\/li>\n<li><strong>Price display<\/strong> - Customize how prices appear across your entire shop<\/li>\n<\/ul>\n\n<h4>Storefront Features<\/h4>\n\n<ul>\n<li><strong>Wishlist<\/strong> - Save favorite products for later<\/li>\n<li><strong>Product compare<\/strong> - Side-by-side product comparison<\/li>\n<li><strong>Waitlist<\/strong> - Back-in-stock email notifications<\/li>\n<li><strong>Quick view<\/strong> - Lightbox product preview from listings<\/li>\n<li><strong>Gallery zoom<\/strong> - Enhanced product image zoom<\/li>\n<li><strong>Featured video<\/strong> - Display product videos on the product page<\/li>\n<li><strong>Product slider<\/strong> - Carousel display for product collections<\/li>\n<li><strong>Infinite scroll<\/strong> - Load more products automatically on archive pages<\/li>\n<li><strong>Product tab manager<\/strong> - Customize product page tabs<\/li>\n<li><strong>AJAX product filters<\/strong> - Dynamic product filtering without page reload<\/li>\n<li><strong>AJAX search<\/strong> - Live product search<\/li>\n<li><strong>Product badges<\/strong> - Sale, new, featured, and custom badges<\/li>\n<li><strong>Promotional popups<\/strong> - Targeted popup campaigns<\/li>\n<\/ul>\n\n<h4>Food and Grocery<\/h4>\n\n<ul>\n<li><strong>Food product information<\/strong> - Ingredients, nutrition facts, and allergen declarations<\/li>\n<li><strong>Optional food labelling fields<\/strong> - Configure origin, distributor, alcohol, and nutrition display where needed<\/li>\n<\/ul>\n\n<h4>Admin and Developer Tools<\/h4>\n\n<ul>\n<li><strong>Modern React admin panel<\/strong> - Module management with per-module settings pages<\/li>\n<li><strong>REST API<\/strong> - Full API for settings, checkboxes, legal pages, withdrawals, and search<\/li>\n<li><strong>WP-CLI commands<\/strong> - Manage Polski from the command line<\/li>\n<li><strong>CSV import\/export<\/strong> - Bulk product data management including GPSR and green claim fields<\/li>\n<li><strong>Shortcodes<\/strong> - Embed notices, withdrawal forms, GPSR info, DSA report form, and more<\/li>\n<li><strong>Database migrations<\/strong> - Safe, versioned schema updates<\/li>\n<li><strong>Integration hooks<\/strong> - KSeF action hooks, filters, and compatibility with popular plugins<\/li>\n<li><strong>Expanded audit scope<\/strong> - Includes DPA registry, DSA, KSeF-ready, anti-greenwashing, verified reviews, and security incident coverage<\/li>\n<li><strong>Incident logging<\/strong> - Record store-side security incidents and export them for internal reviews<\/li>\n<\/ul>\n\n<h3>Getting Started<\/h3>\n\n<p>Follow these steps to configure the plugin for a Polish store. Always consult a qualified lawyer for your specific situation:<\/p>\n\n<ol>\n<li><strong>Verify Legal Pages<\/strong>: Go to <strong>Polski &gt; Modules<\/strong> and ensure <strong>Legal Pages<\/strong> is active. Go to its settings and select your Terms, Privacy Policy, and Withdrawal pages.<\/li>\n<li><strong>Configure Checkboxes<\/strong>: Go to <strong>Polski &gt; Modules &gt; Legal Checkboxes<\/strong> (ensure it's active) and enable the required checkboxes for checkout (Terms, Privacy, Withdrawal).<\/li>\n<li><strong>Set VAT Rates<\/strong>: Ensure you have correct Polish VAT rates (23%, 8%, 5%, 0%) configured in <strong>WooCommerce &gt; Settings &gt; Tax<\/strong>.<\/li>\n<li><strong>Unit Prices<\/strong>: For products sold by weight or volume, enter the unit pricing data in the <strong>Polski<\/strong> tab within the product editor.<\/li>\n<li><strong>Omnibus<\/strong>: The plugin tracks the lowest price from the last 30 days once a product goes on sale. Review the output and adjust the display in <strong>Polski &gt; Modules &gt; Omnibus<\/strong>.<\/li>\n<li><strong>GPSR<\/strong>: If you sell physical goods, fill in the Manufacturer and Responsible Person details in the <strong>Polski<\/strong> tab of your products and review which information should appear on the product page.<\/li>\n<\/ol>\n\n<h3>Configuration<\/h3>\n\n<p>The plugin is modular. You can enable or disable features based on your needs:<\/p>\n\n<ul>\n<li><strong>Product information<\/strong>: GPSR fields, unit prices, delivery times, and food data.<\/li>\n<li><strong>Checkout and consent<\/strong>: consent checkboxes, withdrawal flows, and legal page tools.<\/li>\n<li><strong>Storefront<\/strong>: Wishlist, Compare, Search, Filters, and Badges.<\/li>\n<\/ul>\n\n<p>Each active module with configuration options will appear as a sub-menu under <strong>Polski<\/strong> or have a \"Settings\" link on the Modules page.<\/p>\n\n<h3>External Services<\/h3>\n\n<h4>GUS REGON API (Polish Central Statistical Office)<\/h4>\n\n<p>When the NIP Lookup module is enabled, this plugin connects to the GUS REGON public registry to retrieve company data based on the NIP (tax ID) entered by the user. This connection is made only when the user explicitly triggers a lookup.<\/p>\n\n<ul>\n<li>Data sent: NIP number<\/li>\n<li>Service URL: <a href=\"https:\/\/wyszukiwarkaregon.stat.gov.pl\/\">https:\/\/wyszukiwarkaregon.stat.gov.pl\/<\/a><\/li>\n<li>Service terms: <a href=\"https:\/\/api.stat.gov.pl\/Home\/RegulaminBIR\">https:\/\/api.stat.gov.pl\/Home\/RegulaminBIR<\/a><\/li>\n<li>Service privacy policy: <a href=\"https:\/\/bip.stat.gov.pl\/\">https:\/\/bip.stat.gov.pl\/<\/a><\/li>\n<\/ul>\n\n<h4>Google OAuth<\/h4>\n\n<p>When the Social Login module is enabled and Google login is configured, customers who click <strong>Continue with Google<\/strong> are redirected to Google for authentication. The plugin exchanges the authorization code for an access token and retrieves profile data so the customer can sign in or create an account.<\/p>\n\n<ul>\n<li>Data sent: redirect URI, client ID, authorization code, and access token for profile retrieval<\/li>\n<li>Data received: Google account ID, email address, full name, first name, and last name<\/li>\n<li>Service URL: <a href=\"https:\/\/accounts.google.com\/\">https:\/\/accounts.google.com\/<\/a><\/li>\n<li>Service terms: <a href=\"https:\/\/policies.google.com\/terms\">https:\/\/policies.google.com\/terms<\/a><\/li>\n<li>Service privacy policy: <a href=\"https:\/\/policies.google.com\/privacy\">https:\/\/policies.google.com\/privacy<\/a><\/li>\n<\/ul>\n\n<h4>Facebook OAuth<\/h4>\n\n<p>When the Social Login module is enabled and Facebook login is configured, customers who click <strong>Continue with Facebook<\/strong> are redirected to Facebook for authentication. The plugin exchanges the authorization code for an access token and retrieves profile data so the customer can sign in or create an account.<\/p>\n\n<ul>\n<li>Data sent: redirect URI, app ID, authorization code, and access token for profile retrieval<\/li>\n<li>Data received: Facebook account ID, email address, full name, first name, and last name<\/li>\n<li>Service URL: <a href=\"https:\/\/www.facebook.com\/\">https:\/\/www.facebook.com\/<\/a><\/li>\n<li>Service terms: <a href=\"https:\/\/www.facebook.com\/legal\/terms\">https:\/\/www.facebook.com\/legal\/terms<\/a><\/li>\n<li>Service privacy policy: <a href=\"https:\/\/www.facebook.com\/privacy\/policy\/\">https:\/\/www.facebook.com\/privacy\/policy\/<\/a><\/li>\n<\/ul>\n\n<h4>Google Tag Manager \/ Google Analytics<\/h4>\n\n<p>When the DataLayer module is enabled and a GTM container ID or GA4 measurement ID is configured, the plugin loads Google Tag Manager or Google Analytics scripts on the storefront and pushes ecommerce events based on visitor activity.<\/p>\n\n<ul>\n<li>Data sent: page views and ecommerce event data such as product IDs, product names, prices, cart actions, checkout events, and order totals, depending on your configuration<\/li>\n<li>Service URL: <a href=\"https:\/\/www.googletagmanager.com\/\">https:\/\/www.googletagmanager.com\/<\/a><\/li>\n<li>Service terms: <a href=\"https:\/\/policies.google.com\/terms\">https:\/\/policies.google.com\/terms<\/a><\/li>\n<li>Service privacy policy: <a href=\"https:\/\/policies.google.com\/privacy\">https:\/\/policies.google.com\/privacy<\/a><\/li>\n<\/ul>\n\n<p>Admin feedback and deactivation feedback are stored locally in WordPress and are not sent to an external service.<\/p>\n\n<h3>Disclaimer<\/h3>\n\n<p>THIS PLUGIN IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.<\/p>\n\n<p>WPPoland (wppoland.com) shall not be liable for any direct, indirect, incidental, special, consequential or exemplary damages, including but not limited to damages for loss of profits, goodwill, data, or other intangible losses, resulting from the use or inability to use this plugin.<\/p>\n\n<p>This plugin provides technical tools and templates for WooCommerce stores. It does not constitute legal advice and does not guarantee compliance. Review all generated texts and settings before using them in production. Always test in a development or staging environment before deploying to a live store.<\/p>\n\n<p>WPPoland bears no responsibility for any legal, financial, regulatory, or other consequences arising from the use of this plugin. By installing and activating this plugin, you acknowledge that you do so entirely at your own risk.<\/p>\n\n<!--section=installation-->\n<h4>Automatic Installation<\/h4>\n\n<ol>\n<li>Go to <strong>Plugins &gt; Add New<\/strong> in your WordPress admin.<\/li>\n<li>Search for <strong>Polski for WooCommerce<\/strong>.<\/li>\n<li>Click <strong>Install Now<\/strong> and then <strong>Activate<\/strong>.<\/li>\n<li>Navigate to the new <strong>Polski<\/strong> menu item in your sidebar.<\/li>\n<\/ol>\n\n<h4>Manual Installation<\/h4>\n\n<ol>\n<li>Download the plugin ZIP file from the WordPress.org repository.<\/li>\n<li>In your WordPress admin, go to <strong>Plugins &gt; Add New &gt; Upload Plugin<\/strong>.<\/li>\n<li>Choose the ZIP file and click <strong>Install Now<\/strong>.<\/li>\n<li>Click <strong>Activate Plugin<\/strong>.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"is%20polski%20for%20woocommerce%20free%3F\"><h3>Is Polski for WooCommerce free?<\/h3><\/dt>\n<dd><p>Yes. Polski for WooCommerce is free and open source under GPLv2 or later.<\/p><\/dd>\n<dt id=\"does%20polski%20support%20gpsr%20%28general%20product%20safety%20regulation%29%3F\"><h3>Does Polski support GPSR (General Product Safety Regulation)?<\/h3><\/dt>\n<dd><p>Yes. Polski includes 8 dedicated product fields for GPSR-related data, bulk CSV import or export, a status column in the product list, and product page display tools. You should review which fields and presentation are appropriate for your own products and obligations.<\/p><\/dd>\n<dt id=\"does%20it%20support%20customer%20withdrawal%20requests%20%28eu%20directive%202023%2F2673%29%3F\"><h3>Does it support customer withdrawal requests (EU Directive 2023\/2673)?<\/h3><\/dt>\n<dd><p>Yes. Polski adds a withdrawal action directly in My Account &gt; Orders for eligible orders. The customer opens a confirmation page, submits the request, then receives confirmation and the request is logged in the audit trail.<\/p><\/dd>\n<dt id=\"is%20polski%20ready%20for%20ksef%3F\"><h3>Is Polski ready for KSeF?<\/h3><\/dt>\n<dd><p>Polski can flag orders that may require KSeF invoicing based on NIP in billing data and provides action hooks (<code>polski\/ksef\/invoice_ready<\/code>, <code>polski\/ksef\/is_required<\/code>) for invoice plugin integration. A KSeF status column appears in the orders list.<\/p><\/dd>\n<dt id=\"does%20polski%20support%20gdpr%20for%20polish%20shops%3F\"><h3>Does Polski support GDPR for Polish shops?<\/h3><\/dt>\n<dd><p>Yes. Polski includes configurable consent checkboxes, consent logging, double opt-in registration, and related data-handling tools that can support GDPR workflows. Review the configuration for your own store and obligations.<\/p><\/dd>\n<dt id=\"does%20it%20support%20the%20omnibus%20directive%20%28eu%20directive%202019%2F2161%29%3F\"><h3>Does it support the Omnibus Directive (EU Directive 2019\/2161)?<\/h3><\/dt>\n<dd><p>Yes. Polski tracks and displays the lowest price from the last 30 days on sale products. Review the output and pricing workflow for your own store before relying on it in production.<\/p><\/dd>\n<dt id=\"does%20polski%20work%20with%20woocommerce%20blocks%20checkout%3F\"><h3>Does Polski work with WooCommerce Blocks checkout?<\/h3><\/dt>\n<dd><p>Yes. Polski fully supports both the classic and block-based checkout and cart.<\/p><\/dd>\n<dt id=\"does%20polski%20work%20with%20hpos%20%28high-performance%20order%20storage%29%3F\"><h3>Does Polski work with HPOS (High-Performance Order Storage)?<\/h3><\/dt>\n<dd><p>Yes. Polski declares full compatibility with WooCommerce HPOS (Custom Order Tables).<\/p><\/dd>\n<dt id=\"where%20can%20i%20report%20bugs%20or%20suggest%20features%3F\"><h3>Where can I report bugs or suggest features?<\/h3><\/dt>\n<dd><p>Please use the WordPress.org support forum for support and feature suggestions.<\/p><\/dd>\n<dt id=\"is%20there%20a%20simple%20feedback%20form%20for%20non-technical%20users%3F\"><h3>Is there a simple feedback form for non-technical users?<\/h3><\/dt>\n<dd><p>Yes. The plugin admin includes a simple feedback form that stores messages locally in WordPress. Do not include passwords, licence keys, or customer personal data in that form.<\/p><\/dd>\n<dt id=\"what%20is%20the%20difference%20between%20deactivation%20and%20uninstall%3F\"><h3>What is the difference between deactivation and uninstall?<\/h3><\/dt>\n<dd><p>Deactivating Polski keeps your settings and stored data. Uninstalling removes the plugin files. Plugin data is deleted only if the remove-data-on-uninstall setting is enabled.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.17.0<\/h4>\n\n<ul>\n<li>Store health monitor: new optional module (off by default) for continuous, passive monitoring of store operations. Three sensors run every 5 minutes via WP-Cron: front-end fatal errors (<code>shutdown<\/code> handler, storefront only), the checkout failure rate (observes <code>woocommerce_checkout_order_processed<\/code>, the Store API equivalent, and <code>woocommerce_order_status_failed<\/code> over a rolling 2-hour window), and a sales anomaly check (previous full hour vs the typical order count for the same weekday\/hour over the past 8 weeks, evaluated at most once per hour). No synthetic orders are ever placed. Alerts go out by email and optional JSON webhook (Slack\/Discord-compatible) with a configurable cooldown; a hard outage also records an entry in the security incident log when that module is enabled. Health dashboard under Reports &amp; Tools with a manual \"Run check now\", an admin notice when status is not OK, and a read-only REST endpoint <code>GET \/polski\/v1\/store-health<\/code>. Block checkout is covered through the Store API hook. Settings: alert email\/webhook, failure-rate threshold and minimum sample, sales anomaly threshold, and alert cooldown.<\/li>\n<\/ul>\n\n<h4>1.15.0<\/h4>\n\n<ul>\n<li>B2B fields: optional \"Potrzebuj\u0119 faktury VAT\" toggle, separate from the existing \"Buying as a company\" checkbox. Polish e-commerce convention treats invoice-need as orthogonal to company-vs-consumer (paragon vs faktura), so the field is its own opt-in. Saves to <code>_polski_needs_invoice<\/code> order meta. Wired through both classic checkout and the WC 8.6+ additional-fields API. New setting <code>polski_b2b.show_needs_invoice_toggle<\/code> (default off).<\/li>\n<li>Compare: sticky bottom drawer (<code>polski_compare.show_sticky_bar<\/code>, default off) showing thumbnails of compared products with a \"Por\u00f3wnaj (N)\" CTA and a clear-all button. Hidden on the compare page itself; auto-suppressed when the list is empty. Mobile-responsive CSS.<\/li>\n<li>Compare: new shortcode <code>[polski_compare_count]<\/code> for the header counter, with <code>template<\/code>, <code>class<\/code>, and <code>hide_when_empty<\/code> attributes. Renders an anchor to the compare page with a <code>data-polski-compare-count<\/code> attribute that the existing AJAX layer can update live.<\/li>\n<li>AJAX filters: named presets. <code>[polski_filters preset=\"b2b\"]<\/code> shortcode argument loads overrides from the new <code>polski_filter_presets<\/code> option (<code>[name =&gt; array&lt;setting, value&gt;]<\/code>); the inner array is merged over the global filter settings before render. Archives can map to a preset via the <code>polski\/filters\/archive_preset<\/code> filter. Per-preset runtime tweaks via <code>polski\/filters\/preset<\/code> (preset, name).<\/li>\n<\/ul>\n\n<h4>1.14.1<\/h4>\n\n<ul>\n<li>B2B fields: full IBAN validation. <code>B2BCheckoutService::isPlausibleIban()<\/code> now performs the ISO 13616 mod-97 checksum and a country-code length lookup (PL=28, DE=22, GB=22, FR=27, IT=27, plus 25 more EU\/CH\/GB markets). Replaces the previous structural-only sanity check.<\/li>\n<li>DSA: per-IP rate limiting on the report submission handler. Default 5 reports per hour per IP; window and limit are filterable via <code>polski\/dsa\/rate_limit_window_seconds<\/code> and <code>polski\/dsa\/rate_limit_max_attempts<\/code>. Source IP is filterable via <code>polski\/dsa\/rate_limit_ip<\/code> for sites behind a reverse proxy.<\/li>\n<li>Code quality: tighter Plugin Check compliance in pre-existing modules. CRA <code>IncidentRepository<\/code> now uses <code>%i<\/code> placeholders instead of interpolated <code>{$table}<\/code> queries; <code>FilterService<\/code> documents the read-only GET-based filter context with a scoped <code>phpcs:disable<\/code>\/<code>enable<\/code> block instead of leaving a Recommended warning open; <code>CRAIncidentsPage<\/code> adds <code>wp_unslash()<\/code> + <code>sanitize_key()<\/code> before passing <code>$_POST['kind']<\/code> and <code>$_POST['severity']<\/code> to <code>IncidentKind::tryFrom()<\/code> and <code>Severity::tryFrom()<\/code>; <code>templates\/forms\/ajax-filters.php<\/code> sanitises single-string <code>$_GET[$key]<\/code> reads.<\/li>\n<\/ul>\n\n<h4>1.14.0<\/h4>\n\n<ul>\n<li>B2B checkout fields: Block-checkout support via <code>woocommerce_register_additional_checkout_field<\/code> (WC 8.6+). NIP, REGON, and IBAN now appear in both classic and Block checkouts from a single registration. Values written by the WC additional-fields API are mirrored to legacy <code>_billing_nip<\/code>, <code>_billing_regon<\/code>, <code>_billing_iban<\/code> order meta on save (<code>woocommerce_set_additional_field_value<\/code>) so the existing KSeF and invoice modules pick them up unchanged. The classic-only <code>woocommerce_billing_fields<\/code> path is automatically skipped when the modern API is available, preventing duplicate billing rows. Stores on WC &lt; 8.6 continue to use the classic-only path with the company toggle.<\/li>\n<li>DSA module: per-product report widget. Optional collapsible \"Zg\u0142o\u015b nielegalne tre\u015bci (DSA)\" section on single product pages with the report form prefilled with the product permalink and human-readable name. The form posts to the existing <code>polski_dsa_report<\/code> admin-post handler, so reports flow into the same admin queue as shortcode submissions. Configurable position (after product summary or in product meta block). New filter <code>polski\/dsa\/product_widget_enabled<\/code>. Defaults <code>polski_dsa.product_widget_enabled<\/code> (off) and <code>polski_dsa.product_widget_position<\/code> (<code>after_summary<\/code>).<\/li>\n<li>DSA module: defaults populated for <code>polski_dsa<\/code> (<code>contact_email<\/code>, <code>form_title<\/code>, <code>form_intro<\/code>, plus the new widget keys) so admins see seeded values on first activation instead of empty strings.<\/li>\n<\/ul>\n\n<h4>1.13.0<\/h4>\n\n<ul>\n<li>New module: B2B checkout fields. Adds an optional \"Buying as a company\" toggle plus NIP, REGON, and IBAN fields to WooCommerce classic checkout, with conditional show\/hide tied to the toggle. NIP is validated on submit using the official Polish checksum algorithm and saved to standard <code>_billing_nip<\/code> meta so the existing KSeF and invoice modules pick it up without changes. REGON accepts 9- or 14-digit numbers; IBAN passes a structural sanity check (country prefix + 13-32 alphanumeric body, length 15-34). Settings group <code>polski_b2b<\/code> (<code>enabled<\/code>, <code>show_company_toggle<\/code>, <code>nip<\/code>, <code>regon<\/code>, <code>iban<\/code>). New static utility <code>Polski\\Util\\NipValidator<\/code> (<code>isValid<\/code>, <code>normalize<\/code>, <code>format<\/code>). When polski-pro's NipValidator is active, free skips its own NIP registration to avoid a duplicate field.<\/li>\n<\/ul>\n\n<h4>1.12.0<\/h4>\n\n<ul>\n<li>AI Feed: <code>\/llms.txt<\/code> manifest at the site root following the open standard at https:\/\/llmstxt.org. AI agents that look for the well-known file at <code>\/llms.txt<\/code> now get a Markdown index of the site - title, description, legal pages with <code>?output_format=md<\/code> links, the WooCommerce shop page, and the top product categories. Filters: <code>polski\/ai_feed\/llms_txt_enabled<\/code>, <code>polski\/ai_feed\/llms_txt_sections<\/code>, <code>polski\/ai_feed\/llms_txt_category_limit<\/code>. Setting <code>polski_ai_feed.llms_txt_enabled<\/code> (default <code>true<\/code>).<\/li>\n<\/ul>\n\n<h4>1.11.0<\/h4>\n\n<ul>\n<li>New module: AI Feed. Serves singular posts, pages, and WooCommerce products as Markdown via content negotiation so AI agents and LLM crawlers can ingest store content without scraping HTML. Triggered by <code>Accept: text\/markdown<\/code> header or <code>?output_format=md<\/code> query argument. Adds <code>&lt;link rel=\"alternate\" type=\"text\/markdown\"&gt;<\/code> to single views for discovery and a \"View AI Version\" row action on the Posts, Pages, and Products list screens.<\/li>\n<li>AI Feed: product Markdown enriched with Polish-market data - SKU, GTIN\/EAN, gross\/regular\/sale price, currency, tax class, Omnibus lowest price (last 30 days), delivery time, stock quantity and availability, weight, dimensions, brand, manufacturer, GPSR responsible person, and product categories. Front matter exposes the same fields as YAML for structured ingestion.<\/li>\n<li>AI Feed: filters <code>polski\/ai_feed\/enabled<\/code>, <code>polski\/ai_feed\/post_types<\/code>, <code>polski\/ai_feed\/post_markdown<\/code>, <code>polski\/ai_feed\/product_markdown<\/code>, <code>polski\/ai_feed\/product_facts<\/code>, <code>polski\/ai_feed\/password_required<\/code>. Settings group <code>polski_ai_feed<\/code> (<code>enabled<\/code>, <code>post_types<\/code>). Default post types: <code>post<\/code>, <code>page<\/code>, <code>product<\/code>.<\/li>\n<\/ul>\n\n<h4>1.10.0<\/h4>\n\n<ul>\n<li>New module: OSS observer. Tracks the EU intra-community \u20ac10,000 B2C delivery threshold by integrating with the standalone One Stop Shop plugin. One-click install + activation directly from the module row. WooCommerce admin note prompts install when the observer is toggled on without the external plugin present. Exposes the filter <code>polski_tax_oss_enabled<\/code> so polski-pro and third-party code can branch tax logic on OSS state.<\/li>\n<li>Modules page: redesigned as a WP list-table (Name \/ Enabled \/ Description \/ Edit) with MoSCoW-prioritised grouping - Legal &amp; Compliance, Tax &amp; Pricing, Checkout &amp; Orders, Content &amp; Trust, Advanced &amp; Tools. Pencil icon opens a dedicated settings subpage per bucket (<code>admin.php?page=polski-group-&lt;bucket&gt;#polski-module-&lt;id&gt;<\/code>) registered dynamically for every module with settings, enabled or not.<\/li>\n<li>Setup wizard: rewritten as a 5-step guided flow (Company &gt; Legal &gt; Tax &amp; OSS &gt; Checkout &gt; Finish). Each step uses toggle rows with inline description panels; optional steps have Skip Step + Continue; OSS toggle on the Tax step triggers One Stop Shop plugin install on Finish.<\/li>\n<li>Dashboard: \"Relaunch setup wizard\" button for merchants who want to rerun the guided setup after completion.<\/li>\n<\/ul>\n\n<h4>1.9.1<\/h4>\n\n<ul>\n<li>Compliance checklist: Accessibility (WCAG) section - 9 heuristic rules scanned against the static homepage HTML (html lang, skip link, h1, viewport meta, main landmark, search role, focus outline, autoplay sound, missing img alt). REST: <code>GET \/polski\/v1\/compliance\/accessibility<\/code>.<\/li>\n<li>Compliance checklist: Cookie banner now includes a push-notification prompt detector - flags <code>Notification.requestPermission<\/code>, <code>PushManager.subscribe<\/code> and common third-party push SDKs triggered without user interaction.<\/li>\n<li>New module: RODO training documentation generator. Admin page <code>Polski &gt; RODO training docs<\/code> downloads three printable HTML templates (training logbook, principles summary, data-breach response playbook). Pre-branded with shop data from the setup wizard.<\/li>\n<\/ul>\n\n<h4>1.9.0<\/h4>\n\n<ul>\n<li>New module: Complaint template generator. Ready-to-print complaint form (formularz reklamacyjny) auto-populated with seller data. Admin page <code>Polski &gt; Complaint template<\/code> with preview + download as standalone HTML. <code>[polski_complaint_template]<\/code> shortcode to embed on customer pages.<\/li>\n<li>New module: Copyright \/ license notice helpers. <code>[polski_copyright]<\/code> shortcode + <code>polski\/copyright<\/code> block with year, owner and optional license. <code>[polski_image_credit]<\/code> shortcode for per-image credits with source link and license.<\/li>\n<\/ul>\n\n<h4>1.8.2<\/h4>\n\n<ul>\n<li>New module: Business identification. Renders the shop's business data (name, address, NIP, REGON, email, phone) as a <code>[polski_business_info]<\/code> shortcode and a dynamic Gutenberg block <code>polski\/business-info<\/code>. Reads values set in the setup wizard (<code>polski_general<\/code> option). Block and inline formats with configurable separator.<\/li>\n<\/ul>\n\n<h4>1.8.1<\/h4>\n\n<ul>\n<li>New module: SBOM generator. Emits a CycloneDX 1.4 JSON document listing PHP (composer.lock) and JS (package-lock.json) dependencies plus plugin metadata. Admin page <code>Polski &gt; SBOM<\/code> with one-click download for FREE and (when installed) PRO. Content-Type <code>application\/vnd.cyclonedx+json<\/code> \u2014 ready for Dependency-Track \/ Trivy.<\/li>\n<\/ul>\n\n<h4>1.8.0<\/h4>\n\n<ul>\n<li>New module: CRA incident reporting. Records actively-exploited vulnerabilities and security incidents with a CRA Article 14 early-warning deadline (24h for incidents\/exploits, 72h for near misses). Admin page <code>Polski &gt; CRA incidents<\/code> to record, dispatch (webhook + email) and mark resolved. JSON export per ENISA SRP draft schema. Hourly cron checks for deadlines approaching. Action hooks <code>polski_cra_incident_recorded<\/code> and <code>polski_cra_incident_deadline_approaching<\/code>. Migration 2.1.0 creates <code>polski_cra_incidents<\/code>.<\/li>\n<\/ul>\n\n<h4>1.7.2<\/h4>\n\n<ul>\n<li>Site audit: four new dark-pattern checks. Forced account creation (EU Directive 2023\/2673), stale\/fake sale countdowns (products still on-sale after date_to passed), misleading \"from\" price on variable products with &gt;50% min\/max spread, false urgency via oversized low-stock threshold (&gt;5).<\/li>\n<\/ul>\n\n<h4>1.7.1<\/h4>\n\n<ul>\n<li>Compliance checklist: added Cookie banner (active consent) section. Scans the homepage HTML with a 1h transient cache and reports 9 rules (banner presence, Accept, Reject with equal prominence, granular settings, Analytics\/Marketing categories, privacy-policy link, withdrawal hint, implied-consent phrase trap).<\/li>\n<li>REST API: <code>GET \/polski\/v1\/compliance\/cookie-banner?url=<\/code> returns the cookie-banner checklist as JSON.<\/li>\n<li>5 new unit tests.<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<ul>\n<li>New module: Compliance checklist for Privacy Policy (RODO Art. 13) and Regulamin (Ustawa o swiadczeniu uslug \/ Ustawa o prawach konsumenta). Structural heuristic scanner with 17 + 15 rules, severity levels (Required\/Recommended\/Optional), and a WP-admin checklist page showing score and per-element pass\/fail.<\/li>\n<li>REST API: <code>GET \/polski\/v1\/compliance\/page\/{privacy|terms}<\/code> returns the full checklist as JSON.<\/li>\n<li>Admin: new submenu Polski &gt; Compliance checklist.<\/li>\n<li>12 unit tests covering normalization (HTML + diacritic strip), rule evaluation, score math and default rule sets.<\/li>\n<\/ul>\n\n<h4>1.6.3<\/h4>\n\n<ul>\n<li>Fixed: Added per-line <code>phpcs:ignore<\/code> annotations with justifications on all <code>$wpdb<\/code> custom-table calls (repositories, Migrator, DSAService, uninstall.php)<\/li>\n<li>Fixed: Added <code>phpcs:ignore<\/code> annotations on <code>meta_key<\/code> \/ <code>meta_value<\/code> \/ <code>meta_query<\/code> \/ <code>tax_query<\/code> lookups in service classes (ExpertReview, DoubleOptIn, SocialLogin, ReviewRequest, Faq)<\/li>\n<li>Fixed: Added <code>phpcs:ignore<\/code> on WooCommerce email header\/footer <code>do_action()<\/code> invocations in email templates<\/li>\n<li>Result: Plugin Check now reports 0 errors and 0 warnings on the built release package<\/li>\n<\/ul>\n\n<h4>1.6.2<\/h4>\n\n<ul>\n<li>Fixed: Softened plugin description and FAQ wording to avoid implying legal compliance or legal guarantees<\/li>\n<li>Fixed: Documented Google OAuth, Facebook OAuth, and Google Tag Manager \/ Google Analytics in External Services<\/li>\n<li>Fixed: Removed broken GitHub support links from the admin sidebar and deactivation modal<\/li>\n<li>Fixed: Hardened remaining <code>$_GET<\/code> and <code>$_POST<\/code> handling in admin and storefront flows<\/li>\n<li>Fixed: Replaced internal <code>wp_redirect()<\/code> calls with <code>wp_safe_redirect()<\/code> where the target stays on-site<\/li>\n<li>Fixed: Removed HEREDOC usage from review request emails for better Plugin Check compatibility<\/li>\n<li>Fixed: Replaced all remaining inline <code>&lt;script&gt;<\/code> tags (DataLayer events, JSON-LD schema) with <code>wp_print_inline_script_tag()<\/code> \/ <code>wp_print_script_tag()<\/code><\/li>\n<li>Fixed: Refactored repository queries to use <code>$wpdb-&gt;prepare()<\/code> with <code>%i<\/code> table-name placeholder (eliminates table-name interpolation suppressions)<\/li>\n<li>Fixed: Replaced raw <code>echo $html<\/code> in Elementor widgets with <code>wp_kses_post()<\/code><\/li>\n<li>Fixed: Prefixed all template variables with <code>polski_<\/code> to satisfy WordPress.org naming conventions<\/li>\n<li>Fixed: Removed dozens of phpcs:ignore suppressions in favour of real fixes<\/li>\n<\/ul>\n\n<h4>1.6.1<\/h4>\n\n<ul>\n<li>Fixed: Moved inline admin CSS and JS to enqueued asset files (wp_enqueue_style \/ wp_enqueue_script)<\/li>\n<li>Fixed: Sanitized $_GET inputs in the AJAX product filters template<\/li>\n<li>Fixed: Removed manual load_plugin_textdomain() call (WordPress.org auto-loads translations since WP 4.6)<\/li>\n<li>Fixed: Hardened nonce verification by sanitizing $_POST values before passing to wp_verify_nonce()<\/li>\n<li>Fixed: Added missing wp_unslash() and capability check in expert review and product meta save flows<\/li>\n<li>Fixed: Updated readme.txt Contributors username and removed broken donate \/ GitHub repository links<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>Added Social Login module (Google + Facebook OAuth2 with auto-registration)<\/li>\n<li>Added Product Authors taxonomy for bookstores and publishers<\/li>\n<li>Added Expert Reviews custom post type with ratings and Schema.org markup<\/li>\n<li>Added Order Export module (CSV with 30+ configurable fields)<\/li>\n<li>Added FAQ module with categories, accordion shortcode, and Schema.org FAQPage<\/li>\n<li>Enhanced Custom Checkout Fields with 5 conditional logic types (field value, shipping, payment, category, cart total)<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Added Auto Restore Stock module - automatically restores product stock on order cancellation, refund or failure<\/li>\n<li>Added AJAX Add to Cart module - add products to cart without page reload, including variable products<\/li>\n<li>Added Custom Checkout Fields module - add, modify and reorder checkout fields with multiple field types and validation<\/li>\n<li>New \"Stock &amp; Cart\" and \"Checkout\" module groups in the admin panel<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Added \"From price\" display for variable products (shows \"from XX PLN\" instead of price range)<\/li>\n<li>Added minimum order value and quantity rules with cart validation<\/li>\n<li>Added automated review request emails after order completion<\/li>\n<li>Added opt-out support for review request emails<\/li>\n<li>Improved localization: all __() fallback strings now use English source language<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Added GPSR module: 8 product fields, CSV bulk import\/export, status column in product list, product page display<\/li>\n<li>Added customer withdrawal request flow in My Account (EU Directive 2023\/2673)<\/li>\n<li>Added DSA Toolkit: report form shortcode, admin reports page, email notifications<\/li>\n<li>Added KSeF-ready module: NIP-based auto-detection, integration hooks, order list column<\/li>\n<li>Added Security incidents module: CRA-oriented incident log with status tracking and CSV export<\/li>\n<li>Added verified purchase badge for product reviews<\/li>\n<li>Expanded Site Audit with DPA, DSA, KSeF-ready, anti-greenwashing, verified review, and security incident checks<\/li>\n<li>Added anti-greenwashing product fields (eco claim basis, certificate, expiry)<\/li>\n<li>Added dynamic per-module settings pages in WordPress admin menu<\/li>\n<li>Fixed GPSR rendering on WooCommerce Blocks single product pages<\/li>\n<li>Streamlined free version for WordPress.org submission<\/li>\n<li>5 language packs: Polish, German, Czech, Slovak, Ukrainian<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Added storefront modules (compare, quick view, badges, tabs, video, zoom, slider, infinite scroll, popups)<\/li>\n<li>Added configurable admin and email copy<\/li>\n<li>Added customer flows for withdrawal and waitlist<\/li>\n<li>Improved WooCommerce Blocks checkout support<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>GDPR checkboxes, Omnibus Directive, withdrawal forms<\/li>\n<li>Shopmarks: unit prices, delivery times, tax notices<\/li>\n<li>Wishlist, waitlist features<\/li>\n<li>Food product information fields<\/li>\n<li>REST API, WP-CLI, CSV import\/export<\/li>\n<li>Full Polish translation<\/li>\n<\/ul>","raw_excerpt":"Polish WooCommerce toolkit: GPSR, Omnibus 30-day price, GDPR consent, withdrawal forms, KSeF-ready hooks, unit prices and storefront modules.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/298859","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=298859"}],"author":[{"embeddable":true,"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/motylanogha"}],"wp:attachment":[{"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=298859"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=298859"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=298859"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=298859"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=298859"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/fr-ca.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=298859"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}