A small, dependency-free contact-form plugin for WordPress — drop a form on any page, store every submission, and get notified by email.
inklura-forms is part of the Inklura suite. It gives you a contact form
via a shortcode (with a nonce + a hidden honeypot for spam), stores each submission as a per-blog
post you can review in wp-admin, and emails a notification to whoever you choose — routed through
bext managed email when the site is served behind bext, and falling back to wp_mail otherwise.
It works as a normal activatable plugin or as a must-use plugin, is multisite-safe, and requires no JavaScript on the front end.
| Module | What it does |
|---|---|
| Shortcode | [inklura_form] renders a contact form (name, email, subject, message) with a WordPress nonce + a hidden honeypot + a time-trap. [inklura_form id="123"] selects a specific form. |
| Custom fields | Each form can define its own fields — text, email, tel, url, number, textarea, select, checkbox, radio — with label, placeholder, required flag, and options. |
| Validation | Per-field server-side validation (format checks per type, required, in-list checks for select/radio/checkbox) with inline per-field error messages on re-render. |
| Forms | An inklura_form post type for defining additional forms, each with its own recipients, success/error messages, time-trap, AJAX toggle, and auto-reply. |
| Submissions | Every valid submission is stored as an inklura_submission post (per blog), reviewable on a read-only admin list with Form / Email / Date columns and a detail view. Export to CSV from the list (nonce + capability gated). |
Notifies one or more recipients, and can send an auto-reply to the submitter. Uses bext managed send (POST /__bext/sdk/email/send with X-Bext-App-Id: <host>) when available, otherwise wp_mail. Reply-To is set to the submitter. |
|
| Anti-spam | A hidden honeypot plus a time-trap (reject submissions faster than N seconds after render). |
| AJAX | Optional per-form AJAX submit as progressive enhancement — the form still works fully without JavaScript. |
| Settings | A per-blog Settings page: default recipient, default success + error messages, time-trap, enable/disable email. |
| Multisite | Per-blog submissions + settings, plus an optional network defaults page (Network Admin → Settings → Inklura Forms). |
| Auto-update | Self-hosted updates for normal-plugin installs — "update available" + one-click update from a manifest (must-use installs update out-of-band). |
Put the repository in wp-content/plugins/inklura-forms/ and activate Inklura Forms — or upload
the release ZIP from Plugins → Add New → Upload.
Copy the folder into wp-content/mu-plugins/inklura-forms/ and load inklura-forms.php from an
mu-plugin loader. (The self-updater disables itself for must-use installs.)
Add the shortcode to any page or post:
[inklura_form]
To create extra forms with their own fields, recipients, and messages, go to Inklura Forms → Add Form, configure it, then embed it:
[inklura_form id="123"]
Configure the defaults under Inklura Forms → Settings.
In the form editor, define fields one per line:
key | Label | type | required | option a, option b
Only key is required on a line. Types are text, email, tel, url,
number, textarea, select, checkbox, radio. The 4th column makes the
field required (required, yes, 1, true). The 5th column is a comma list
of options for select, radio, and checkbox (a checkbox with no options is
a single yes/no box). Lines starting with # are comments.
name | Your name | text | required
email | Email | email | required
phone | Phone | tel
topic | Topic | select | required | Sales, Support, Other
agree | I agree | checkbox | required
message | Message | textarea | required
Leave the field box blank to use the default contact fields (name, email, subject, message).
In the same form editor you can:
- list multiple notification recipients (comma-separated);
- set success and error messages;
- enable an auto-reply to the submitter with a subject + body that support
{site_name}and any{field_key}placeholder; - enable AJAX submit (progressive enhancement — works without JS too);
- set a per-form time-trap in seconds.
On Inklura Forms → Submissions, an Export CSV button (admin-only, nonce + capability gated) downloads every submission as a UTF-8 CSV.
Each form ships a hidden honeypot field (inklura_hp) and a time-trap: a
submission that arrives faster than the configured number of seconds after the
form was rendered is rejected. Bots that trip either are silently accepted (no
error shown) but nothing is stored or emailed. Every submission also carries a
WordPress nonce.
When the site is behind a bext server, notifications go out through bext's managed email:
POST http://127.0.0.1/__bext/sdk/email/send
X-Bext-App-Id: <site host>
Content-Type: application/json
{ "to": ["you@example.com"], "subject": "...", "text": "...", "reply_to": "visitor@example.com" }
If bext isn't reachable or can't send, the plugin transparently falls back to wp_mail.
for t in tests/unit/*.php; do php "$t"; done # WP-free unit tests
bin/build-zip.sh /tmp/inklura-forms.zip # build the installable ZIPCI lints on PHP 7.4 / 8.1 / 8.3 and runs the unit tests.
Inklura Forms is built and maintained with the support of:
- webdesign29 — web agency (Brest, France).
- Inklura — WordPress-compatible CMS & hosting.
Interested in sponsoring? Use the Sponsor button or open an issue.
GPL-2.0-or-later — see LICENSE.