-
released this
2026-05-21 03:06:05 +02:00 | 96 commits to main since this releaseFirst release with self-hosted plugin updates: install once, get future versions through the WordPress Updates page like any other plugin.
This release also closes out the Contact Form story with a full submissions inbox, privacy/retention controls, and the cascade-delete modal.
Headline
- Self-hosted GitHub-release updates.
src/AutoUpdate/Updater.phphookspre_set_site_transient_update_plugins+plugins_apito surface new releases of this plugin as standard WordPress updates. 1-hour cache, with the cache bypassed when the admin is on the Updates page or clicks "Check again" — so explicit update checks always hit GitHub directly. Mirrorswp-lrob-calendar's pattern.
Contact Form submissions inbox
- Inbox view at Contact Forms → "View submissions" — filter by form / status (delivered / received / spam-blocked / failed) / captcha outcome / date range / free text. Read-only detail view with humanized field labels and a collapsed technical metadata section (IP, UA, referer, log link).
- Cross-links both ways with Email Logs. Log rows whose source is a contact form now expose a "View submission" icon; submission detail links back to the outbound email log.
- Form card stat pill ("N received · M blocked →") and a global stats panel at the bottom of the Forms page.
- Dashboard tiles: Delivered (30d) and Spam blocked (30d), the latter split into honeypot vs captcha.
Privacy & retention (new "Storage" header button)
- Save submissions toggle — global default + per-form tri-state override. When off, the notification email still goes out; captcha and honeypot still run; no row is written and the form drops out of the inbox.
- IP storage — hashed by default for privacy/GDPR friendliness, with an opt-in "Store raw IP" mode for sites that need it for abuse investigation.
- Retention — separate windows for delivered submissions (default: forever) and spam-blocked rows (default: 90 days). Daily cron purges older rows.
- Form delete cascade modal — replaces the bare confirm() with three explicit choices: cancel / delete form only (orphaned submissions stay in the inbox labelled "Deleted form #N") / delete form + N submissions.
Captcha analytics
- Per-route counters.
CaptchaService::verify()upserts a small(day, route_key, outcome)stats table on every check. Surfaces as 30-day "blocked · passed" pills next to each challenge and identity on the Captcha settings page.
Architecture
- View-routing for hidden admin pages. Both the Submissions inbox and the Plugin Data page are now sub-views of their natural parent (
?page=lrob-etk-cform&view=submissionsand?page=lrob-etk&view=data) — no separate submenu, no CSS-hide. Replaces theadd_submenu_page+remove_submenu_pagepattern which broke direct-URL access on a 403 (get_admin_page_cap()walks$submenufor the cap lookup). - French translations filled in for all the new strings.
Upgrade
Drop-in. The Contact Form schema gains an additive
ip_addresscolumn (default empty string — privacy-first); existing rows untouched. Captcha schema gains a small aggregate stats table. Both migrations are idempotent dbDelta + safe to roll back.If you're using the toolkit in production, this is the first release where you can stop manually re-uploading the zip — the next bump will arrive through Dashboard → Updates.
Downloads
-
Source code (ZIP)
0 downloads
-
Source code (TAR.GZ)
0 downloads
- Self-hosted GitHub-release updates.