| @@ -4,9 +4,9 @@ | ||
| 4 | 4 | Tags: contact form 7, double opt-in, gdpr, email verification |
| 5 | 5 | Requires at least: 6.0 |
| 6 | 6 | Tested up to: 7.0 |
| 7 | 7 | Requires PHP: 7.4 |
| 8 | -Stable tag: 5.3.2 | |
| 8 | +Stable tag: 5.6.3 | |
| 9 | 9 | License: GPLv3 |
| 10 | 10 | License URI: http://www.gnu.org/licenses/gpl-3.0.html |
| 11 | 11 | |
| 12 | 12 | **Protect your Contact Form 7 forms with GDPR-compliant Double Opt-In.** |
| @@ -63,9 +63,9 @@ | ||
| 63 | 63 | * **Category System** -- organize opt-ins into categories for better management |
| 64 | 64 | * **Pagination & Search** -- search and filter opt-in records in the admin dashboard |
| 65 | 65 | * **Admin Tooltips** -- contextual help tooltips throughout the admin interface |
| 66 | 66 | * **WordPress Multisite** -- network-wide activation creates tables on all sites automatically |
| 67 | -* **Developer Hooks** -- 29 action hooks, 63 filters, and 11 typed events for full extensibility | |
| 67 | +* **Developer Hooks** -- 44 action hooks, 72 filters, and 11 typed events for full extensibility | |
| 68 | 68 | |
| 69 | 69 | = Pro Features = |
| 70 | 70 | |
| 71 | 71 | Unlock the full potential of Double Opt-In with the [Pro version](https://www.forge12.com): |
| @@ -193,9 +193,9 @@ | ||
| 193 | 193 | The free version requires at least one supported form plugin. However, developers can register custom form integrations using the `f12_cf7_doubleoptin_register_integrations` action hook. See the developer documentation for details. |
| 194 | 194 | |
| 195 | 195 | = Where can I find the developer documentation? = |
| 196 | 196 | |
| 197 | -The complete hook, filter, and event reference is available at `docs/hooks-and-events.md` inside the plugin directory. It covers all 18 action hooks, 23 filters, and 11 typed events with code examples. | |
| 197 | +A hook, filter, and event reference with code examples ships at `docs/hooks-and-events.md` inside the plugin directory. It documents 27 of the 44 action hooks, 22 of the 72 filters, and all 11 typed events — the ones extensions actually reach for. The rest are discoverable in the source; if you need one documented, ask and we will add it. | |
| 198 | 198 | |
| 199 | 199 | = How do I report a bug or request a feature? = |
| 200 | 200 | |
| 201 | 201 | Please visit [forge12.com](https://www.forge12.com) or contact us via the WordPress support forum. |
| @@ -239,8 +239,26 @@ | ||
| 239 | 239 | licensed under the SIL Open Font License 1.1 (see licenses/inter-OFL-1.1.txt). |
| 240 | 240 | |
| 241 | 241 | == Upgrade Notice == |
| 242 | 242 | |
| 243 | += 5.6.3 = | |
| 244 | +Ships the hook and Addon API reference the readme refers to. No functional changes. | |
| 245 | + | |
| 246 | += 5.6.2 = | |
| 247 | +Visitors who forget the consent checkbox now see why their sign-up was not accepted, instead of a success message. No settings or data change. | |
| 248 | + | |
| 249 | += 5.6.1 = | |
| 250 | +Fixes a blank or partly loaded Double Opt-In admin on sites with Avada and other themes or plugins that use the Underscore/Lodash library. No settings or data change. | |
| 251 | + | |
| 252 | += 5.6.0 = | |
| 253 | +Security release — update recommended. Also records every action that runs after the confirmation click, retries temporary failures automatically and shows the result on each opt-in. Adds one database table, created automatically on update. If you use the Elementor, Avada, WPForms or Gravity Forms add-ons, update them after this release. | |
| 254 | + | |
| 255 | += 5.5.0 = | |
| 256 | +Recommended if you ever ran a Double Opt-In Pro older than 4.0. Such a plugin, left installed next to the current modules, made WordPress fail with a critical error that also locked you out of the admin. This release keeps the site reachable in that situation and adds two Site Health checks that name the problem and repair it in one click. Nothing is deleted from your server, and no schema changes. | |
| 257 | + | |
| 258 | += 5.4.0 = | |
| 259 | +Changes how submissions are handled on forms where you selected an acceptance field. That checkbox is now required at submit time on every form system, including those where it was previously only recorded — a submission that does not confirm it is rejected. Forms whose acceptance field no longer exists keep accepting submissions and are reported under Tools > Site Health instead, so a settings mistake cannot take your registrations offline. No schema changes. | |
| 260 | + | |
| 243 | 261 | = 5.3.1 = |
| 244 | 262 | Fixes the opt-out link in your emails. The opt-out page you selected was being discarded when settings were read, so `[doubleoptoutlink]` sent recipients to your front page instead of your consent centre. Unsubscribing still worked, but people never saw their overview. Recommended for everyone, no schema changes. |
| 245 | 263 | |
| 246 | 264 | = 5.3.0 = |
| @@ -317,8 +335,63 @@ | ||
| 317 | 335 | = 3.1.0 = |
| 318 | 336 | Adds optional anonymous telemetry (opt-out). No breaking changes. |
| 319 | 337 | |
| 320 | 338 | == Changelog == |
| 339 | + | |
| 340 | += 5.6.3 = | |
| 341 | + | |
| 342 | +* Fix: the developer reference this readme points to — `docs/hooks-and-events.md` and `docs/addon-api.md` — was never actually included in the plugin. Both files now ship. | |
| 343 | +* Improved: the notice for major updates on the Plugins screen no longer starts with an emoji; it already sits in a warning box. | |
| 344 | + | |
| 345 | += 5.6.2 = | |
| 346 | + | |
| 347 | +**A refused consent no longer looks like a successful sign-up** | |
| 348 | + | |
| 349 | +* Fix: when a visitor left the consent checkbox unticked, Contact Form 7 still showed "Thank you for your message. It has been sent." and emptied the form. The actual reason appeared only in a small notice that disappeared after ten seconds — so the visitor believed they were subscribed and waited for a confirmation mail that never came. The form now stops with "You must agree to the consent statement to continue." and keeps everything the visitor typed; they only have to tick the box. | |
| 350 | +* Fix: the same on Elementor, WPForms and Gravity Forms forms — the consent checkbox is now marked the way a missed required field is, and the form stays on the page with the visitor's input. This needs the Elementor add-on 1.2.1, the WPForms add-on 1.1.1 and the Gravity Forms add-on 1.1.1. With older add-ons the success message is at least hidden and the notice stays until the visitor closes it. | |
| 351 | +* Developer: new `AbstractFormIntegration::refusedConsentBeforeSubmit()` for integrations whose submit hook runs after the form plugin has accepted the submission (Core API 4.5.0, additive). | |
| 352 | +* Note: this applies to the consent checkbox only. Other refusals (rate limits, blocked domains, …) keep their current behaviour and can be shown in the form with the filter `f12_cf7_doubleoptin_show_validation_error`, which now also receives the error and the form ID. | |
| 353 | + | |
| 354 | += 5.6.1 = | |
| 355 | + | |
| 356 | +**The admin no longer stays blank next to Avada and similar plugins** | |
| 357 | + | |
| 358 | +* Fix: on some sites the Double Opt-In admin stayed blank or loaded only partly after 5.6.0, depending on the browser, with "clearTimeout is not a function" in the browser console. The admin script accidentally registered an internal helper under the global name `_`, which WordPress and many themes and plugins (Avada among them) use for the Underscore/Lodash library. Whichever loaded last won. The admin script now keeps all of its names to itself, and it no longer replaces WordPress' own `_` either. | |
| 359 | + | |
| 360 | += 5.6.0 = | |
| 361 | + | |
| 362 | +**What happens after the confirmation click is now recorded, retried and visible** | |
| 363 | + | |
| 364 | +* Security: a crafted request could switch off the double opt-in for a single submission, so the form's follow-up actions ran without a confirmed address. This is closed for all form systems. Update recommended. | |
| 365 | +* New: every action that runs after a subscriber confirms — the form's notification mail, the stored entry, and for Elementor each "Actions After Submit" step — is now recorded individually with its outcome. The opt-in detail page shows them in a new "Follow-up actions" panel. | |
| 366 | +* New: an action that fails for a temporary reason (mail server unreachable, timeout) is retried automatically after 1, 5 and 30 minutes. Actions that already succeeded are never run again, so a retry does not send a second mail or write a second entry. An action whose outcome is unclear (the connection broke after the request was sent) is not retried automatically; the panel says so and asks before you retry it by hand. | |
| 367 | +* New: a "Retry failed actions" button on the opt-in detail page, and a "Follow-ups need attention" filter in the opt-in list. A manual retry starts a fresh set of automatic attempts. | |
| 368 | +* New: a Site Health check when follow-up actions keep failing, and entries in the audit log for every attempt. | |
| 369 | +* Fix: on Elementor forms the actions after the confirmation could be cut short by a CAPTCHA or honeypot field that was checked a second time, long after the visitor had passed it. | |
| 370 | +* Fix: a second click on the confirmation link no longer runs the follow-up actions again. | |
| 371 | +* Fix: with debug logging switched on, the log files could be downloaded from the uploads folder. The folder is now protected and the files carry names that cannot be guessed; existing log files are renamed on the next request. | |
| 372 | +* Developer: new filter `f12_doi_follow_up_backoff` and adapter interface for form integrations; Core API 4.4.0 (additive, no breaking change). | |
| 373 | + | |
| 374 | += 5.5.0 = | |
| 375 | + | |
| 376 | +**An old Pro plugin no longer takes the site down with it** | |
| 377 | + | |
| 378 | +* Fix: with a Double Opt-In Pro older than 4.0 installed next to the current modules, WordPress failed with "There has been a critical error on this website" — including the admin, so the old plugin could not be deactivated, the licence page could not be opened, and even deleting it from the dashboard failed. The two products declare some program parts under the same names; the compatibility loader now skips the duplicate instead of loading it a second time. The site stays reachable, and one of the two copies is simply not run. | |
| 379 | +* New: a Site Health check naming the outdated Pro plugin, its folder and its version, with a one-click "Deactivate the old plugin now". It also appears on the dashboard and the plugins screen, where the problem is usually noticed. | |
| 380 | +* New: a Site Health check for leftover Pro setup markers. Pro records that it has migrated its licence and installed its modules, and those records survive uninstalling it — so a fresh installation used to find them and skip both steps: no licence, no modules, and the "Install" button on the Add-ons screen failing with a routing error. One click clears them; your licence key and all form settings are left alone. | |
| 381 | +* Note: neither repair deletes anything from your server. Removing the old plugin's folder stays a manual step over FTP or SSH on purpose — that version's uninstall routine drops the opt-out database table, and the WordPress delete button would run it. | |
| 382 | +* Fix: the "required field" labels in the admin appeared in English on German and French sites, along with 17 other untranslated strings. | |
| 383 | +* Improved: the hook reference shipped with the plugin now documents the consent-gate hooks and matches the hooks that actually exist. | |
| 384 | + | |
| 385 | += 5.4.0 = | |
| 386 | + | |
| 387 | +**The consent checkbox is now enforced everywhere** | |
| 388 | + | |
| 389 | +* Fix: a consent checkbox configured for an Elementor form was recorded but never required. The visitor could submit without ticking it, and the opt-in was stored with your consent text as proof of an agreement nobody had given. The same gap applied to Contact Form 7 and Avada forms running through the older compatibility path. Every form system now enforces the checkbox at submit time, and a submission without it is rejected with "You must agree to the consent statement to continue." | |
| 390 | +* Change: if the acceptance field you configured is **not on the form any more** — renamed or deleted in your form builder — the submission is no longer rejected. It is accepted, and the mismatch is reported under Tools > Site Health instead. A settings mistake should not take your registrations offline, which is what used to happen: the form silently stopped accepting anyone and nothing said why. | |
| 391 | +* New: a Site Health check listing every form whose acceptance field no longer exists, naming the form and the field. Until now nothing pointed this out unless you happened to open that particular form's settings. | |
| 392 | +* New: filter `f12_doi_enforce_consent_gate` to switch the rejection off for a single form, and action `f12_doi_consent_field_unknown` to react to the mismatch yourself. | |
| 393 | +* Improved: the warning on the form settings tab now says what actually happens — submissions go through, but without provable consent — instead of promising a rejection. It is also translated again; since 5.3.2 that warning had been showing in English on German and French sites. | |
| 321 | 394 | |
| 322 | 395 | = 5.3.2 = |
| 323 | 396 | |
| 324 | 397 | * Fix: opt-ins collected through an Elementor form always showed "User acknowledged: no" in the consent audit, even when the visitor had ticked the consent checkbox. Elementor stores its submitted fields differently from the other integrations and the audit view did not know that layout, so it looked in the wrong place. It now reads every integration's layout, and existing records show their acknowledgment correctly without anything having to be re-saved. |