| 开发者 |
draison
recessodigitale |
|---|---|
| 更新时间 | 2026年10月16日 23:15 |
| PHP版本: | 8.2 及以上 |
| WordPress版本: | 7.1 |
| 版权: | GPLv2 or later |
| 版权网址: | 版权信息 |
/wp-content/plugins/ directory, or install it through the WordPress
plugins screen.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.
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.
No. The two-step flow is server-rendered and works with JavaScript disabled; JavaScript only enhances the admin experience.
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.
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.
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.
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.
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.
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.
No. It functions fully offline and loads no third-party scripts, fonts or assets.
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.
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.
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.
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.
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.
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.
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.
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.
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.
recesso_dig_original_product_id and recesso_dig_original_category_id, let another multilingual plugin declare a translation's original. The admin request detail returns item_periods. The eligibility REST endpoint returns line_windows, each item's own period. The existing window_starts_at and window_ends_at now summarise the items — earliest start, latest end, and no end while an item's period has not started. On an order whose items share one period, which is every order until you use the new setting, they are unchanged.# — which is exactly how WooCommerce shows it in the confirmation email a customer copies from. Because the screen answers identically whether or not an order matched (so nobody can discover which order numbers exist), the customer was told a link had been sent and then waited for one that was never going to arrive. Order numbers now also survive a stray space and a difference in leading zeros. Present since the lookup screen was introduced in 0.5.0. Two references that are genuinely different orders still do not match.'. The four trader fields also had no description at all, and the phone field showed nothing greyed with no explanation of why.recesso_dig_consent_render_hook and
recesso_dig_consent_render_priority move the checkboxes on the classic checkout (an empty hook
suppresses the render), recesso_dig_consent_applies decides per cart whether each consent is
asked for, and recesso_dig_consent_required makes either one blocking or optional. All hooks are
now documented under "Hooks for developers" below.amp;request instead of request, so the server
never saw the parameters and refused. Both are fixed and covered by tests that fail against the old
form.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.
[recesso_digitale_link] shortcode (attributes: text, class) for footers, widgets and
menus, and [recesso_digitale_avviso_esclusione] for product templates built with a page builder
(Divi, Elementor, Bricks and similar) whose layouts do not fire the usual WooCommerce hook.{withdrawal_page_link}
placeholder.manage_woocommerce while the requests list
required the plugin's own capability. All three now use the plugin capability, which the new roles
setting controls.consumer_declaration), applied automatically. Receipts issued
before this release keep verifying against their stored hash — the receipt payload is versioned,
and a request without a self-declaration hashes exactly as it did before.assets/) and
the build manifests (package.json, package-lock.json) alongside the compiled build/
assets, and the readme documents how to rebuild them and links the public development repository.edit_product capability explicitly.