• v0.2.0 7b48ee5a27

    UltimateByte released this 2026-05-21 03:06:05 +02:00 | 96 commits to main since this release

    First 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.php hooks pre_set_site_transient_update_plugins + plugins_api to 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. Mirrors wp-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=submissions and ?page=lrob-etk&view=data) — no separate submenu, no CSS-hide. Replaces the add_submenu_page + remove_submenu_page pattern which broke direct-URL access on a 403 (get_admin_page_cap() walks $submenu for the cap lookup).
    • French translations filled in for all the new strings.

    Upgrade

    Drop-in. The Contact Form schema gains an additive ip_address column (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