WPML

WPML Export and Import works alongside the WordPress import plugin you already use. The import plugin moves your data. WPML Export and Import adds the language information at the end so each row lands in the right language and each translation links to its source.

Before You Start

Install and activate these plugins on the site you’re importing into:

  • An import plugin: WP All Import Pro, WP All Export Pro, the native WooCommerce CSV Importer, or the standard WordPress importer.
  • WPML and WPML String Translation.
  • WPML Export and Import (the add-on this page covers).
  • WPML Multilingual & Multicurrency for WooCommerce if you’re importing WooCommerce products.

On the import site, set up WPML with every language you plan to import. The target languages must already exist in WPML > Settings > Languages before you run the import.

Two Paths – Pick the One That Matches Your Source

There are two import paths, depending on where the multilingual data comes from:

  • Supported import plugin. If you’re moving content out of an existing WordPress site with WP All Export Pro (or another supported export tool), WPML Export and Import is already in the export file – language information is included automatically. Skip to the Run WPML Import step below.
  • Custom CSV or XML. If you maintain multilingual data in a spreadsheet or your source is a non-WordPress system (PIM, MLS, ERP, booking platform), you’ll add three language columns to your file manually. Continue to Prepare your CSV or XML below.

Prepare Your CSV or XML With Three Language Columns

For custom imports, add three columns to each row of your spreadsheet. These are how WPML pairs translations together and tags each row with the right language:

  • _wpml_import_translation_group. A unique value shared by all language versions of one piece of content. For products, use the SKU. For everything else, generate your own ID and reuse it for the source row and each translation of it.
  • _wpml_import_language_code. The ISO language code for the row (en for English, es for Spanish, fr for French, pt-pt for European Portuguese, and so on).
  • _wpml_import_source_language_code. Only on translation rows; the language code of the original. Leave it empty for source-language rows.

For WP All Import Pro and similar tools, prepare two spreadsheets: one for taxonomies (categories, tags, product categories), one for posts and products. The native WooCommerce CSV importer takes a single spreadsheet because product categories live inside the product rows.

Custom WooCommerce Attributes for Variable Products

If you have variable products with custom attributes, add a fourth column to translated product rows: _wpml_import_wc_local_attribute_labels. The value is a JSON object of slug:translation pairs. For a French variable product with Size and Color attributes:

{"size":"Taille","color":"Couleur"}

The slug is the attribute name in lowercase with spaces replaced by dashes.

Import Order

Always import taxonomies first when you have a separate file for them. Categories, tags, and any other taxonomies need to exist before posts and products can reference them. Then import posts, pages, products, and other content types.

If you split your data into one file per language, import every language file before running the WPML wiring step.

Map the Language Columns in Your Import Plugin

Each import plugin handles custom columns its own way. The critical step is mapping the three WPML columns to custom fields (or term meta, for taxonomies). In WP All Import Pro, this happens in Step 3 of the import wizard:

  • For posts and products. Open Custom Fields, add three fields, drag the language columns to the Value boxes, and use the column names without brackets in the Name boxes.
  • For taxonomies. Open Term Meta, add three term-meta fields, and map the language columns the same way.

If the columns aren’t mapped, WPML has nothing to read when you run the wiring step.

What You’ll See Between the Import and the Wiring Step

Until you run WPML Export and Import, imported content all sits under your default language, and WPML automatically holds posts and products in Draft status to keep mixed-language content off the front-end. This is the expected interim state, not a sign of a failed import.

For unsupported import plugins, you’ll need to publish posts manually after the wiring step is done.

Run WPML Import

Once the import plugin has finished:

  1. Open WPML > Export and Import in the WordPress admin.
  2. Click Run WPML Import.

WPML reads each row’s language columns, assigns the language to that row, and links translations to their source. On large catalogues this can take several minutes. When it’s done, your imported content is published in the correct language with every translation connected to its source.

Spot-check on the back-end and the front-end:

  • Open the post-type or product list – confirm each row shows under the right language flag.
  • Visit the front-end and switch languages – each translated page should load its translated version, not fall back to the source.

If a taxonomy translation didn’t link up, open the term in the WordPress admin and use the term’s Languages box to connect it to the default-language term.

Automate It – Run WPML Import After Every Scheduled Import

For nightly syncs, supplier feeds, or any scheduled import, the WPML wiring step can run automatically right after the import plugin finishes. Three ways to wire this up:

Option 1 – POST Endpoint (for Cron-Driven Imports Like WP All Import Scheduled Actions)

This is the recommended way. Add a strong secret key to wp-config.php:

define( 'WPML_IMPORT_KEY', 'your-strong-secret-key-here' );

Then add a second command to your scheduled-import setup. It sends a POST request to your site and passes the key in the request body:

curl -X POST https://yoursite.com/ \
  -d 'wpml_import_trigger=your-strong-secret-key-here'

The same call with wget:

wget -q -O - \
  --post-data='wpml_import_trigger=your-strong-secret-key-here' \
  https://yoursite.com/

For WP All Import Pro’s manual scheduling, add either command right after the import command.

When the wiring step runs, your site answers with the status 200 and this message:

Import process completed

Two other answers tell you what happened: 401 means the key doesn’t match, and 204 means there was nothing left to process.

Option 2 – URL Endpoint (Deprecated)

Before WPML Export and Import 1.2.0, you passed the key in the URL:

https://yoursite.com/?wpml_import_trigger=your-strong-secret-key-here

This URL still works, so your current cron jobs keep running. It is deprecated, and WPML removes it in the next major release.

The reason is the key. A URL travels through server logs, browser history, and analytics, and your key travels with it. A POST request keeps the key in the request body. Move your scheduled imports to the POST call in Option 1.

Option 3 – Action Hook (for PHP-Scheduled Imports)

If you’re scheduling imports from PHP with Action Scheduler or wp_schedule_single_event, trigger the WPML step with one action call:

do_action( 'wpml_import_process' );

To run it as a one-off background task right after your import action:

wp_schedule_single_event( time(), 'wpml_import_process' );

If something fails in any of these paths, turn on WP_DEBUG_LOG in wp-config.php to capture the error in the PHP error log.

Run WPML Import From the Command Line

For deployment scripts, container builds, or any pipeline where the admin UI isn’t available, run the wiring step from WP-CLI:

wp wpml import process

The command reports how many translations were connected. It’s a drop-in replacement for the Run WPML Import button.

Common Pitfalls

  • Import file is missing the three language columns. Content imports but lands as untagged source-language rows; Run WPML Import has nothing to wire. Fix: add the columns to your source data, re-export, and re-import.
  • WP All Import’s Custom Fields / Term Meta mapping was skipped. Same shape as missing columns. The data is in the file but the import plugin didn’t store it on the post. Re-run the import with the fields mapped.
  • Target languages aren’t set up on the import site. Imported rows for an unconfigured language land in the default language. Add the missing languages at WPML > Settings > Languages first, then re-run.
  • Unsupported import plugin. Imported posts stay in Draft after the wiring step. Publish them manually, or switch to a supported plugin.
  • Custom-built import scripts that don’t pass language data through. The fix is at the script level. The three language columns (and the WooCommerce attribute column when applicable) need to reach the row.

If imports keep tripping over the same issue, the WPML support team answers import questions 24/7.

If You Were Looking for the WPML All Import Plugin

WPML All Import is the legacy plugin that predates WPML Export and Import. It’s no longer supported or recommended. The procedure above is the up-to-date way to import multilingual content into a WordPress site – use it instead of any workflow described in the old plugin’s documentation.

Written by Amir · Last updated July 2, 2026