Skip to content

Development ​

The source is on GitHub. Read CONTRIBUTING.md before opening a pull request.

Setup ​

bash
composer install
npm install && npm run build
bin/setup-dev.sh

setup-dev.sh installs WordPress on SQLite in .dev/wp, with no Docker or MySQL needed. It links the plugin and adds demo fields. The admin login is saved to .dev/credentials.

bash
wp --path=.dev/wp server --port=8889

Tests and linting ​

bash
composer test
composer lint
npm run lint:js

Tests run PHPUnit against a real WordPress with a throwaway database.

Performance ​

These numbers come from bin/benchmark.php: 100 fields plus a repeater with 1,000 rows × 3 sub fields, on the SQLite emulation of the dev environment. MySQL writes faster.

OperationTimeQueries
Save 1,000 new rows2.6 s6,003 (1 INSERT per value)
Save again, nothing changed26 ms1
Change 2 values24 ms5
get_fields() with a cold cache39 ms1
have_rows() over 1,000 rows with 3 get_sub_field()45 ms1
Render a meta box with 1,000 rows110 ms, 2.4 MB of HTML1

To run the benchmark after composer test:

bash
WPFF_DB_FILE=wpff-tests.sqlite wp --path=.dev/wp eval-file bin/benchmark.php

Translations ​

The template is languages/freeform-fields.pot. A Russian translation ships with the plugin: freeform-fields-ru_RU.po, .mo, and JSON files for scripts.

After you change strings:

  1. Run npm run build && npm run i18n.
  2. Translate the new strings in the .po file.
  3. Run npm run i18n again.

Credits ​

  • Map editor: Leaflet (BSD-2-Clause). Map data © OpenStreetMap contributors (ODbL).
  • Builder drag and drop: dnd kit (MIT).
  • Thanks to the authors of Advanced Custom Fields for the conventions this plugin is compatible with.

License ​

GPL-2.0-or-later. Copyright © 2026 kiberberik and WP Freeform Fields contributors.

GPL-2.0-or-later. Not affiliated with ACF or WP Engine.