Veldform is built around registries, field types, actions, payment gateways and captcha providers all share the same registration pattern, and your additions are treated exactly like the built-in ones. All hooks are prefixed veldform/.
Registering your own
Registries are built on init (priority 5), so hook at the default priority or later.
Field type
add_action( 'veldform/register_fields', function ( $fields ) {
$fields->register( new MyField() ); // implements Veldform\Fields\FieldType
} );
A field type declares its label, schema (the options shown in the builder), sanitization, validation and rendering. Once registered, it shows up in the builder palette automatically, and becomes available to the AI form builder too.
Action
add_action( 'veldform/register_actions', function ( $actions ) {
$actions->register( new MyAction() ); // implements Veldform\Actions\Action
} );
An action declares its config schema and a run( $context, $config ) method. Whatever run() returns is merged into the outputs, so later actions and the confirmation can use it as {{ output.your_key }}.
Payment gateway
add_action( 'veldform/register_gateways', function ( $gateways ) {
$gateways->register( new MyGateway() ); // implements Veldform\Payments\PaymentGateway
} );
Captcha provider
add_filter( 'veldform/register_captcha', function ( array $providers ) {
$provider = new MyCaptcha(); // implements Veldform\Captcha\CaptchaProvider
$providers[ $provider->id() ] = $provider;
return $providers;
} );
Other registration hooks
| Hook |
Type |
Description |
veldform/form_templates |
filter |
Add starter templates to the "New form" modal |
veldform/connection_presets |
filter |
Add connection presets for your own service |
veldform/liquid/filters |
action |
Register custom Liquid filters, e.g. $t->registerFilter( 'upper', fn( $v ) => strtoupper( $v ) ); |
Submission
| Hook |
Type |
Description |
veldform/submit |
action |
Fires after a successful submission. Receives $form_id, $clean, $schema, $entry_id ($entry_id is 0 when entry storage is off) |
veldform/actions/context |
filter |
The context array passed to every action's run() |
veldform/submit/rate_limit |
filter |
Max submissions per device per minute (default 30, 0 disables) |
Rendering
| Hook |
Type |
Description |
veldform/render/control |
filter |
The bare control element of a field, receives $html, $field, $value, $ctx |
veldform/render/field |
filter |
The complete field block (wrapper, label, control, help, error) |
veldform/form/wrapper |
filter |
The full <form> HTML |
veldform/render/styles |
filter |
Return false to not enqueue the plugin stylesheet, receives $enabled, $form_id |
veldform/fields/countries |
filter |
The country list used by the address field |
For overriding field markup from your theme, see Customization.
Email
| Hook |
Type |
Description |
veldform/email/use_template |
filter |
Whether to wrap a notification in the HTML template |
veldform/email/logo |
filter |
The logo HTML in the template |
veldform/email/footer |
filter |
The footer HTML in the template |
veldform/email/html |
filter |
The final assembled email HTML |
| Hook |
Type |
Description |
veldform/liquid/filters |
action |
Register custom Liquid filters |
Payments
| Hook |
Type |
Description |
veldform/payment/{status} |
action |
Fires once per status change, e.g. veldform/payment/paid, veldform/payment/failed, veldform/payment/refunded. Receives the payment record |
veldform/payment/amount_minor |
filter |
The final charge amount in minor units (cents) |
veldform/payments/webhook_url |
filter |
The webhook URL passed to the provider |
veldform/payments/expire_hours |
filter |
Hours before an abandoned checkout is marked expired (default 24) |
Outgoing HTTP
These apply to all requests Veldform makes: the external API action, data providers and payment gateways.
| Hook |
Type |
Description |
veldform/http/before |
action |
Fires before a request, receives $url, $args |
veldform/http/after |
action |
Fires after a request, receives $url, $args, $response |
veldform/http/sslverify |
filter |
Whether SSL is verified (default true, except on local environments) |
veldform/http/allow_host |
filter |
Allow a specific host past the internal-address guard |
veldform/webhook/allow_internal |
filter |
Allow the external API action to reach internal/private hosts |
Other
| Hook |
Type |
Description |
veldform/captcha/recaptcha_min_score |
filter |
The reCAPTCHA v3 pass threshold (default 0.5) |
veldform/create_user/roles |
filter |
The selectable roles for the Create user action |
veldform/upload_dir |
filter |
Where uploaded entry files are stored |
veldform/ai/rate_limit |
filter |
AI requests per window (default 20) |
veldform/log/enabled |
filter |
Return false to disable logging, receives $enabled, $event, $level |
veldform/log/retention_days |
filter |
How long log entries are kept (default 30 days) |