jPlugin Formbuilder
Secure, theme-adaptive forms with a visual builder, private uploads, Cloudflare Turnstile, and a standalone submission inbox.
by Jirath · github.com/jbrathz/jplugin-formbuilder · website
Install
No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:
wp plugin install https://github.com/jbrathz/jplugin-formbuilder/archive/refs/heads/main.zipReadme
=== jPlugin Formbuilder === Contributors: jirath Tags: forms, contact form, survey, turnstile, private upload Requires at least: 6.6 Tested up to: 7.0 Requires PHP: 8.1 Stable tag: 1.0.18 License: GPLv2 or later
Secure, theme-adaptive WordPress forms with a visual builder, private uploads, Cloudflare Turnstile, and a standalone submission inbox.
== Description ==
jPlugin Formbuilder stores form definitions and responses in dedicated plugin tables. Public file uploads are kept out of the WordPress Media Library and are downloaded through a capability-protected endpoint.
Features:
- Visual single-page form builder with accessible field ordering controls.
- Contact, opinion survey, satisfaction, and event registration templates.
- Dynamic Gutenberg block and
[jplugin_form id="UUID"]shortcode. - Cloudflare Turnstile, honeypot, timing checks, and hashed-IP rate limiting.
- Private uploads with MIME/content checks and a direct-access Site Health test.
- Filterable, paginated submission inbox with date- and form-scoped CSV export.
- Retention, trash, secure download, and email notification.
- Theme-adaptive CSS variables and per-form color palette.
== Installation ==
- Copy this directory to
wp-content/plugins/jPlugin-Formbuilder. - Activate jPlugin Formbuilder.
- Open Formbuilder > Settings and configure Turnstile and appearance.
- Create a form from a template, review the fields, and publish it.
- Insert the jPlugin Form block or use the shortcode displayed by the form UUID.
For stronger private storage, define an absolute path outside the public document root:
define( 'JFB_PRIVATE_UPLOAD_DIR', '/secure/persistent/path/jfb-private' );
The directory must be writable by PHP and persistent across deployments.
== Security Notes ==
- Turnstile secrets can be set with
JFB_TURNSTILE_SITE_KEYandJFB_TURNSTILE_SECRET_KEY; constants override database values. - Do not expose the origin server around Cloudflare. The plugin trusts
CF-Connecting-IPonly when the immediate peer matches cached Cloudflare CIDR ranges. - Plugin rate limiting runs after the request reaches PHP and does not replace Cloudflare WAF or edge rate limiting.
- Public uploads reject SVG, HTML, executable files, archives, double extensions, MIME mismatches, and files above the configured limit.
== Uninstall and Manual Data Cleanup ==
Uninstall is intentionally non-destructive. Deleting the plugin does NOT delete forms, submissions, settings, rate-limit data, or private files.
After confirming that backups are complete, a database administrator may manually remove these tables (replace wp_ with the site's real prefix):
wp_jfb_formswp_jfb_submissionswp_jfb_submission_fileswp_jfb_rate_limits
The following WordPress options/transients may also be removed:
jfb_settingsjfb_schema_version_transient_jfb_cf_rangesand its timeout_transient_jfb_vault_probeand its timeout
Private files are stored in JFB_PRIVATE_UPLOAD_DIR when defined, otherwise in wp-content/jfb-private. Remove this directory manually only after confirming that retained submissions no longer need their files.
== Changelog ==
= 1.0.18 =
- Added form and date-range filters to the submission inbox, defaulting to the current month.
- Added 20-item pagination and CSV exports scoped to the selected filters.
= 1.0.0 =
- Initial secure standalone release.