Skip to main content

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.

Get the big picture first

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 )

CategoryAutomatic / 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 )
Migration is an "add a new form" operation

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_options capability ( administrator ) .

How to use the migration tool

1. Open the migration screen

  1. Open "Form Plant" → "Tools" in the WordPress admin screen
  2. 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.

ColumnContent
( checkbox )Select forms to migrate
TitleThe MW WP Form form title
FieldsThe number of detected fields
Migration StatusMigration status ( Migrated / Not migrated )

Steps:

  1. Check the boxes for the forms you want to migrate ( select-all is also available )
  2. Click the "Migrate selected forms" button
  3. Click OK in the confirmation dialog, and the selected forms are converted one at a time, in order
  4. 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.

StatusMeaning
SuccessMigration completed without warnings
With warningsMigration succeeded, but some items require manual attention ( please review )
FailedAn 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" ) .

Re-reviewing migrated forms

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

Generated forms are "published with the standard design"

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:

  1. Open the generated Form Plant form and review the field structure, required settings, and choices
  2. Note the field names ( name ) ( you'll use them for hook rewrites and mail tags; Japanese names are converted to alphanumerics )
  3. Send a test submission and verify that the confirmation screen, auto-reply email, and admin email behave as intended
  4. 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 FormForm 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 12 in wp-admin/admin.php?page=fplant-form-new&id=12
  • The embed shortcode [fplant id="12"] shown in the form list
How to find the pages where the form is placed

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 tagForm Plant field typeNotes
mwform_textText ( text )size / maxlength are carried over
mwform_textareaTextarea ( textarea )rows / cols / maxlength are carried over
mwform_emailEmail ( email )
mwform_passwordPassword ( password )
mwform_telPhone number ( tel )Converted to 3-part input ( split3 )
mwform_urlURL ( url )
mwform_zipPostal code ( postal_code )Converted to a 3+4 digit two-box input
mwform_numberNumber ( number )min / max are carried over
mwform_rangeNumber ( number )⚠️ The slider UI is not reproduced
mwform_selectSelect ( select )Choices are converted
mwform_radioRadio button ( radio )Choices and layout are converted
mwform_checkboxCheckbox ( checkbox )Choices, layout, and delimiter are converted
mwform_hiddenHidden field ( hidden )
mwform_fileFile ( file )
mwform_imageFile ( file )Restricted to image extensions ( jpg/jpeg/png/gif/webp )
mwform_datepickerDate ( date )Format Y-m-d
mwform_monthpickerDate ( date )Format Y-m
mwform_custom_mail_tagCustom mail tag ( custom_mail_tag )see below

Each field's name ( field name ) , label, placeholder, default value, id, and class are also carried over.

Field names are converted from "Japanese → alphanumeric" ⚠️ Most important

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 FormForm Plant
Admin recipients ( mail_to / cc / bcc )Admin email recipient, CC, BCC
Admin email subject and bodyAdmin email subject and body
Sender ( admin_mail_from , etc. ) and Reply-ToSender name/address and Reply-To
Auto-reply recipient field ( automatic_reply_email )Auto-reply email recipient field
Auto-reply subject, body, and senderAuto-reply email subject, body, and sender

Mail tag mapping

Mail tags written in the email body and subject are converted automatically too.

MW WP FormForm PlantConversion
{お名前} ( 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
Unresolvable tags are left in the email as-is

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 ruleApplied to Form Plant
noempty / requiredRequired
mailChanged to email type
numericChanged to number type
zipChanged to postal code type
telChanged to phone number type
urlChanged to URL type
dateChanged to date type ( Y-m-d )
alpha / alphanumericRegex pattern + message
katakana / hiragana / kanaKana validation ( pattern )
between / minlengthMinimum / maximum character count
eqExact-match pattern
filetypeAllowed extensions
filesize / maxFileSizeMaximum 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 settingForm Plant
Presence of a confirmation screenConfirmation 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 URLNo migration needed ( handled in-page; a notice appears in the report )
About the layout after migration

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_id inside the callback to determine the target form.

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 doMW WP FormForm Plant
Set a field's initial valuemwform_value_*fplant_field_initial_value_{name}
Generate choices dynamicallymwform_choices_*fplant_field_choices_{name}
Custom validationmwform_validation_*fplant_validate_field_{name}
Change an error messagemwform_error_message_*fplant_validation_message_*
Custom mail tagmwform_custom_mail_tag(_*)fplant_custom_mail_tag_value_{name}
Change email subject/bodymwform_admin_mail_* / mwform_auto_mail_*fplant_admin_email_subject / _body , fplant_user_email_subject / _body
Change email recipients dynamicallymwform_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 conditionallymwform_admin_mail_* ( $Mail->to = false )fplant_skip_admin_email / fplant_skip_user_email
External integration after submissionmwform_after_send_*fplant_after_submission_complete
Change the redirect target dynamicallymwform_redirect_url_*fplant_redirect_url
Change the completion message dynamicallymwform_complete_content_*fplant_complete_message / fplant_success_html
Attachment save location / file namemwform_upload_dir_* / mwform_upload_filename_*fplant_upload_dir / fplant_upload_filename
Add custom items to the settings screenmwform_settings_extend_fields(_*)fplant_custom_settings_fields
CSV character encodingmwform_csv_encoding-*fplant_export_encoding
Add an input field typemwform_form_fieldsfplant_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 hookAlternative 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 )

HookTypeArguments
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_subjectfilter( $subject, $form_id )
fplant_admin_email_body / fplant_user_email_bodyfilter( $message, $form_id, $data )
fplant_admin_email_to / fplant_user_email_tofilter( $to, $form_id, $data )
fplant_admin_email_headers / fplant_user_email_headersfilter( $headers, $form_id, $data )
fplant_skip_admin_email / fplant_skip_user_emailfilter( $skip, $form, $data, $submission_id )
fplant_after_submission_completeaction( $data, $form_id, $form, $submission_id )
fplant_redirect_urlfilter( $url, $form_id, $data )
fplant_complete_message / fplant_success_htmlfilter( $message_or_html, $form_id, $data )
fplant_upload_dirfilter( $custom_dir, $form_id )
fplant_upload_filenamefilter( $filename, $field, $form_id )
fplant_custom_settings_fieldsfilter( $fields, $form_id )
fplant_export_encodingfilter( $encoding, $form_id )
fplant_field_typesfilter( $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_range slider 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

  1. Update MW WP Form to 5.0 or later
  2. Migrate the forms via "Form Plant" → "Tools" → "MW WP Form Migration"
  3. Review all warnings in the migration report
  4. Open the generated Form Plant form and check the field structure and the new field names
  5. Send a test submission and verify the confirmation screen, admin email, and auto-reply email
  6. Replace the shortcode on your pages with [fplant id="..."]
  7. Rewrite the mwform_* hooks in functions.php to Form Plant hooks
  8. Reconfigure spam protection ( reCAPTCHA / Turnstile )
  9. If needed, turn on the HTML template under "Layout" and adjust the design
  10. 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.