You can now migrate forms between Gravity Forms and seven top form plugins (import and export), the interface has been fully redesigned, migrations can now run in the background, and exports can include uploaded files in the downloaded bundle. The release also includes security enhancements; we recommend updating to the latest version. Read the 2.0 release post.
🚀 Added
- Migrate forms between Gravity Forms and seven other form plugins, in both directions: Contact Form 7, Fluent Forms, Formidable Forms, Forminator, Ninja Forms, WPForms, and WS Form. Field types, labels, required fields, choices and their stored values, placeholders, default values, conditional logic, notifications and confirmations are all migrated where the destination supports them. Learn more about migrating from other forms.
- Anything the destination plugin cannot represent is reported on screen during the migration rather than dropped silently. Contact Form 7, for example, has no conditional logic, time field or password field, so those are named as they are converted;
- Background migrations. Imports and exports no longer need you to keep the tab open.
- Exports can carry the uploaded files inside them. This allows you to generate migration files from sites that are unreachable. Read about bundling files.
- Gravity Forms Signature Add-On files are now migrated with their entries.
✨ Improved
- Keyboard navigation and screen reader accessibility. The new interface features much-improved keyboard focus behavior and aria live announcements.
- The browser's Back and Forward buttons move through the wizard, and a step can be linked to or reloaded without losing your place.
- Settings are no longer carried across by default, and overwriting the destination's settings asks for confirmation first.
- Gravity Flow activity history now imports on destinations that do not have Gravity Flow installed yet.
🔒 Security
- Migrating forms now requires full administrator access. The wizard, the background jobs and the WP-CLI commands all now require the
manage_options capability.
- Improved file naming to prevent guessing file paths.
- Hardens access control on the migration endpoints.
- Secures how a migration file's contents are handled when they are written into the destination site, so a file from an untrusted source cannot modify the site.
- Refuses a file whose name hides a disallowed extension behind an allowed one, such as
photo.php.png, wherever a migration file names the files it carries.
🐛 Fixed
- Leaving the page during a migration your browser is running now frees the site immediately, instead of refusing the next import for two minutes with "an import is already in progress". If a run was interrupted some other way, the Confirm step says so and counts down, rather than letting you press Import and be turned away. Your uploaded file is kept either way.
- Reloading or closing the tab during a migration your browser is running now asks you to confirm first, and says so on the screen instead of describing every migration as running in the background. A migration that cannot be resumed no longer keeps asking on every later page, and a migration that was refused before it started is no longer offered for resume.
- Canceling an import that was running in the browser could leave "an import is already in progress" showing for two minutes if the server stopped the request while it was still deleting the uploaded file. The site is now free for a new import before the file is removed.
- A form submitted by a visitor during an import could conflict with the migration entry IDs.
- An export that was abandoned part way left its record of processed posts behind, so every later export silently left those pages and posts out while still reporting success.
- A Gravity Wiz Nested Forms field pointing at a form that was not in the migration file could halt the import.
- An export carried some settings that were not selected.
- An export could stop partway when a single uploaded file could not be read. That file is now left out of the migration file and named as left out after the export finishes.
💻 Developer Updates
- Added filters (see GravityMigrate filter docs):
gk/gravitymigrate/background/enabled turns background migrations off, or forces the browser-driven path.
gk/gravitymigrate/export/batch-size adjusts how much an export processes per step.
gk/gravitymigrate/cron/clear-import-interval and gk/gravitymigrate/cron/clear-export-interval change how long staged import files and finished exports are kept.
gk/gravitymigrate/import/signature/source-url modifies the URL a Signature Add-On image is fetched from during import.
gk/gravitymigrate/export/file-size-limit sets how many bytes of uploaded files an export packages inside the migration file. Files past the limit stay on the source site and are downloaded during the import.
gk/gravitymigrate/export/max-candidate-files caps how many uploaded files an export considers packaging (default: 20,000).
gk/gravitymigrate/import/packaged-file-types widens the file types an import will accept out of a migration file. It cannot widen what counts as safe: the disallowed extensions are not filterable.
- WP CLI adds
--include-files to the wp gk migrate export command to package the uploaded files inside the migration file. See the CLI docs.