Title: Spotrebiteľské práva pre WooCommerce
Author: onlinefotka
Published: <strong>May 22, 2026</strong>
Last modified: July 9, 2026

---

Search plugins

![](https://ps.w.org/odstupenie-od-zmluvy/assets/banner-772x250.png?rev=3543256)

![](https://ps.w.org/odstupenie-od-zmluvy/assets/icon-256x256.png?rev=3543256)

# Spotrebiteľské práva pre WooCommerce

 By [onlinefotka](https://profiles.wordpress.org/onlinefotka/)

[Download](https://downloads.wordpress.org/plugin/odstupenie-od-zmluvy.2.6.1.zip)

 * [Details](https://wordpress.org/plugins/odstupenie-od-zmluvy/#description)
 * [Reviews](https://wordpress.org/plugins/odstupenie-od-zmluvy/#reviews)
 *  [Installation](https://wordpress.org/plugins/odstupenie-od-zmluvy/#installation)
 * [Development](https://wordpress.org/plugins/odstupenie-od-zmluvy/#developers)

 [Support](https://wordpress.org/support/plugin/odstupenie-od-zmluvy/)

## Description

#### 🇸🇰 Slovenský popis

Tento plugin pridáva do vášho WooCommerce e-shopu **online formuláre na odstúpenie
od zmluvy a reklamácie**, plne v súlade s európskou Smernicou EÚ 2023/2673 a slovenským
zákonom č. 108/2024 Z. z. o ochrane spotrebiteľa.

**Pre koho je to určené:**

Pre slovenských prevádzkovateľov WooCommerce e-shopov, ktorí potrebujú:

 * **Splniť zákonnú povinnosť** podľa EÚ smernice 2023/2673 (účinná od 19. 6. 2026),
   ktorá vyžaduje aby každý e-shop mal funkciu „Odstúpiť od zmluvy tu” priamo na
   webe (nie len PDF na stiahnutie).
 * **Zjednodušiť proces reklamácií** — zákazník vyplní reklamáciu online, nemusí
   tlačiť papierový formulár, môže priložiť fotografie vady.
 * **Mať poriadok v reklamáciách** — všetky odoslané reklamácie sa zhromaždia v 
   administračnom rozhraní, kde môžete vyplniť reklamačný protokol, sledovať stav
   a vytlačiť oficiálny dokument.

**Hlavné funkcie:**

 * **Odstúpenie od zmluvy** — formulár cez shortcode `[withdrawal_form]`, tlačidlo„
   Odstúpiť od zmluvy tu” pri každej objednávke v Mojom účte, automatická kontrola
   14-dňovej lehoty (po vypršaní sa tlačidlo skryje), HTML potvrdenie s presným 
   dátumom a časom odoslania (zákonný dôkaz na trvalom nosiči).
 * **Reklamácie** — kompletný online reklamačný formulár cez shortcode `[complaint_form]`(
   alias `[reklamacia]`), všetky polia zo štandardného slovenského papierového formulára:
   meno/firma, telefón, e-mail, IBAN, výrobca, model, výrobné číslo, dátum predaja,
   číslo objednávky/faktúry, popis vady. Voliteľné nahrávanie fotografií vady (drag&
   drop, JPG/PNG/WEBP/HEIC, do 5 MB).
 * **Reklamačný protokol** — admin vyplní rozhodnutie (výmena/vrátenie ceny/zamietnutie),
   dátumy, IBAN na vrátenie. Vytlačiteľný A4 protokol (browser-natívne uloženie 
   do PDF), pripravený na archiváciu.
 * **30-dňová zákonná lehota** — plugin posiela 5 dní pred uplynutím automatickú
   pripomienku adminovi (cez WP Cron). Žiadna pokuta od ÚZP za zameškané reklamácie.
 * **Údaje predávajúceho** — vyplníte IČO, DIČ, IČ DPH a adresu raz, zobrazuje sa
   v hlavičke formulárov aj na tlačenom protokole. Berie sa primárne z WooCommerce
   Nastavenia  Všeobecné, voliteľný override.
 * **Plne preložené do slovenčiny** — formuláre aj admin rozhranie.

**Čo plugin NEROBÍ:**

 * Automatické refundy ani zmenu stavu objednávky vo WooCommerce
 * Generovanie dobropisov alebo vratových štítkov
 * Napojenie na dopravcov
 * Výnimky z práva na odstúpenie (digitálny obsah, hygienický tovar atď.)

Tieto kroky rieši prevádzkovateľ manuálne podľa svojich obchodných podmienok.

**Inštalácia v 3 krokoch:**

 1. Aktivujte plugin
 2. Vytvorte 2 stránky a vložte do nich shortcode `[withdrawal_form]` a `[complaint_form]`
 3. V _Spotrebiteľské práva  Nastavenia_ zadajte URL týchto stránok + vyplňte IČO/DIČ
    ak ste firma

#### 🇬🇧 English description

This plugin adds online forms for both **withdrawal from contract** and **complaints(
reklamácie)** to your WooCommerce store, fully compliant with EU Directive 2023/
2673 and Slovak Act No. 108/2024 Coll. on consumer protection.

#### Withdrawal from contract

 * Shortcode `[withdrawal_form]` — embeddable on any page
 * “Withdraw from contract here” button on every order in My Account (hides after
   14 days)
 * Automatic 14-day withdrawal-period check — visual and server-side blocking after
   expiry
 * Automatic form pre-fill for logged-in customers
 * Order ownership verification: e-mail or postcode for guest checkouts
 * HTML confirmation e-mail with submission date and time (legal proof on a durable
   medium)
 * HTML notification e-mail to the shop owner — supports multiple recipients (comma-
   separated)
 * Rate limiting — max 10 attempts per hour per IP (admins bypass)
 * Legally exact button wording per Articles 1 and 3 of the directive

#### Complaints (reklamácie)

 * Shortcode `[complaint_form]` (alias `[reklamacia]`)
 * All fields matching the standard Slovak complaint form: buyer details, IBAN, 
   brand, model, serial number, sale date, order number, invoice, defect description
 * Brand and model are optional — focus is on the defect description
 * Separate “Order number” field — auto-filled from order dropdown for logged-in
   customers, manual text input for guests
 * Optional photo upload with drag & drop (up to 5 photos by default, configurable)
 * Secure photo handling — real MIME-type verification (JPG, PNG, WEBP, HEIC), .
   htaccess protection, random filename hash, realpath safety check
 * Auto-fill from order selection for logged-in customers (brand, model, sale date,
   order number, invoice number)
 * Admin complaint list with filter (by status), search (name, e-mail, invoice, 
   order number, ID) and pagination
 * Admin “Reklamačný protokol” form — fill resolution (exchange / refund / rejected),
   expert assessment contact, dates
 * Status pipeline: New  In progress  Resolved / Rejected (coloured badges)
 * “Date resolved” is required when closing a complaint (auto-fills today if empty)
 * Internal notes field (private) — visible only to admins, NOT included in print
   or customer e-mails
 * Delete action with confirmation and disk cleanup of attached photos
 * Optional status update e-mail to customer
 * Printable A4 view — buyer-filled form + protocol on one page (browser-native 
   print to PDF)
 * Seller info settings — IČO, DIČ, IČ DPH, correspondence address (hybrid: WC Store
   Address + plugin overrides)
 * WP Cron daily reminder e-mail to admin 5 days before the 30-day legal deadline
   expires (each complaint reminded only once)
 * 30-day legal deadline reminder per Act No. 108/2024 Coll.

#### Common features

 * Dedicated top-level admin menu **“Spotrebiteľské práva”** (Consumer Rights) with
   3 clean submenus: Withdrawals from contract, Complaints, Settings
 * Database log of all submissions (separate tables for withdrawals and complaints)
 * Full multilingual support (EN, SK, CS, HU, DE, PL) — auto-detected from WordPress
   Site Language
 * HPOS and legacy WooCommerce compatibility
 * WordPress Privacy Policy integration in GDPR consent
 * Automatic DB schema upgrades — new columns are added on plugin load if missing(
   no manual SQL needed)

#### WooCommerce compatibility

The plugin works with both order-storage systems:

 * HPOS (High Performance Order Storage) — new `wc_orders` tables, WooCommerce 7.1
   +
 * Legacy — classic storage via WordPress posts/postmeta

Switching is fully automatic. HPOS compatibility is declared via `FeaturesUtil` —
the plugin shows a green compatibility badge in WooCommerce > Settings > Advanced.

#### Legislation

The plugin is designed in compliance with:

 * EU Directive 2023/2673 (effective 19 June 2026)
 * Slovak Act No. 108/2024 Coll. on consumer protection (replaced Act No. 102/2014
   Coll. effective 1 July 2024)

#### What the plugin does NOT do

 * Exceptions from the right of withdrawal (digital content, hygiene goods, etc.)
 * Automatic refunds or order status changes in WooCommerce
 * Generating credit notes or return labels
 * Carrier integration

These steps are handled by the shop owner manually according to their terms and 
conditions.

#### Usage

**Withdrawal from contract:**

 1. Create a page and insert the shortcode `[withdrawal_form]`
 2. In **Consumer Rights  Settings**, enter the URL of that page
 3. Add a link to that page in your site footer

**Complaints (reklamácie):**

 1. Create a separate page and insert the shortcode `[complaint_form]`
 2. In **Consumer Rights  Settings**, enter the URL of that page
 3. Fill in the Seller info section (IČO/DIČ if applicable) — these details appear 
    on the printed protocol

**Withdrawal link in WooCommerce emails (YayMail / email customizers):**

Use the `[withdrawal_link]` shortcode inside any WooCommerce email template (YayMail,
Kadence Emails, Email Customizer for WooCommerce, etc.) to insert a pre-filled link
to the withdrawal form. The link automatically includes the correct order key so
the customer lands on the form with their order pre-filled.

    ```
    [withdrawal_link] — inserts a link with the default label "Withdraw from contract"
    [withdrawal_link label="Cancel order"] — custom link text
    [withdrawal_link label="Withdraw" class="btn btn-primary"] — with CSS class(es) on the `<a>` tag
    ```

The shortcode only works inside WooCommerce transactional emails (e.g. Order Completed).
It reads the current order from the email context automatically. Outside of an email
context it returns an empty string. The withdrawal form page URL must be configured
in **Consumer Rights  Settings**.

## Screenshots

[⌊Withdrawal form with the coloured deadline banner⌉⌊Withdrawal form with the coloured
deadline banner⌉[

Withdrawal form with the coloured deadline banner

[⌊"Withdraw from contract here" button in My Account > Orders⌉⌊"Withdraw from contract
here" button in My Account > Orders⌉[

“Withdraw from contract here” button in My Account > Orders

[⌊Complaint form with drag & drop photo upload⌉⌊Complaint form with drag & drop 
photo upload⌉[

Complaint form with drag & drop photo upload

[⌊Admin complaints list with filter, search and pagination⌉⌊Admin complaints list
with filter, search and pagination⌉[

Admin complaints list with filter, search and pagination

[⌊Complaint detail page with Reklamačný protokol (Part 2)⌉⌊Complaint detail page
with Reklamačný protokol (Part 2)⌉[

Complaint detail page with Reklamačný protokol (Part 2)

[⌊Printable A4 complaint protocol (browser-native PDF)⌉⌊Printable A4 complaint protocol(
browser-native PDF)⌉[

Printable A4 complaint protocol (browser-native PDF)

[⌊Plugin settings (Consumer Rights → Settings)⌉⌊Plugin settings (Consumer Rights
→ Settings)⌉[

Plugin settings (Consumer Rights  Settings)

[⌊Customer e-mail — confirmation with submission date and time⌉⌊Customer e-mail —
confirmation with submission date and time⌉[

Customer e-mail — confirmation with submission date and time

[[

[[

## Installation

 1. Upload the folder `odstupenie-od-zmluvy` to `/wp-content/plugins/`
 2. Activate the plugin in WordPress  Plugins
 3. Go to **Consumer Rights  Settings** (top-level admin menu, shield icon) and fill
    in:
 4.  * Shop owner e-mail(s) — comma-separated for multiple recipients (for notifications)
     * URL of the withdrawal form page
     * URL of the complaint form page
     * Seller info (IČO, DIČ, IČ DPH) if you are a business
     * Contact info for fallback (optional)
 5. Create a page for **withdrawal** with the shortcode `[withdrawal_form]`
 6. Create a page for **complaints** with the shortcode `[complaint_form]`
 7. Enter both URLs in the plugin settings

## FAQ

### General

### Where can I find the plugin in admin?

In a dedicated top-level menu **“Spotrebiteľské práva”** (Consumer Rights) with 
a shield icon, located right below WooCommerce. It has 3 submenus: Withdrawals from
contract, Complaints (reklamácie), and Settings.

### Where can I find all submitted requests?

In the admin: **Consumer Rights  Withdrawals from contract** for withdrawals, or**
Consumer Rights  Complaints** for complaints (reklamácie).

### Is the plugin compatible with HPOS (High Performance Order Storage)?

Yes. The plugin is fully compatible with both HPOS and legacy WooCommerce. Switching
is automatic — no configuration required. HPOS compatibility is declared via `FeaturesUtil`
and shown as a green badge in WooCommerce > Settings > Advanced.

### What languages does the plugin support?

English (en_US), Slovak (sk_SK), Czech (cs_CZ), Hungarian (hu_HU), German (de_DE),
Polish (pl_PL). The language is auto-detected from your WordPress Site Language 
setting (Settings  General).

### Can I send notifications to multiple e-mail addresses?

Yes. In **Consumer Rights  Settings**, enter multiple addresses in the “Shop owner
e-mail(s)” field, separated by commas (e.g. `owner@shop.com, support@shop.com`).
Invalid e-mails are silently ignored.

### Will the plugin slow down my site?

No. The plugin uses object caching (`wp_cache_*`) for admin list queries, rate-limiting
via WP transients, and only loads its JS/CSS on pages where the shortcode is used.
HPOS-native queries are used when HPOS is enabled.

### Withdrawal from contract

### Is the plugin compliant with EU Directive 2023/2673?

Yes. The entry button uses the exact wording from Article 1, the form submit button
uses the exact wording from Article 3, and the customer receives a confirmation 
e-mail with date and time of submission per Article 4 (durable medium).

### Where does the “Withdraw from contract here” button appear?

On every order in My Account > Orders, provided the 14-day period has not expired.
After the period, the button is hidden automatically. The URL of the form page must
be set in plugin settings.

### Can I add a withdrawal link directly inside a WooCommerce order e-mail?

Yes. Place the `[withdrawal_link]` shortcode in any WooCommerce email template using
an email customizer plugin (YayMail, Kadence Emails, Email Customizer for WooCommerce,
etc.). The shortcode reads the current order from the email context and outputs 
an `<a>` link that pre-fills the withdrawal form for that specific order. Attributes:`
label` (link text, default “Withdraw from contract”) and `class` (CSS class on the
link). The withdrawal form page URL must be set in **Consumer Rights  Settings**
for the shortcode to work.

### How does the 14-day deadline check work?

The period is counted from the delivery date (order status “Completed” / `date_completed`).
If the order is not completed yet, the creation date is used. The form shows a coloured
banner with days remaining. After expiry, the form is blocked both visually and 
on the server.

### What if a guest customer changed their e-mail and no longer has access to it?

The plugin supports fallback verification by billing postcode. The customer enters
the order number plus postcode — the system verifies the order without the original
e-mail. If they don’t know the postcode either, they must contact the shop owner
directly (the contact is configurable in admin).

### Complaints (reklamácie)

### Do complaints (reklamácie) have a 14-day deadline like withdrawals?

No. Complaints (defective product claims) are governed by the warranty period, not
the 14-day withdrawal period. The plugin tracks the **30-day legal deadline** within
which the shop owner must respond per Act No. 108/2024 Coll. A reminder e-mail is
sent to the admin 5 days before the deadline expires.

### How does the customer submit a complaint?

By filling in the form on the page where you placed the `[complaint_form]` shortcode.
Logged-in customers can pick the order from a dropdown (auto-fills brand, model,
sale date, order number, invoice). Guests fill all fields manually. Photos of the
defect are optional.

### Are the manufacturer and product model required fields?

No. Brand and model are **optional** — some products (e.g. custom prints) do not
have a clear manufacturer label. The mandatory fields are: name, phone, e-mail, 
IBAN, sale date, invoice number, defect description, and GDPR consent.

### How do I process a complaint as a shop owner?

Open **Consumer Rights  Complaints**, click the complaint, and fill in the **Reklamačný
protokol** (Part 2) on the right side: date received, date resolved, resolution (
exchange / refund / rejected), and any extra details. Save the protocol. Optionally
send a status update e-mail to the customer.

### Where are uploaded complaint photos stored?

In `/wp-content/uploads/oodz-reklamacie/YYYY/MM/`. The folder is protected against
PHP execution via `.htaccess` and filenames have a random hash prefix to prevent
URL guessing.

### How do I configure photo upload limits?

In **Consumer Rights  Settings  Complaints**: set max number of photos per complaint(
0 = disable upload entirely) and max size per photo in MB. Defaults are 5 and 5 
MB respectively. The plugin verifies real MIME types (JPG, PNG, WEBP, HEIC) — not
just file extensions.

### Can I print the complaint protocol as a PDF?

Yes. Open the complaint detail page and click **🖨 Print protocol**. A printable 
A4 view opens with Part 1 (buyer-filled form), Part 2 (Reklamačný protokol), legal
text (12-month rule, expert assessment, 14-day reimbursement), and signature areas.
Use your browser’s Ctrl+P  “Save as PDF” — no third-party PDF library bundled.

### Can I take internal notes that the customer does not see?

Yes. The complaint detail page has an **Internal notes** field with a yellow “PRIVATE”
badge. Notes are visible only to admins and are NOT included in the printed protocol,
customer e-mails, or status update e-mails.

### Can I delete a complaint?

Yes. Both the complaint list (🗑 row action) and the detail page (red “🗑 Delete” 
button in the title bar) offer a delete action. A confirmation dialog is shown. 
Deletion is permanent and removes both the DB record and all attached photo files
from disk.

### What if my Seller info is wrong on the printed protocol?

In **Consumer Rights  Settings  Seller info**, you can override the company name
and add legal info (IČO, DIČ, IČ DPH), phone, and a correspondence address different
from your main store address. By default, the company name and address come from**
WooCommerce  Settings  General  Store Address**.

## Reviews

![](https://secure.gravatar.com/avatar/69ec767e1d0764173c9b905a77bd0a4fb5236653c4c0bd7e3b09f6e02877fa54?
s=60&d=retro&r=g)

### 󠀁[Taký menší zázrak pre moje SK e-shopy](https://wordpress.org/support/topic/taky-mensi-zazrak-pre-moje-sk-e-shopy/)󠁿

 [rcervenka](https://profiles.wordpress.org/rcervenka/) July 17, 2026 2 replies

Všetko funguje ako má, pravidelná údržba a rozširovanie funkcionalít, veľká spokojnosť.
Podporenie je samozrejmosťou ✌️🫡

 [ Read all 1 review ](https://wordpress.org/support/plugin/odstupenie-od-zmluvy/reviews/)

## Contributors & Developers

“Spotrebiteľské práva pre WooCommerce” is open source software. The following people
have contributed to this plugin.

Contributors

 *   [ onlinefotka ](https://profiles.wordpress.org/onlinefotka/)

“Spotrebiteľské práva pre WooCommerce” has been translated into 1 locale. Thank 
you to [the translators](https://translate.wordpress.org/projects/wp-plugins/odstupenie-od-zmluvy/contributors)
for their contributions.

[Translate “Spotrebiteľské práva pre WooCommerce” into your language.](https://translate.wordpress.org/projects/wp-plugins/odstupenie-od-zmluvy)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/odstupenie-od-zmluvy/),
check out the [SVN repository](https://plugins.svn.wordpress.org/odstupenie-od-zmluvy/),
or subscribe to the [development log](https://plugins.trac.wordpress.org/log/odstupenie-od-zmluvy/)
by [RSS](https://plugins.trac.wordpress.org/log/odstupenie-od-zmluvy/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 2.6.1

 * Fix: IBAN field in the withdrawal form now correctly respects the “IBAN field”
   setting (Required / Optional / Hidden). Previously it was always required regardless
   of the setting.
 * New: Separate “IBAN field” setting for the withdrawal form (Consumer Rights  
   Settings  Withdrawal form). Previously the withdrawal form shared the setting
   with the complaint form.
 * Docs: Added `[withdrawal_link]` shortcode documentation to the readme (Usage 
   section and FAQ).

#### 2.6.0

 * New: Withdrawal list redesigned to match the complaints list — coloured status
   badges (red/orange/green), Open button, and Delete (🗑) button per row.
 * New: Withdrawal detail page — two-panel layout (customer data on the left, status
   + email notification on the right), identical pattern to the complaint detail.
 * New: IBAN field added to the withdrawal form (required). Stored in the database
   and shown in the admin list and detail page so the admin knows where to send 
   the refund.
 * New: Status-change email now has two distinct variants — “in progress” (we are
   processing your withdrawal) and “resolved” (successfully processed, refund will
   be sent to IBAN: …).
 * New: Email subject adapts per status: “being processed” vs. “has been resolved”.
 * New: Admin can delete individual withdrawal records directly from the list.
 * Translations: all 6 locales (sk_SK, cs_CZ, de_DE, hu_HU, pl_PL, en_US) updated
   with 19 new strings.

#### 2.5.7

 * New: Withdrawal list now shows a Status column (New / In progress / Resolved)
   with inline AJAX update — no page reload needed.
 * New: Order numbers in the withdrawal list are now clickable links to the WooCommerce
   order detail.
 * New: Filter bar on withdrawal list — filter by status or search by name, e-mail,
   or order number.
 * Fix: Withdrawal DB table now correctly stores scope type and product list in 
   separate columns, fixing the qty-aware duplicate check introduced in 2.5.6.

#### 2.5.6

 * Fix: Partial withdrawal now correctly tracks withdrawn quantities per product.
   Customers can withdraw individual pieces from a multi-qty line item across multiple
   submissions (e.g. 1 of 3, then another 1 of 3). The system blocks only when all
   ordered pieces have already been withdrawn, and shows how many pieces are still
   available.

#### 2.5.5

 * New: IBAN validation — the IBAN field in the complaint form is now validated 
   using the ISO 13616 MOD-97 checksum algorithm with country-specific length checks
   for 80+ countries. The field shows a green/red border as live feedback on blur,
   and an invalid IBAN is rejected server-side before the complaint is saved.

#### 2.5.4

 * New: Admin sidebar badge — the “Consumer Rights” menu item now shows a count 
   bubble for new (unseen) withdrawals and unresolved (status = new) complaints,
   the same way WordPress displays pending comments or WooCommerce shows pending
   orders. The badge refreshes every hour (transient) and clears immediately whenever
   a new submission arrives.

#### 2.5.3

 * New: Quantity selection — when withdrawing specific products, customers can now
   choose how many pieces to withdraw (e.g. 2 out of 3). A number input appears 
   next to each product when the checkbox is ticked.
 * Fix: When “multiple withdrawals per order” is disabled, re-submitting a partial
   withdrawal for the same product is now correctly blocked. Withdrawing a different
   product from the same order remains allowed.

#### 2.5.2

 * New: Excluded products & categories — admin can select specific products or entire
   product categories that are not eligible for withdrawal (hygiene products, custom-
   made goods, digital content, etc.). Excluded products are hidden from the partial-
   withdrawal checkbox list; if all products in an order are excluded, full-order
   withdrawal is blocked as well.
 * Fix: Multiple partial withdrawals for the same order (covering different products)
   are now correctly allowed when “Multiple withdrawals per order” is disabled.

#### 2.5.1

 * New: [withdrawal_link] shortcode — inserts a link to the withdrawal form with
   the order pre-filled via order_key. Designed for WooCommerce e-mail customizers(
   YayMail, Kadence Emails, etc.).
 * Changed: “One withdrawal per order” setting renamed to “Multiple withdrawals 
   per order” — logic inverted so the safe default (one per order) requires no configuration.
 * Improved: Hidden product selection fields now get tabindex=”-1″ so they are not
   reachable via keyboard navigation.

#### 2.4.0

 * New: Allow partial withdrawal toggle — admin can disable the “Selected products
   only” option.
 * New: Limit withdrawals per order — optionally prevent customers from submitting
   duplicate withdrawals.
 * New: Prices with/without VAT — choose whether item prices in the withdrawal form
   include tax.
 * New: IBAN field mode — set IBAN to Required, Optional, or Hidden in the complaint
   form (useful for non-EU card payments).
 * New: Custom e-mail attachments — attach a PDF or other file to customer confirmation
   e-mails for withdrawal and complaint via the Media Library.
 * New: Admin settings redesign — each section is now displayed as a card for better
   readability.
 * Fix: Prices displayed as raw HTML entities (e.g. &nbsp;&euro;) instead of formatted
   currency.
 * Fix: “From” address in e-mails was always the WooCommerce default, ignoring the
   plugin’s own e-mail setting.

#### 2.3.1

 * New: Configurable withdrawal period — choose 14 days (legal minimum), 30 days,
   or a custom value (1–365 days).
 * New: Delivery offset setting (+0 to +3 days) — shifts the start of the withdrawal
   period forward to approximate the actual delivery date, as required by EU consumer
   rights law.
 * All deadline calculations, the countdown timer, and the “Withdraw from contract”
   button visibility are automatically updated based on these settings.

#### 2.3.0

**New: GDPR checkbox is now optional, Polylang/WPML support for admin texts, multilingual
locale fix.**

 * Added: **GDPR consent checkbox is now configurable** (_Settings  Data retention&
   GDPR  GDPR consent checkbox_). Three modes — **Hidden** (recommended): no checkbox,
   only a short info text stating the actual legal basis (Art. 6(1)(b) performance
   of a contract + (c) legal obligation under EU Directive 2023/2673 / Slovak Act
   108/2024), with a link to your privacy policy. **Optional**: checkbox shown but
   not required. **Required**: legacy behavior. Existing installations keep “Required”(
   no surprise on upgrade); fresh installations default to “Hidden”.
 * Why: several testers pointed out that processing personal data for withdrawal/
   complaint is not consent-based — it’s contract performance + legal obligation.
   A separate consent checkbox is therefore legally unnecessary and arguably misleading(
   suggests consent is the lawful basis when it isn’t).
 * Added: **Polylang / WPML support for admin-editable strings.** The “Custom notice/
   warning”, “Fallback contact info” and seller-info fields are now registered with
   Polylang’s `pll_register_string()` and WPML’s `icl_register_string()`, so they
   appear in _Languages  String translations_ (Polylang) or _WPML  String Translation_.
   Group name: “Consumer Rights for WooCommerce”. No-op if neither plugin is installed.
 * Fixed: **Form sometimes rendered in English even though the page was Czech** (
   Polylang). The plugin now honors `pll_current_language()` and `wpml_current_language`
   filter when loading translations, so the form follows the current page language
   even when it differs from the WordPress site locale.

#### 2.2.2

**Bugfix: partial withdrawal — checkboxes were not sent to the server.**

 * Fixed: When a customer selected “withdraw from selected products only” and ticked
   products via the new checkbox list, submitting the form returned “For partial
   withdrawal please list the product names.” Two issues: (a) the AJAX submit hand-
   built the request payload and forgot to forward `produkty_items[]`, so the server
   never received the checked items; (b) client-side validation only checked the
   textarea, ignoring the checkbox list. Both fixed — the form now serialises all
   its fields and validation accepts either source.
 * Fixed: When falling back to the textarea (logged-in user without orders, or guest
   before AJAX lookup completes), the textarea is now also pre-filled with the order’s
   item names when the user switches the “withdrawal scope” radio to “selected products
   only” — previously this pre-fill only ran on order-change, leaving the textarea
   empty if the radio was toggled later.

#### 2.2.1

**Bugfix: WC emails not sent from AJAX submit handlers.**

 * Fixed: Withdrawal and complaint confirmation e-mails were not sent because the
   WooCommerce mailer was never bootstrapped during custom AJAX actions (`oodz_submit`,`
   oodz_complaint_submit`). WooCommerce only fires the `woocommerce_email_classes`
   filter on the first `WC()->mailer()` call, so our `OODZ_Email_*` listener classes
   were never instantiated  `do_action( 'oodz_email_*' )` had no listeners and silently
   no-op’d. A new internal helper now forces `WC()->mailer()` before every trigger.

#### 2.2.0

**New: WooCommerce email integration, product-checkbox partial withdrawal, minified
assets, smarter dashboard widget.**

 * Added: **All 5 transactional e-mails are now registered as WooCommerce emails.**
   They appear in _WooCommerce  Settings  Emails_ and can be individually enabled/
   disabled, have their subject, heading and recipient customised, and use the shop’s
   native WC email header/footer styling.
    - Withdrawal — confirmation to customer
    - Withdrawal — notification to shop owner
    - Complaint — confirmation to customer
    - Complaint — notification to shop owner
    - Complaint — status update to customer
 * Added: **Product checkbox list for partial withdrawal — also works for guests.**
   When a customer chooses “withdraw from selected products only” and has picked
   one of their orders from the dropdown, a list of products in that order is shown
   with checkboxes. **Guests** without an account can use the checkbox list too:
   once they type the order number and either the order’s billing e-mail or postcode,
   the products are loaded over a secured AJAX endpoint. The list of selected products
   is included in the e-mail to the shop owner — no more free-text guessing.
 * Security: Guest order lookup verifies that the submitted e-mail OR postcode actually
   matches the order’s billing details. Failed lookups return a generic “not found”
   message (no order-number enumeration possible) and the endpoint is rate-limited
   to 10 lookups per hour per IP.
 * Added: **Refund amount preview** — when “whole order” is selected, the customer
   sees the exact refund amount (matching the order total) so they know what to 
   expect. **Cash-on-delivery (unpaid) orders** show a different note instead — 
   there is nothing to refund yet, and the shop owner will agree the next steps 
   with the customer.
 * Added: **Minified CSS & JS assets.** Front-end assets now load as `oodz-style.
   min.css` / `oodz-script.min.js`. Full unminified versions are loaded automatically
   when `SCRIPT_DEBUG` is enabled (developer convenience).
 * Improved: **Dashboard widget** now uses transient caching (5 min) for much faster
   admin loads, includes “Withdrawals this month” stat, and a “Recent complaints”
   list with quick links to detail pages. Defensive table-existence checks added
   so the widget never warns on fresh installs.
 * Translations updated for all 6 supported languages.

#### 2.1.0

**New: data retention, GDPR tools, WC order linking, dashboard widget.**

 * Added: **Auto-delete after X years** setting in _Consumer Rights  Settings_ (
   data retention). Once a day, complaints and withdrawals older than the configured
   threshold are automatically deleted, along with attached photos from disk. Default:
   0 = disabled. Recommended for Slovakia: 5 years (statutory archival period for
   commercial records per Slovak law).
 * Added: **GDPR personal data export** — plugin now hooks into WordPress native`
   Tools → Export Personal Data`. When a customer requests their data, all matching
   withdrawals and complaints are included automatically (grouped by type).
 * Added: **GDPR personal data erase** — plugin hooks into WordPress native `Tools
   → Erase Personal Data`. Deleting a customer also removes their withdrawal records
   and complaints (including photos on disk, with realpath safety).
 * Added: **Link to WooCommerce order** — if the order number in a complaint matches
   an existing WC order, the complaint detail page now shows a link to the order
   edit page with the order status badge, creation date and total. Helps admins 
   jump quickly between complaint  order.
 * Added: **Meta box on the WooCommerce order edit page** — “🛡 Complaints (reklamácie)”
   sidebar widget showing all complaints filed against the current order, with status
   badges, dates and a short defect excerpt. Shows “No complaints filed for this
   order.” when there are none.
 * Added: **Dashboard widget** “🛡 Consumer Rights — Overview” — shows at a glance:
   count of new complaints, in-progress, complaints with deadline ≤ 5 days, this
   month’s count, all-time totals. With quick links to the admin pages.
 * Translations updated.

#### 2.0.0

**Major release — full complaint (reklamácia) functionality, dedicated admin menu,
brand redesign.**

**Withdrawal form:**

 * Added: `wc-pending` (Awaiting payment) orders are now also shown in the withdrawal
   form order dropdown. Previously only completed / processing / on-hold orders 
   appeared, which broke for shops with custom statuses or workflows where orders
   stay in pending state.
 * Added: new filter hook `oodz_withdrawal_order_statuses` — themes/plugins can 
   customize which statuses appear in the dropdown (e.g. add custom statuses, remove
   unwanted ones).

Plugin renamed to “Spotrebiteľské práva pre WooCommerce” (Consumer Rights for WooCommerce)—
now covers both withdrawal from contract AND complaints under a single product.

**Complaints (reklamácie) — entirely new functionality:**

 * New shortcode `[complaint_form]` (alias `[reklamacia]`) for the online complaint
   form.
 * All fields matching the standard Slovak paper complaint form: buyer details (
   name, phone, e-mail, IBAN), product details (brand, model, serial, sale date,
   order number, invoice), defect description.
 * Brand and model are optional — many products do not have a clear manufacturer
   label and the description of defect is what really matters.
 * Separate “Order number” field on the complaint form. For logged-in customers 
   with orders, the order dropdown writes the order number to a hidden input (no
   duplicate visible field). For guests (and logged-in users without orders), a 
   visible “Order number” text input is shown.
 * Optional photo upload of the defect (up to 5 photos, 5 MB each by default — configurable
   in settings).
 * Drag & drop photo upload with live preview, file size info, and per-photo remove
   buttons.
 * Secure photo handling — `wp_handle_upload()` with real MIME-type verification(
   JPG, PNG, WEBP, HEIC), random hash prefix on filenames, `.htaccess` protection
   against PHP execution, realpath safety check before any deletion.
 * Photo files stored in `/wp-content/uploads/oodz-reklamacie/YYYY/MM/`.
 * New DB table `wp_oodz_reklamacie` (21 columns + 3 indexes) — auto-created on 
   plugin load via versioned upgrade routine.
 * Rate limiting (max 3 complaint submissions per hour per IP) — anti-spam.

**Admin — complaint management:**

 * Dedicated top-level admin menu **“Spotrebiteľské práva”** (Consumer Rights) with
   shield icon — replaces the previous scattered submenu items under WooCommerce.
   Three clean submenus: Withdrawals from contract, Complaints (reklamácie), Settings.
 * Complaint list page with filter (by status), search (name, e-mail, invoice number,
   order number, complaint ID), pagination (20 / 50 / 100 / 200 per page).
 * Complaint detail page split in two columns: Part 1 — buyer-filled data (read-
   only) and Part 2 — Reklamačný protokol form to be filled by the seller.
 * Status pipeline: New  In progress  Resolved / Rejected, with coloured badges 
   in the list.
 * “Date resolved” is required when status is Resolved or Rejected — HTML5 required
   attribute, visual asterisk marker, JS toggles requirement on status change, plus
   server-side enforcement.
 * Auto-fill “Date resolved” with today’s date when admin closes a complaint and
   the field is empty.
 * Internal notes field (private) — visible only to admins, NOT included in print/
   PDF or in customer e-mails. Yellow “PRIVATE” badge in the UI.
 * Photo display: larger thumbnails (140px), photo count badge, lazy loading, fallback“
   No photos attached” message. Photo count column in the list with badge.
 * “Delete complaint” action on both the list (row action) and the detail page (
   title bar). Confirmation dialog before deletion. Permanently removes the DB row
   and any uploaded photos from disk (with realpath safety check). Success/warning
   notices after deletion.
 * Optional “Send status update e-mail to customer” checkbox when saving the protocol.

**Print / PDF:**

 * Printable A4 view of the complaint form (Part 1) + Reklamačný protokol (Part 
   2) on one page, with the legal text on 12-month rule and expert assessment. Uses
   browser-native print  “Save as PDF” (no bundled PDF library).
 * Seller info appears in the header of both the online form and the printed protocol.

**E-mails:**

 * HTML confirmation e-mail to the customer with submission date/time and 30-day
   legal deadline note.
 * HTML notification e-mail to the shop owner with photo thumbnails and a direct
   link to the complaint detail page.
 * Status update e-mail to the customer when the admin closes the complaint (optional,
   sent on demand).
 * WP Cron daily check sends a deadline reminder e-mail to the admin 5 days before
   the 30-day legal deadline (i.e. for complaints 25+ days old that are still open).
   Each complaint triggers only one reminder. Cron event is cleanly unscheduled 
   on plugin deactivation.

**Settings — new “Údaje predávajúceho” section (used in form header + printed protocol):**

 * Hybrid: company name and address come from WooCommerce  Settings  General by 
   default; override fields in plugin settings if needed.
 * Additional legal fields: Business ID (IČO), Tax ID (DIČ), VAT ID (IČ DPH), correspondence
   address, phone.
 * New complaint-specific settings: URL of the complaint form page, max photos per
   complaint, max photo size in MB.

**UI / readability:**

 * Larger, more readable font sizes across both forms — title 26px, section titles
   18px, inputs 16px, labels 15px. Pixel values used instead of rem to ensure consistent
   appearance across themes.
 * Larger radio buttons and checkboxes (20px instead of 18px).
 * More generous input padding (12 / 16 px instead of 10 / 14).
 * Added `tel`, `date`, `number`, `url` input types to the styles selector — they
   no longer fall back to browser defaults.

**Translations:**

 * All complaint and admin strings translated in all 6 supported languages: EN, 
   SK, CS, HU, DE, PL.

**Backward compatibility:**

 * Existing withdrawal-from-contract functionality is preserved without changes.
 * Existing DB table `wp_oodz_log` is untouched.
 * All existing options remain valid.

#### 1.7.0

 * Added: support for multiple admin notification e-mails — separate addresses with
   a comma
 * Updated: Slovak translation now references Act No. 108/2024 Coll. on consumer
   protection (replaced Act No. 102/2014 Coll. effective 1.7.2024)
 * Updated: tested up to WordPress 7.1 and WooCommerce 9.5
 * Internal: new helper methods `sanitize_emails_list()` and `get_admin_emails()`
   for robust e-mail list parsing

#### 1.6.0

 * Added: admin-configurable “Custom notice / warning” field — shop owner can display
   product-specific warnings at the top of the form (e.g. exceptions from withdrawal
   right for personalized or hygiene products)
 * Added: notice supports basic HTML formatting (bold, links, lists, paragraphs)
   and auto-paragraphing for plain text
 * Added: notice text translatable in all supported languages

#### 1.5.0

 * Added: Polish (pl_PL) translation
 * Added: clickable Privacy Policy link in the GDPR consent checkbox — uses WordPress
   native Privacy Policy page (Settings  Privacy)
 * Updated: GDPR consent string in all translations (EN, SK, CS, HU, DE, PL) now
   contains a `%s` placeholder for the privacy policy link

#### 1.4.3

 * Changed: plugin name renamed to “Odstupenie od zmluvy pre WooCommerce” (fully
   Slovak) — primary target market is Slovakia

#### 1.4.2

 * Fixed: included compiled .mo translation files (previously only .po source files
   were shipped, so translations did not actually load)
 * Fixed: remaining occurrence of old shortcode reference in admin help text

#### 1.4.1

 * Added: new English shortcode `[withdrawal_form]` (recommended)
 * Kept: original `[odstupenie_od_zmluvy]` shortcode as backward-compatible alias—
   existing installations are not affected
 * Updated: admin texts and readme now reference the new English shortcode

#### 1.4.0

 * Added: Full multilingual support — plugin is now translatable via standard WordPress
   gettext system
 * Added: English (en_US), Slovak (sk_SK), Czech (cs_CZ), Hungarian (hu_HU), German(
   de_DE) translations included
 * Added: All button labels, e-mails, error messages and admin UI fully translatable
 * Added: JavaScript strings localized via `wp_localize_script`
 * Changed: Source language changed to English (was Slovak) — required for WordPress.
   org translation platform
 * Changed: Class strings and hardcoded labels wrapped in `__()` calls

#### 1.3.1

 * Added: order-number existence check before further validation
 * Added: full HPOS compatibility — works with both HPOS and legacy WC without configuration
 * Added: HPOS compatibility declaration via FeaturesUtil (green badge in WC)
 * Added: HPOS-native query for postcode verification (`billing_postcode` column
   in HPOS)
 * Added: helper `find_order_by_number()` for standard and custom order numbering
 * Fixed: missing `psc` field in AJAX request (postcode fallback did not work)
 * Fixed: plugin name and slug no longer contain the reserved “WC” prefix
 * Fixed: class name no longer uses the `WC_` reserved prefix
 * Fixed: readme rewritten in English per WP.org guidelines
 * Fixed: `$_SERVER` superglobals now use `wp_unslash()` before sanitization
 * Fixed: admin log query now uses object caching

#### 1.3.0

 * Added: automatic 14-day withdrawal-period check (`date_completed` or `date_created`)
 * Added: visual deadline information in the form — green / yellow / red banner
 * Added: client and server-side form blocking after expiry
 * Added: days-remaining counter directly in the order dropdown
 * Added: My Account button auto-hides after 14 days from delivery

#### 1.2.0

 * Added: fallback postcode verification for guest customers
 * Added: contact information setting for error messages
 * Added: rate limiting — max 3 attempts per hour per IP
 * Fixed: IDOR vulnerability — logged-in users can only submit their own orders
 * Fixed: e-mail header injection in subject line
 * Fixed: button wording matches the exact text of EU Directive 2023/2673

#### 1.1.0

 * Added: “Withdraw from contract here” button in My Account > Orders
 * Added: form pre-fill from URL parameter `?objednavka=NUMBER`
 * Added: URL setting for the form page
 * Added: informational message for non-logged-in customers

#### 1.0.0

 * Initial release — shortcode, form, e-mails, DB log, admin overview, base security

## Meta

 *  Version **2.6.1**
 *  Last updated **3 weeks ago**
 *  Active installations **200+**
 *  WordPress version ** 5.8 or higher **
 *  Tested up to **7.1**
 *  PHP version ** 7.4 or higher **
 *  Languages
 * [Czech](https://cs.wordpress.org/plugins/odstupenie-od-zmluvy/) and [English (US)](https://wordpress.org/plugins/odstupenie-od-zmluvy/).
 *  [Translate into your language](https://translate.wordpress.org/projects/wp-plugins/odstupenie-od-zmluvy)
 * Tags
 * [consumer rights](https://wordpress.org/plugins/tags/consumer-rights/)[eu directive](https://wordpress.org/plugins/tags/eu-directive/)
   [GDPR](https://wordpress.org/plugins/tags/gdpr/)[withdrawal](https://wordpress.org/plugins/tags/withdrawal/)
   [woocommerce](https://wordpress.org/plugins/tags/woocommerce/)
 *  [Advanced View](https://wordpress.org/plugins/odstupenie-od-zmluvy/advanced/)

## Ratings

 5 out of 5 stars.

 *  [  1 5-star review     ](https://wordpress.org/support/plugin/odstupenie-od-zmluvy/reviews/?filter=5)
 *  [  0 4-star reviews     ](https://wordpress.org/support/plugin/odstupenie-od-zmluvy/reviews/?filter=4)
 *  [  0 3-star reviews     ](https://wordpress.org/support/plugin/odstupenie-od-zmluvy/reviews/?filter=3)
 *  [  0 2-star reviews     ](https://wordpress.org/support/plugin/odstupenie-od-zmluvy/reviews/?filter=2)
 *  [  0 1-star reviews     ](https://wordpress.org/support/plugin/odstupenie-od-zmluvy/reviews/?filter=1)

[Your review](https://wordpress.org/support/plugin/odstupenie-od-zmluvy/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/odstupenie-od-zmluvy/reviews/)

## Contributors

 *   [ onlinefotka ](https://profiles.wordpress.org/onlinefotka/)

## Support

Issues resolved in last two months:

     10 out of 10

 [View support forum](https://wordpress.org/support/plugin/odstupenie-od-zmluvy/)

## Donate

Would you like to support the advancement of this plugin?

 [ Donate to this plugin ](https://onlinefotka.sk)