4.3.0
Stable release. Marks the end of the v4.3 beta cycle (beta1 → beta6).
Polls — full rework
Tabbed editor (Question / Settings / Schedule / Embed / Results), drag-to-reorder options, “Other” write-in toggle, Duplicate row action.
Vote integrity rewrite: every vote stores a voter_hash (poll + IP + UA + cookie + user) and dedupe queries that one column regardless of mode. Cookie set on render with SameSite=Lax; Secure, persists across AJAX. vote_limit=user rejects anonymous voters at submit. Honeypot on by default, per-IP rate limiter (12/minute).
Scheduling (start date + hourly cf_poll_auto_close cron), change-vote window, Gutenberg block (core-forms/poll) with picker + display-mode, opt-in live results (15s, pauses on hidden tab), bar / columns / percent result styles, container-query-driven adaptive layout, REST API (/cf/v1/polls, /polls/{id}/results public, /polls/{id}/analytics auth), per-poll analytics screen + CSV export.
Accessibility: <fieldset><legend>, role="progressbar" with aria-valuenow, role="status" aria-live="polite", focus moves to result heading on submit, prefers-reduced-motion honored. jQuery removed from poll JS.
Schema migration (cf_db_version → 4.3.0) is additive with backfill so historical dedupe keeps working.
Importers — three new sources
- Gravity Forms —
GFAPI-driven, ~14 field types, notifications → Email actions with per-recipient conditions, confirmations → success message / redirect, conditional logic →data-show-if/data-hide-if. Field IDs resolve through a per-form name map so condition references stay valid. - WPForms (Lite + Pro) — Decodes the form JSON, maps notifications, optional entry import from
wp_wpforms_entries(Pro) intowp_cf_submissionsso admin history survives the cutover. - Fluent Forms — Reads
wp_fluentform_forms+wp_fluentform_form_metadirectly (no plugin dependency), maps fields, notifications, webhooks, and conditional logic.
All three plug into the existing Core Forms → Import page via a new cf_import_sources filter + cf_import_render_section action exposed by CF7Migration, with shared helpers in a BaseMigration abstract class.
Send Email — conditional emails (per recipient)
New “Recipient routes” repeater on the Send Email action. Each route has a field + operator + value + recipient address; the first matching route’s recipient overrides the default To. The existing action-level conditions block keeps working — that gates whether the action runs at all; routes only re-target where it sends.
Forms list
Fix for the Duplicate row action: it used to drop the user into the editor for the original form because the URL carries a form_id and the overview page short-circuited into the editor before the list table’s single-row handler could run.
Build & CI
ESLint inheritance cleared (~80 prettier autofixes + targeted eqeqeq / no-unsafe-wp-apis / no-noninteractive-element-interactions fixes); PHPStan baseline regenerated at level 5; PHP 8.1 / 8.2 / 8.3 unit tests green.
Upgrade notes
- Migration is automatic on next admin pageload (or on plugin update via
upgrader_process_complete). - New WP-Cron hook
cf_poll_auto_closeis scheduled hourly; unscheduled on deactivation. - New post meta keys for importer provenance:
_cf_gf_source_id,_cf_wpforms_source_id,_cf_fluent_source_id— useful for debugging or re-import workflows.