Migrating from MW WP Form
Form Plant ships with a migration tool ( added in v1.2.0 ) that automatically converts forms built with MW WP Form into the Form Plant format. From the admin screen, you can batch-convert fields ( input items ) , email settings, input/confirmation screen templates, and mail tags in just a few clicks.
This page explains everything from how to use the migration tool to the mapping tables for fields, shortcodes, and hooks ( mwform_* ) , as well as the work you need to do manually after migrating.
What the migration tool does automatically and what you must do manually after migrating are clearly separated. Start with the What the migration tool converts ( and what it doesn't ) list to grasp the overall flow, and the rest of this page will be much easier to follow.
What the migration tool converts ( and what it doesn't )
| Category | Automatic / Manual |
|---|---|
| Input items ( fields ) , required settings, choices | ✅ Converted automatically by the migration tool |
| Admin email / auto-reply email settings ( recipient, subject, body ) | ✅ Converted automatically |
| Input / confirmation screen HTML templates | ✅ Converted automatically |
Mail tags ( {name} → {field:your_name} , etc. ) | ✅ Converted automatically |
| Validation ( required, email format, character count, etc. ) | ✅ Converted automatically |
Form embed shortcode ( [mwform_formkey] → [fplant id] ) | ⚠️ Replace manually |
mwform_* hooks in functions.php | ⚠️ Rewrite manually ( see below ) |
| Akismet spam settings | ⚠️ Not migratable ( set up reCAPTCHA / Turnstile separately ) |
The migration tool does not modify or delete your MW WP Form forms. It leaves the original forms untouched and adds the conversion result as a new Form Plant form. You can try it with peace of mind, but for the same reason the shortcodes on your pages are not switched over automatically ( manual replacement is required ).
Prerequisites
- MW WP Form must be installed and active. The migration tab is shown only while MW WP Form is active.
- MW WP Form must be version 5.0 or later. If it is below 5.0, the migration button is not shown and a message prompting you to update appears. Update MW WP Form to the latest version first.
- The operation requires the
manage_optionscapability ( administrator ) .
How to use the migration tool
1. Open the migration screen
- Open "Form Plant" → "Tools" in the WordPress admin screen
- Select the "MW WP Form Migration" tab
This tab is shown only while MW WP Form is active.
2. Select forms and migrate
The migration screen shows a list of your MW WP Form forms.
| Column | Content |
|---|---|
| ( checkbox ) | Select forms to migrate |
| Title | The MW WP Form form title |
| Fields | The number of detected fields |
| Migration Status | Migration status ( Migrated / Not migrated ) |
Steps:
- Check the boxes for the forms you want to migrate ( select-all is also available )
- Click the "Migrate selected forms" button
- Click OK in the confirmation dialog, and the selected forms are converted one at a time, in order
- The results are shown in the "Migration Report"
3. Review the migration report
The result for each form is shown in one of three states.
| Status | Meaning |
|---|---|
| Success | Migration completed without warnings |
| With warnings | Migration succeeded, but some items require manual attention ( please review ) |
| Failed | An error occurred and migration could not be completed |
Even for With warnings, the migration itself is complete. The warnings listed in the report are items the migration tool could not convert automatically — surfaced explicitly rather than silently dropped. Be sure to review them and take any necessary manual action.
From the report you can also open a link to the generated Form Plant form ( "Open the generated Form Plant form" ) .
Migrated forms are shown as Migrated in the list, and you can revisit the migration log ( migration date/time, status, list of warnings ) at any time later via "View log".
4. Review the migrated form
The Form Plant form created by migration is created in a published state with the standard ( normal ) design. The title includes the migration date/time, like (from MW WP Form 2026-06-02 10:00:00). Once you place its shortcode, it works as-is ( the "migrate first and it works" state ).
The MW WP Form layout is saved as an HTML template, but disabled ( OFF ) by default. If you want to get closer to the original layout, turn on "Use input screen HTML template" and "Use confirmation screen HTML template" under the "Layout" section of the form editing screen ( see "About the layout after migration" below for details ) .
In the form list, a colored status badge is shown next to each form's title ( published = green / private = orange / draft = gray ) .
Recommended checks right after migration:
- Open the generated Form Plant form and review the field structure, required settings, and choices
- Note the field names ( name ) ( you'll use them for hook rewrites and mail tags; Japanese names are converted to alphanumerics )
- Send a test submission and verify that the confirmation screen, auto-reply email, and admin email behave as intended
- Replace the shortcode on your pages with
[fplant id="..."]( next section )
Shortcode mapping for form placement
The shortcode that places a form in a post or page is not converted automatically by the migration tool. Replace it manually.
| MW WP Form | Form Plant |
|---|---|
[mwform_formkey key="123"] | [fplant id="12"] |
[mwform_formkey post_id="123"] | [fplant id="12"] |
The number in [fplant id="..."] is the form ID of the generated Form Plant form. You can find the form ID in the following places.
- The form editing screen URL: the
12inwp-admin/admin.php?page=fplant-form-new&id=12 - The embed shortcode
[fplant id="12"]shown in the form list
To find the posts or pages that contain [mwform_formkey], the most reliable approach is the admin search or a database search of post_content. If you miss a replacement, that page will keep displaying the MW WP Form form.
Field ( input item ) mapping table
The migration tool automatically converts MW WP Form form tags ( shortcodes ) into the corresponding Form Plant field types.
| MW WP Form form tag | Form Plant field type | Notes |
|---|---|---|
mwform_text | Text ( text ) | size / maxlength are carried over |
mwform_textarea | Textarea ( textarea ) | rows / cols / maxlength are carried over |
mwform_email | Email ( email ) | |
mwform_password | Password ( password ) | |
mwform_tel | Phone number ( tel ) | Converted to 3-part input ( split3 ) |
mwform_url | URL ( url ) | |
mwform_zip | Postal code ( postal_code ) | Converted to a 3+4 digit two-box input |
mwform_number | Number ( number ) | min / max are carried over |
mwform_range | Number ( number ) | ⚠️ The slider UI is not reproduced |
mwform_select | Select ( select ) | Choices are converted |
mwform_radio | Radio button ( radio ) | Choices and layout are converted |
mwform_checkbox | Checkbox ( checkbox ) | Choices, layout, and delimiter are converted |
mwform_hidden | Hidden field ( hidden ) | |
mwform_file | File ( file ) | |
mwform_image | File ( file ) | Restricted to image extensions ( jpg/jpeg/png/gif/webp ) |
mwform_datepicker | Date ( date ) | Format Y-m-d |
mwform_monthpicker | Date ( date ) | Format Y-m |
mwform_custom_mail_tag | Custom mail tag ( custom_mail_tag ) | see below |
Each field's name ( field name ) , label, placeholder, default value, id, and class are also carried over.
In MW WP Form you can use Japanese field names ( e.g. お名前 , メールアドレス ) , but Form Plant field names are alphanumeric keys. The migration tool automatically converts them to alphanumerics, e.g. お名前 → your_name , メールアドレス → email .
This conversion also affects the mail tags and hooks described below. After migrating, always check the new field names in the Form Plant editing screen.
Email settings mapping
MW WP Form's email settings are converted into Form Plant's admin email and auto-reply email respectively.
| MW WP Form | Form Plant |
|---|---|
Admin recipients ( mail_to / cc / bcc ) | Admin email recipient, CC, BCC |
| Admin email subject and body | Admin email subject and body |
Sender ( admin_mail_from , etc. ) and Reply-To | Sender name/address and Reply-To |
Auto-reply recipient field ( automatic_reply_email ) | Auto-reply email recipient field |
| Auto-reply subject, body, and sender | Auto-reply email subject, body, and sender |
Mail tag mapping
Mail tags written in the email body and subject are converted automatically too.
| MW WP Form | Form Plant | Conversion |
|---|---|---|
{お名前} ( Japanese field name ) | {field:your_name} | ✅ Converted automatically |
{email} ( alphanumeric field name ) | {email} | ✅ Kept as-is ( backward compatible ) |
MW-specific tags like {post_title} {post_id} {user_email} | — | ⚠️ Not convertible |
System tags Form Plant can resolve:
{all_fields} All submitted values
{form_title} Form title
{submission_id} Submission ID
{submission_date} Submission date/time
{ip_address} Submitter's IP address
{user_agent} User agent
{site_name} Site name
{site_url} Site URL
{admin_email} Administrator email address
MW-specific tags like {post_title} , or any tag that does not match a field, cannot be converted automatically and are left in the email body as-is. If you want to send post information or similar, consider combining a hidden field with the Passing initial field values via URL parameters feature to pass the value. These cases are also shown as warnings in the migration report.
Custom mail tag mapping
MW WP Form's [mwform_custom_mail_tag] is converted into Form Plant's custom mail tag field ( custom_mail_tag ) . The hook that supplies the value has a different name, so it needs to be rewritten ( see the Hook migration reference ) .
Validation mapping
MW WP Form's validation settings are automatically merged into each field.
| MW WP Form rule | Applied to Form Plant |
|---|---|
noempty / required | Required |
mail | Changed to email type |
numeric | Changed to number type |
zip | Changed to postal code type |
tel | Changed to phone number type |
url | Changed to URL type |
date | Changed to date type ( Y-m-d ) |
alpha / alphanumeric | Regex pattern + message |
katakana / hiragana / kana | Kana validation ( pattern ) |
between / minlength | Minimum / maximum character count |
eq | Exact-match pattern |
filetype | Allowed extensions |
filesize / maxFileSize | Maximum file size ( MB ) |
akismet | ⚠️ Not migratable ( set up reCAPTCHA / Turnstile separately ) |
Unknown rules, or rules whose target cannot be found, are shown as warnings in the migration report. Reconfigure them manually.
Screen transitions and post-submission actions mapping
MW WP Form can represent the input, confirmation, completion, and error states with separate URLs/pages, whereas Form Plant switches screens within the page where the form is placed. Because of this, the handling of URL settings differs.
| MW WP Form setting | Form Plant |
|---|---|
| Presence of a confirmation screen | Confirmation screen enabled/disabled ( auto-detected from the button configuration ) |
Completion URL ( complete_url ) | Post-submission action = redirect + redirect URL |
Completion message ( complete_message ) | Post-submission action = custom page + completion HTML |
| Input URL / Confirmation URL / Error URL | No migration needed ( handled in-page; a notice appears in the report ) |
At migration time, the generated form's design is created as standard ( normal ) , and HTML template usage is OFF for both the input and confirmation screens. As a result, right after migration the form is displayed with Form Plant's standard layout.
In practice, fully reproducing the MW WP Form layout requires some adjustment, so we default to a "works first with the standard design" state. The MW WP Form layout ( markup ) is already saved as an HTML template, so if you want to get closer to the original layout, go to the "Layout" tab of the form editing screen, turn on "Use input screen HTML template" and "Use confirmation screen HTML template", and adjust the HTML / CSS as needed.
Hook Migration Reference
The mwform_* hooks you wrote in functions.php and elsewhere are not converted automatically. Rewrite them manually to the corresponding Form Plant hooks.
Three differences to understand before rewriting
Difference 1: How hook names are formed
- MW WP Form: A form key ( e.g.
mw-wp-form-1) is appended to the end of the hook name per form. Example:mwform_value_mw-wp-form-1 - Form Plant: There are two families.
- Hooks with the field name appended: like
fplant_field_initial_value_{name}, you target the field by its name. - Hooks that fire for the whole form: like
fplant_redirect_url, there is no suffix; you check$form_idinside the callback to determine the target form.
- Hooks with the field name appended: like
Difference 2: Forms are identified by "form ID ( a number )"
Form Plant identifies forms by a numeric ID. You can find the form ID in [fplant id="12"] or the editing screen URL ( ...&id=12 ) . In suffix-less hooks, you narrow down the target with $form_id .
add_filter( 'fplant_redirect_url', function ( $url, $form_id, $data ) {
if ( 12 !== $form_id ) {
return $url; // Return as-is for forms other than the target
}
// Logic for form ID 12 only
return $url;
}, 10, 3 );
Difference 3: Field names change from "Japanese → alphanumeric" ⚠️ Most important
Because the migration tool converts Japanese field names into alphanumeric keys ( e.g. お名前 → your_name ) , you must use the new, post-migration field name in the hook callback. You can check the new name in the Form Plant form editing screen.
// MW WP Form ( field name is the Japanese "お名前" )
add_filter( 'mwform_value_mw-wp-form-1', function ( $value, $name ) {
if ( 'お名前' === $name ) { /* ... */ }
return $value;
}, 10, 2 );
// Form Plant ( use the post-migration alphanumeric key "your_name" in the hook name )
add_filter( 'fplant_field_initial_value_your_name', function ( $value, $field, $form_id ) {
/* ... */
return $value;
}, 10, 3 );
Hook mapping quick reference
| What you want to do | MW WP Form | Form Plant |
|---|---|---|
| Set a field's initial value | mwform_value_* | fplant_field_initial_value_{name} |
| Generate choices dynamically | mwform_choices_* | fplant_field_choices_{name} |
| Custom validation | mwform_validation_* | fplant_validate_field_{name} |
| Change an error message | mwform_error_message_* | fplant_validation_message_* |
| Custom mail tag | mwform_custom_mail_tag(_*) | fplant_custom_mail_tag_value_{name} |
| Change email subject/body | mwform_admin_mail_* / mwform_auto_mail_* | fplant_admin_email_subject / _body , fplant_user_email_subject / _body |
| Change email recipients dynamically | mwform_admin_mail_* ( $Mail->to ) | fplant_admin_email_to / fplant_user_email_to |
| Change email headers ( CC/BCC, etc. ) | mwform_admin_mail_* ( $Mail ) | fplant_admin_email_headers / fplant_user_email_headers |
| Skip email sending conditionally | mwform_admin_mail_* ( $Mail->to = false ) | fplant_skip_admin_email / fplant_skip_user_email |
| External integration after submission | mwform_after_send_* | fplant_after_submission_complete |
| Change the redirect target dynamically | mwform_redirect_url_* | fplant_redirect_url |
| Change the completion message dynamically | mwform_complete_content_* | fplant_complete_message / fplant_success_html |
| Attachment save location / file name | mwform_upload_dir_* / mwform_upload_filename_* | fplant_upload_dir / fplant_upload_filename |
| Add custom items to the settings screen | mwform_settings_extend_fields(_*) | fplant_custom_settings_fields |
| CSV character encoding | mwform_csv_encoding-* | fplant_export_encoding |
| Add an input field type | mwform_form_fields | fplant_field_types |
Rewrite examples ( before / after )
In the following, mw-wp-form-1 is the form key, 12 on the Form Plant side is the form ID, and your_name and the like are examples of post-migration field names. Replace them with the values from your own environment.
Set a field's initial value
// before: MW WP Form ( use the logged-in user's email as the initial value )
add_filter( 'mwform_value_mw-wp-form-1', function ( $value, $name ) {
if ( 'email' === $name && is_user_logged_in() ) {
$value = wp_get_current_user()->user_email;
}
return $value;
}, 10, 2 );
// after: Form Plant ( append the field name to the end of the hook name )
add_filter( 'fplant_field_initial_value_email', function ( $value, $field, $form_id ) {
if ( is_user_logged_in() ) {
$value = wp_get_current_user()->user_email;
}
return $value;
}, 10, 3 );
Generate choices dynamically
// before: MW WP Form ( arguments are $children, $atts )
add_filter( 'mwform_choices_mw-wp-form-1', function ( $children, $atts ) {
if ( 'product' === ( $atts['name'] ?? '' ) ) {
foreach ( get_posts( array( 'post_type' => 'product' ) ) as $p ) {
$children[ $p->ID ] = $p->post_title;
}
}
return $children;
}, 10, 2 );
// after: Form Plant ( each option is an array( 'label' => label, 'value' => value ) array )
add_filter( 'fplant_field_choices_product', function ( $options, $field, $form_id ) {
foreach ( get_posts( array( 'post_type' => 'product' ) ) as $p ) {
$options[] = array( 'label' => $p->post_title, 'value' => (string) $p->ID );
}
return $options;
}, 10, 3 );
Supported field types: Select / Radio / Checkbox.
Custom validation
// before: MW WP Form ( set the error on the Validation object )
add_filter( 'mwform_validation_mw-wp-form-1', function ( $Validation, $data ) {
if ( empty( $data['member_id'] ) || ! preg_match( '/^\d{6}$/', $data['member_id'] ) ) {
$Validation->set_rule( 'member_id', 'noNull' );
}
return $Validation;
}, 10, 2 );
// after: Form Plant ( in the target field's callback, returning an error string marks it as an error )
add_filter( 'fplant_validate_field_member_id', function ( $error, $field, $value, $data, $form_id ) {
if ( ! preg_match( '/^\d{6}$/', (string) $value ) ) {
return __( 'Please enter a 6-digit member number.', 'your-textdomain' );
}
return $error; // Return as-is if there is no problem
}, 10, 5 );
Custom mail tag
// before: MW WP Form ( {member_rank} tag; arguments $value, $name, $insert_id )
add_filter( 'mwform_custom_mail_tag_mw-wp-form-1', function ( $value, $name, $insert_id ) {
if ( 'member_rank' === $name ) {
$value = get_user_meta( get_current_user_id(), 'rank', true );
}
return $value;
}, 10, 3 );
// after: Form Plant ( supply the value for the custom_mail_tag field "member_rank" )
add_filter( 'fplant_custom_mail_tag_value_member_rank', function ( $value, $field, $form_id ) {
return get_user_meta( get_current_user_id(), 'rank', true );
}, 10, 3 );
Route email recipients dynamically
// before: MW WP Form ( rewrite $Mail->to )
add_filter( 'mwform_admin_mail_mw-wp-form-1', function ( $Mail, $values ) {
if ( 'sales' === ( $values['category'] ?? '' ) ) {
$Mail->to = 'sales@example.com';
}
return $Mail;
}, 10, 2 );
// after: Form Plant ( return admin recipients as an array; returning an empty array skips sending )
add_filter( 'fplant_admin_email_to', function ( $to, $form_id, $data ) {
if ( 12 === $form_id && 'sales' === ( $data['category'] ?? '' ) ) {
$to = array( 'sales@example.com' );
}
return $to;
}, 10, 3 );
Integrate with an external service after submission
// before: MW WP Form ( Slack notification )
add_action( 'mwform_after_send_mw-wp-form-1', function ( $Data ) {
notify_slack( $Data->get( 'email' ) );
} );
// after: Form Plant ( arguments are $data, $form_id, $form, $submission_id )
add_action( 'fplant_after_submission_complete', function ( $data, $form_id, $form, $submission_id ) {
if ( 12 === $form_id ) {
notify_slack( $data['email'] ?? '' );
}
}, 10, 4 );
For a more detailed explanation of validation hooks, see Validation Hooks ( PHP ).
Unsupported hooks and alternatives
For the following MW WP Form hooks, Form Plant does not provide an equivalent hook due to its architecture. Most of them can be achieved with Form Plant's standard features.
| MW WP Form hook | Alternative in Form Plant |
|---|---|
mwform_post_content(_raw) ( modify the form HTML ) | Edit the form HTML directly with the HTML template feature in the form settings. Inject dynamic values with the fplant_template_values filter, and override templates in your theme with fplant_locate_template |
mwform_no_save_keys ( items not saved to the DB ) | Control via "Submission data storage" in the form settings. Exclude individual items with the fplant_before_save_submission_data filter by unset-ing the relevant keys |
mwform_default_settings / mwform_default_content ( defaults for new forms ) | Not supported. Use the form duplication feature instead |
mwform_inquiry_data_columns / mwform_csv_columns , etc. ( inquiry data screen ) | Not supported ( Form Plant uses its own submission data management screen and export ) |
mwform_tag_generator_* ( tag generator tool ) | Not supported ( Form Plant adds fields via its field editor ) |
mwform_translate_datepicker / mwform_styles / mwform_secure_cookie / mwform_log_directory , etc. | Not supported ( the date, CSS, session, and logging mechanisms differ ) |
Form Plant hook reference ( the main ones used in migration )
| Hook | Type | Arguments |
|---|---|---|
fplant_field_initial_value_{name} | filter | ( $value, $field, $form_id ) |
fplant_field_choices_{name} | filter | ( $options, $field, $form_id ) |
fplant_validate_field_{name} | filter | ( $error, $field, $value, $data, $form_id ) |
fplant_validation_message_* | filter | ( $message, $field, $value, $context ) |
fplant_custom_mail_tag_value_{name} | filter | ( $value, $field, $form_id ) |
fplant_admin_email_subject / fplant_user_email_subject | filter | ( $subject, $form_id ) |
fplant_admin_email_body / fplant_user_email_body | filter | ( $message, $form_id, $data ) |
fplant_admin_email_to / fplant_user_email_to | filter | ( $to, $form_id, $data ) |
fplant_admin_email_headers / fplant_user_email_headers | filter | ( $headers, $form_id, $data ) |
fplant_skip_admin_email / fplant_skip_user_email | filter | ( $skip, $form, $data, $submission_id ) |
fplant_after_submission_complete | action | ( $data, $form_id, $form, $submission_id ) |
fplant_redirect_url | filter | ( $url, $form_id, $data ) |
fplant_complete_message / fplant_success_html | filter | ( $message_or_html, $form_id, $data ) |
fplant_upload_dir | filter | ( $custom_dir, $form_id ) |
fplant_upload_filename | filter | ( $filename, $field, $form_id ) |
fplant_custom_settings_fields | filter | ( $fields, $form_id ) |
fplant_export_encoding | filter | ( $encoding, $form_id ) |
fplant_field_types | filter | ( $types ) |
_{name}is the post-migration field name ( the alphanumeric key ) .
Summary of what cannot be migrated and things to watch for
- The form embed shortcode (
[mwform_formkey]) must be replaced manually with[fplant id="..."] mwform_*hooks must be rewritten manually ( Hook Migration Reference )- Akismet spam settings are not migratable. Set up reCAPTCHA / Turnstile separately ( → Spam Protection )
- MW-specific mail tags ( e.g.
{post_title}) are not converted and remain in the email - The
mwform_rangeslider UI degrades to a numeric input - If there are multiple fields with the same name, the submitted values may collide ( a warning appears in the migration report )
- If the auto-reply recipient field no longer exists after migration, the auto-reply may not be sent ( always verify with a test submission )
- The generated form is created as published with the standard design. The MW WP Form layout is saved as an HTML template but is OFF by default ( turn it on under "Layout" in the editing screen if needed )
Migration checklist
- Update MW WP Form to 5.0 or later
- Migrate the forms via "Form Plant" → "Tools" → "MW WP Form Migration"
- Review all warnings in the migration report
- Open the generated Form Plant form and check the field structure and the new field names
- Send a test submission and verify the confirmation screen, admin email, and auto-reply email
- Replace the shortcode on your pages with
[fplant id="..."] - Rewrite the
mwform_*hooks infunctions.phpto Form Plant hooks - Reconfigure spam protection ( reCAPTCHA / Turnstile )
- If needed, turn on the HTML template under "Layout" and adjust the design
- Once you have confirmed everything works, disable the old MW WP Form forms
If you have any questions, or a customization not covered on this page, please contact Form Plant support.