Linux 软件免费装
Banner图

ErreD EU Order Withdrawal for WooCommerce

开发者 draison
recessodigitale
更新时间 2026年10月16日 23:15
PHP版本: 8.2 及以上
WordPress版本: 7.1
版权: GPLv2 or later
版权网址: 版权信息

标签

woocommerce consumer cancellation withdrawal recesso

下载

0.8.0 0.9.0 0.5.4 0.5.9 0.6.0 0.5.10 0.7.0

详情介绍:

From 19 June 2026, EU Directive 2023/2673 requires online stores across the European Union to provide a digital withdrawal function: a way to cancel a distance contract online that is at least as easy to use as the purchase flow itself. A single "cancel" button is not enough. The law requires a clearly labelled, continuously available function, a two-step confirmation, and an acknowledgement on a durable medium whose timestamp fixes the legal moment of communication. ErreD EU Order Withdrawal for WooCommerce implements that function end to end — not just the button, but the declaration flow, the two-step confirmation, the durable-medium receipt, the eligibility rules and the merchant review tools needed to actually comply. It ships the Italian transposition out of the box (art. 54-bis of the Codice del Consumo, introduced by D.Lgs. 209/2025) with the legally-fixed label «recedere dal contratto qui», and it is fully translatable for other EU markets. The plugin does not create a right of withdrawal: it provides the online channel to exercise an existing one, honouring the legal exceptions (e.g. art. 59 in Italy). It is built security-first, is WooCommerce High-Performance Order Storage (HPOS) native, and works fully offline (no external service calls). For consumers For merchants Built to standard This plugin encodes legal and security intent; it is not legal advice. The mapping of the art. 59 exceptions to your catalogue and the durable-medium content must be validated by a qualified legal professional before relying on them.

安装:

  1. Upload the plugin to the /wp-content/plugins/ directory, or install it through the WordPress plugins screen.
  2. Activate the plugin through the 'Plugins' screen in WordPress.
  3. WooCommerce 8.2 or newer (with High-Performance Order Storage) is required.
  4. Visit WooCommerce → Recesso digitale: settings to configure the withdrawal window, what it is counted from, and your product/category exclusions.

屏幕截图:

  • Step two: the explicit "conferma recesso" confirmation.
  • The acknowledgement screen shown after confirmation.
  • The admin requests screen: status filter, free-text search and per-request actions.
  • The request detail: each withdrawn item's period and whether the request was sent within it, the durable-medium receipt (PDF), audit timeline and status processing.
  • The product editor: the withdrawal status and what the withdrawal period is counted from, settable per product or per category.

升级注意事项:

0.9.0 Goods and services can have their own withdrawal deadlines. Fixes WPML/Polylang translations ignoring a product's withdrawal status, so an excluded product could be withdrawn from in another language. No data migration required. 0.8.1 Fixes a customer who pastes their order number as WooCommerce prints it, with the #, never receiving a withdrawal link and never being told why. Recommended for all sites. Also shows customers their withdrawal deadline. No data migration required. 0.8.0 The order lookup screen's four texts and the withdrawal page's button colour are now settings, and the buttons can inherit your theme's style instead. Fixes two options left behind on uninstall. Nothing changes until you change it. No data migration required. 0.7.0 Customers can follow their withdrawal requests, and the receipt PDF, from My Account. Fixes a withdrawal page that was deleted or unpublished silently sending every withdrawal link to your home page. Recommended for all sites. No data migration required. 0.6.1 Fixes two broken links in the requests screen: Export CSV reporting an expired link, and the durable-medium receipt refusing to open from the request detail panel. Both affected every use, not just occasional ones. Recommended for all sites. No data migration required. 0.6.0 Checkout consents now work in the Checkout block, My Account gains a "Right of withdrawal" tab, and the settings screen is far more configurable. Fixes missing order notes on decisions taken from the "Set status" dropdown. Adds one optional database column, applied automatically. 0.5.10 Compatibility release for WordPress 7.1 and WooCommerce 11, with the admin screen aligned to the new 40px control size. Also updates the bundled Dompdf library to 3.1.6, which carries security fixes. Recommended for all sites. No data migration required. 0.5.4 Admin menu entries now default to English for non-Italian sites; Italian labels are unchanged via the bundled translation. No data migration required. 0.5.3 Safer uninstall: only the page the plugin itself auto-created can be removed when deleting data on uninstall; a page you selected yourself in settings is never touched. No data migration required. 0.5.2 A single, correctly-working withdrawal button for guests and members, a tidier styled confirmation step, and admin improvements: abandoned (unconfirmed) requests are hidden and restartable, and the menu badge counts all open requests with the standard styling. No data migration required. 0.5.1 Bundles the full JS/CSS source alongside the compiled assets and links the public development repository, updates the bundled Dompdf to 3.1.5, and hardens the admin receipt download and the product withdrawal-status save. No data migration required. 0.5.0 Adds a withdrawal-status column to the orders screen and replaces the request detail panel's action buttons with a single "Set status" dropdown plus a "Save status" button. No data migration required. 0.4.0 Richer per-product/category withdrawal status (art. 59 exceptions), a post-activation welcome notice, a reorganised settings screen, and a redesigned Annex I.B model form. No data migration required. 0.3.1 Fixes the in-place schema upgrade (empty requests list / blank withdrawal submission after updating to 0.3.0) and prevents the withdrawal form from white-screening on a transient error. 0.3.0 Adds art. 59 product/category configuration, checkout consents, the Annex I.B model form, status emails, admin actions/stats/CSV export, GDPR tools and more. Adds two optional database columns (applied automatically). Review the new settings under Recesso digitale → Settings. 0.2.0 Clearer withdrawal page (checkbox product picker with thumbnails and per-product quantities) and a fuller durable-medium acknowledgement that lists the selected products. No data migration required. 0.1.0 Initial release.

常见问题:

Does this plugin decide whether an order can be withdrawn?

No. The plugin provides the channel and records the request; the merchant accepts or rejects each one. The ordinary 14-day period is shown as advisory information (it does not hide the function), and the merchant can pre-exclude specific products or categories (art. 59). Rejecting a request requires a reason, which is recorded and emailed to the consumer. The mapping of the art. 59 exceptions to your catalogue must still be validated by a legal professional.

Does it work for guest-checkout orders?

Yes. Guests receive a per-order, single-purpose signed link (HMAC, verified in constant time and rate-limited). A bare order id or order key is never sufficient to submit a withdrawal, and responses are uniform to prevent order enumeration.

Does the withdrawal flow require JavaScript?

No. The two-step flow is server-rendered and works with JavaScript disabled; JavaScript only enhances the admin experience.

What is the "durable medium"?

A withdrawal acknowledgement sent by email together with a stored PDF receipt, kept in a protected location and downloadable only through a capability- or token-checked endpoint. The receipt records the content of the request and the exact date and time of transmission.

Do the checkout consents work with the Checkout block?

Yes. They are registered through WooCommerce's Additional Checkout Fields API, so WooCommerce renders, validates and stores them natively in the block checkout — no extra JavaScript is loaded. That API arrived in WooCommerce 8.9: on older versions the block checkout simply shows no consents, and the classic [woocommerce_checkout] shortcode keeps working on every supported version.

Can a consent appear only for the products that need it?

Yes. Enable "Show each consent only when the cart contains a product classified for it" under Checkout consents. Each consent then follows the "Withdrawal status" you set on the product or its category: the digital-content box appears only with art. 16(m) items in the cart, the service box only with art. 14(4)(a) items. The option is off by default, so updating the plugin never changes what your checkout shows. Either consent can also be made a condition of placing the order, and both are off by default. For the Article 14(4)(a) service-start consent that default is deliberate: asking for the service to begin inside the withdrawal period is the customer's request to make, and it only entitles you to a proportionate payment if they later withdraw. Require it only where your service always begins inside that window — a live session, a booking for the next few days — so an order without the request is one you cannot fulfil.

Can customers see the requests they have sent?

Yes. The My Account "Right of withdrawal" tab lists them with the date they were sent, the order, the scope, the current status, any note you wrote when deciding, the receipt verification code and a link to the receipt PDF that keeps working for as long as the account does. Orders they can still withdraw from are listed in the same table. The tab is on by default and can be turned off under Withdrawal link visibility. Guest-checkout customers have no account, so their route stays the signed link in their emails.

My withdrawal links stopped working. What happened?

Most likely the page hosting the withdrawal form was deleted, moved to the trash or unpublished. When that happens the plugin stops showing withdrawal links rather than pointing them somewhere useless, and tells you so on the settings screen and in an admin notice. Select or restore the page under General and the links come back.

Does it support WooCommerce Subscriptions?

Optionally. If WooCommerce Subscriptions is active, a confirmed withdrawal cancels the related subscription by transitioning its status — it never deletes subscription data. With Subscriptions absent, the plugin is unaffected.

Does the plugin make external network calls?

No. It functions fully offline and loads no third-party scripts, fonts or assets.

What happens to my data on uninstall?

Nothing is removed unless you opt in via the "Delete all data on uninstall" setting. When enabled, the plugin removes its tables, its options, the flow page it created, and the withdrawal settings stored on your products and categories. Your orders are left as they are.

Can I change the wording on the withdrawal page?

Yes, in three ways, and you will usually only need the first. The four texts on the order lookup screen — the page title, the intro paragraph, the hint under the email field and the submit button label — are settings, under WooCommerce → Order Withdrawal: settings → Order lookup screen. The intro of the declaration form, the consumer self-declaration, the excluded-product notices and the status emails have their own fields on the same screen. Leave any of them empty to keep the bundled wording, which follows the language of each visitor; your own text is shown exactly as written, in every language, and can be translated per language with WPML or Polylang. For anything else — field labels, the confirmation step, the acknowledgement screen — use a translation editor such as Loco Translate, which edits the plugin's strings and stores your version outside the plugin so updates do not overwrite it. For full control of the markup, copy any file from the plugin's templates/frontend/ into a recesso-digitale/ folder in your theme (for example wp-content/themes/your-child-theme/recesso-digitale/lookup.php) and edit it there; the plugin uses your copy automatically. A template copied before 0.8.0 keeps its own hardcoded wording and will ignore the settings above — re-copy it if you want both.

Can I change the colour of the withdrawal button?

Yes, under WooCommerce → Order Withdrawal: settings → Withdrawal page appearance. Pick any colour and the plugin works out the hover shade and the label colour from it, so the label keeps a WCAG AA contrast ratio whatever you choose. Leave it empty for the bundled colour. If your theme styles its buttons the way you want them everywhere, choose "Inherit my theme's button style" instead and the plugin stops styling them at all. The «recedere dal contratto qui» link in My Account and in your order emails is not affected: it sits inside your theme's own pages and has always used your theme's button style.

Can I turn individual emails on and off?

Yes, in WooCommerce → Settings → Emails, where all five of this plugin's emails are listed alongside your store's own: the acknowledgement, the withdrawal link, the rejection, the status update and the notification to you. Each has its own enable switch, subject and heading there, and the wording of the status emails is set on the plugin's own settings screen. Two of them ignore the switch and are always sent, and each says so in its description on that screen. The acknowledgement of receipt is the one message the law obliges you to send, and the withdrawal link is the only reply to a link a customer explicitly asked for — a guest has no account to fall back on, so switching it off would turn the lookup form into a dead end that still says a link was sent.

A customer says they never received the withdrawal link. What should I check?

First, the order lookup screen only ever sends the link to the address stored on the order, never to the address typed into the form. If those differ — a mistyped address at checkout, say — no link can arrive. Attempts that matched no order are listed under Recent unmatched lookups at the bottom of the withdrawal requests screen, with the reference and a masked address, so a typo usually shows up there. Correct the email on the order and send the customer the link from the order itself. Second, check whether the customer is being told a link was sent when it was not: the screen answers identically whether or not an order matched, on purpose, so that nobody can discover which order numbers exist by trying them. That is why the unmatched lookups list is worth a glance after a customer reports silence.

A customer cannot withdraw because of the order status. What can I do?

Withdrawal is offered from the order statuses you tick under Order Withdrawal: settings → Eligible order statuses, which are Processing and Completed unless you change them. An order in another status — an unpaid bank transfer sitting On hold, for example — is refused with "This order cannot be withdrawn in its current state". Tick that status if you want those orders to be withdrawable. The order-status check runs before everything else, including the advisory deadline mode, so "Advisory — always available" does not override it. One caveat if you are in strict mode with the window starting at delivery: an order that has not been completed has no delivery date, so it would then be refused with "The withdrawal period has not started yet" instead. Under Order lookup screen you can also add your own sentence and a contact link below any of these refusals, so the customer is not left at a dead end.

I sell both goods and services. Can each have its own withdrawal deadline?

Yes. The law counts the period from delivery for goods and from the conclusion of the contract for services and for digital content not supplied on a physical medium. Set the store-wide default under Order Withdrawal: settings → Calculate deadline from, then use "Withdrawal period starts from" on any product, or on a whole category, that differs. A store selling T-shirts and football-school enrolments, for example, keeps the default on delivery and sets the enrolments' category to "Purchase". An order containing both gives each item its own deadline, and the withdrawal form shows each item's date next to it. In strict mode an item whose period has ended can no longer be selected, while the rest of the order stays withdrawable. WooCommerce does not record delivery, so "delivery" means the date the order was marked Completed: complete orders when they are delivered, or the deadline shown will run from the wrong day. Which of your products are services, and whether a dated activity is excluded from withdrawal altogether, are legal questions about your catalogue: have them checked by a lawyer.

Does it work with WPML or Polylang?

Yes. Set the withdrawal status and "Withdrawal period starts from" on the product or category in your main language, and every translation follows it. If an exception genuinely differs in one market, set a different value on that translation and it takes precedence there; the editor of a translation that inherits shows which value it is inheriting. The texts on the settings screen are translatable through WPML String Translation and Polylang too.

Why does the customer receive a link instead of sending the request straight away?

Because the withdrawal function must work for guest-checkout customers, who have no account to log into. If the lookup screen simply accepted "order number plus email" and recorded a withdrawal, anyone could file withdrawals against orders that are not theirs, and could discover which order numbers exist by trying them. That matters more here than on an ordinary form: the moment a withdrawal is confirmed is a legal fact — the date from which your refund deadline runs — so a request you cannot attribute is a bad record, not just a nuisance. So the plugin checks that the order number and the email match, then emails a cryptographically signed, expiring link to the address on the order itself, never to the address typed in the form. Opening that link proves the person has the order's mailbox, and the request is bound to a verified order. The screen answers identically whether or not an order matched, so it reveals nothing. Customers who arrive from the link in their order emails, or from the My Account tab, already hold a signed link and never see this step.

更新日志:

0.9.0 A store selling both goods and services can now count each one's withdrawal period from the right moment, and a multilingual store's translations finally follow the withdrawal settings of the product they translate. 0.8.1 A customer pasting their order number the way WooCommerce prints it could never get a withdrawal link, and was never told why. 0.8.0 The withdrawal page is now yours to word and to colour, without touching code or waiting for a translation. 0.7.0 Customers can now follow their withdrawal requests from their account, and a withdrawal page that has been deleted or unpublished no longer fails silently. 0.6.1 Superseded by 0.7.0, which contains these fixes. Never released separately. Two links in the requests screen were built with a helper that HTML-escapes the URL it returns. That is correct when printing a link into a page, and wrong for a URL handed to the admin app as data and set straight onto a button: the browser then sent amp;request instead of request, so the server never saw the parameters and refused. Both are fixed, and both are now covered by tests that fail against the old form. These are the only two places where the plugin builds a URL server-side and hands it to JavaScript. 0.6.0 0.5.10 0.5.9 0.5.5 0.5.4 0.5.3 0.5.2 0.5.1 0.5.0 0.4.0 0.3.1 0.3.0 0.2.0 0.1.0