WPML
Released
October 21, 2026
Channel
Stable
Tested with WordPress
7.1

Changelog

Faster saves and pages, a rebuilt Translation Dashboard, clearer automatic translation and 355 fixes.

What's new

  • Automatic translation no longer leaves jobs in progress when the account cannot pay: it pauses with Go to billing and resumes once paid.
  • The Translation Dashboard content list is rebuilt: it works on sites with many languages, lists every post once, and its status filters match the column.
  • Changing a custom field's translation preference updates your existing content as a tracked background task, and the settings explain what each preference does.
  • Small edits to translated content no longer lose existing translations or get charged as a full new translation.
  • A category's or tag's name and description are translated and charged once, not again in every post that uses them.
  • Product variations stay out of Translate Everything, and empty variation jobs created earlier are retired.
  • Cancelling a job for content that was already translated restores its previous state.
  • WPML's admin screens follow your admin language, right-to-left languages included.
  • Comment counts are shown per language, and post statuses stay in sync between originals and their translations.
  • Review mode is kept per translation batch, and the Advanced Translation Editor marks media and taxonomy texts whose original changed.
  • Multisite: the subsite setup wizard handles the site key correctly, without a broken users query, and subsites no longer report a site-key mismatch.
  • Translation Priority is removed, and WPML Reset is blocked while the site still has secondary languages.
  • The site's check-in with wpml.org includes its setup and automatic translation health; one opt-in checkbox in the setup wizard and Settings controls sharing your content statistics and plugin list.
  • All WPML add-ons are built from the same source as WPML and ship in step with it.
  • Every WPML add-on carries the same shared library version as WPML, so the 'WPML Update is Incomplete' notice stays translated whichever plugin loads first.
  • Security hardening: stricter handling of stored data, validated request input, safer file deletion, file names and include paths, and escaped stored values.
  • When the Administrator role has lost WPML's capabilities, WPML restores them, so new administrators see all of WPML.
  • The setup wizard's minimum-requirements warning can no longer be walked past and then lost.
  • When sending content to translation fails because of a database problem, the popup shows the error details.
  • When WPML cannot read your account's available words, it shows a clear status and message.
  • A job that keeps failing beside successfully created ones is no longer retried without limit.
  • During a connection outage that only a new send can end, the banner no longer shows a retry countdown.
  • In the Translation Queue, statuses ticked in the Status filter stay ticked after the job list loads.
  • The "Your automatic translation pricing has been upgraded" notice on the Translation Dashboard now shows its content instead of staying empty.
  • Choosing 'Copy from original language if translation language uses encoded URLs' warns you when no active language uses encoded URLs.
  • Dropdown language switchers now open with the keyboard and by click, and tell screen readers whether they are open.
  • The language switcher dropdown icon appears only when there are translations to choose from.
  • The language switcher is turned off when the site has only one active language.
  • The language switcher on a custom post type's yearly archive links to the right archive.
  • Post and page previews use the right address on sites with a different domain per language.
  • The posts list shows the right icon for a translation in progress.
  • Content with time elements keeps its HTML intact when it is split for translation.
  • Working in several browser tabs no longer mixes languages in the block editor.
  • Language pair information cached from the Advanced Translation Editor no longer goes stale and repairs itself.
  • Connecting a translation to another translation group no longer fails while reporting success.
  • Admin lists of hierarchical post types, such as Pages, no longer run a translation query over every post, which failed on hosts that limit query size.
  • Automatic translation of categories, tags and other terms is more reliable.
  • Old admin addresses of Support tools lead to the one Support page instead of separate copies.
  • Blocks detected automatically from field-based builders such as Meta Box offer only their text attributes for translation.
  • Avada: the Fusion Post Cards widget is translated.
  • WP User Manager: the language switcher on a profile page leads to the translated profile page, not the generic one.
  • When reconnecting a copied or moved site fails, WPML no longer clears its site key, so updates and automatic translation keep working.
  • A shortcode attribute registered as base64-encoded that actually holds plain text can now be translated.

Performance

  • Saving a page or template, Elementor templates included, no longer rewrites unchanged translations, so saves on sites with many languages are much faster.
  • Front-end pages on WooCommerce sites load faster: URL rules are no longer re-read for every product term.
  • A cached front-end request no longer asks the database about WPML's language tables on every page view.
  • Front-end requests no longer write upgrade progress or re-read WPML's table layout.
  • Post edit screens no longer wait for the translation engine lookup on every load, and a failing lookup is not retried on every page.
  • Editing a post on a site with many plugins no longer runs out of memory.
  • The Translation Management dashboard no longer times out on sites with many translated terms.
  • The Translation Management dashboard no longer runs out of memory while counting words.
  • WPML > Translations no longer runs out of memory on sites with a persistent object cache, such as Redis or WP Engine's.
  • The URL resolution cache table no longer grows without limit, and saving routing settings no longer counts the whole table.
  • Term queries with long include, exclude or child lists, as in menus, widgets and product filters, are translated in one database query.
  • Translations of product terms read outside a query are looked up once per request.
  • Block default texts are translated when a block renders, not for every registered block type on every request.
  • WP-CLI commands use less memory: WPML loads its Installer only when a command needs it.
  • Multisite: switching between sites no longer runs recovery checks when there is nothing to recover, so network admin pages load quickly again.
  • Product translations are looked up in one query for products shown by WooCommerce product collection blocks.
  • WP Rocket optimizes the site's root page like every language directory, and no longer logs 'Empty buffer' for it.
  • Elementor pages no longer run every WooCommerce dynamic-id converter on each element.
  • Admin pages no longer re-register the default texts of every third-party block on each request, saving many database queries.
  • On some upgraded sites, the language catalogue refresh runs once instead of on every request.
  • Saving a post no longer re-checks WPML's tables each time, and a block post reads its string package only once.
  • Front-end pages of block themes and WooCommerce shops read block translations, term slugs and translated URL rules once per page, not on every use.
  • Values WPML caches without an expiry are kept instead of being treated as expired and deleted.
  • Looking up terms by slug no longer repeats the same adjustment for every lookup in a request.
  • WPML no longer takes a full stack trace on every home URL lookup, and its home URL filter is cached.
  • WPML no longer loads its email template engine on every admin page, REST request and AJAX call, so fewer files load.
  • Admin pages no longer count the posts carrying custom fields that wait for your decision on every load.
  • Admin pages are no longer slowed by a slow REST API check and data decompression errors.
  • Page builders: saving several translations in one request no longer rebuilds every earlier post again.
  • The posts list no longer runs a translation query for every row.
  • The AI Translation settings page loads without waiting for answers from our translation system.
  • Saving posts is faster on large multilingual sites.
  • Applying a translation to a post with many custom fields is faster.
  • The taxonomy translation page no longer times out on sites with a very large number of terms.
  • The Translation Dashboard reads the translatable content types once per page instead of twice.

Fixes for automatic translation and Translate Everything

  • Translate Everything no longer stays paused for the monthly spending cap after the cap is raised or the month resets.
  • The paused Translate Everything box shows the current monthly spending cap and this month's usage.
  • Texts that an earlier translation only copied from the original language, such as untranslated form messages, are now translated automatically instead of being treated as done, while a copy a translator completed on purpose is kept.
  • Translate Everything applies term translations whose description holds HTML, such as an image, and a failed term job states its reason.
  • Translate Everything cost estimates leave out paused languages, including items whose only missing translation is in a paused language.
  • Automatic translations are delivered even when an earlier translation of the content was deleted, and one failed job no longer affects the others.
  • Sites that WPML asks for finished translations keep collecting them until none are left, so a large batch arrives in minutes, not days.
  • Discarding a failed automatic translation job removes it for good, and its texts are not sent to automatic translation again.
  • The strings pass of Translate Everything no longer slows down on sites with many past batches.
  • A discarded or cancelled failed automatic translation of a post, string batch, string package or term is not sent again until its content changes.
  • The 'Synchronize local job ids with ATE jobs' action refuses ambiguous job mappings, so a delivery is never written into an unrelated translation.
  • Switching the translation engine in AI Translation settings reports a failed save as failed, instead of showing Saved.
  • The 'couldn't be completed' box no longer lists a job with every detail N/A after Discard jobs.
  • Translations delivered while a post screen is open keep their link to the original and their language when another plugin handles post saves.
  • Translate Everything no longer skips a term created while it finishes that taxonomy.
  • WPML admin pages keep working when the Advanced Translation Editor gives an unexpected answer about language mapping.
  • Translate Everything records each completed item once, and removing a language also clears it from the Ninja Forms and WPForms records.
  • Translate Everything cost estimates, the setup wizard's included, count posts with their term fields, strings, string packages and taxonomy labels as they are sent.
  • The automatic translation cost estimate lists what it does not count, so the final usage holds no surprises.
  • Translate Everything no longer gets stuck on block widget texts outside the admin screens, and content it cannot send no longer blocks later posts.
  • Translate Everything no longer overwrites progress that another request recorded at the same time.
  • The note under the Translate Everything word-count table explains that after the first translation, edits are free and you pay only for added words.
  • Translate Everything sends a Widgets string package added while Widgets was excluded, once Widgets is included again.
  • When WPML cannot reach the site to check for delivered translations, the status box says the checks stopped and offers to pick them up now.
  • When our translation system keeps refusing the site's address, WPML shows that it is reconnecting and keeps retrying, without asking to map the default language.
  • Pressing Pick up translations now during a delivery check collects translations right after that check ends.
  • When several admin pages are asked to reconnect to our translation system at once, WPML re-registers the site only once.
  • A language added with 'translate existing content' while WPML is reconnecting gets its existing content translated once the connection is back.
  • The Translate content button is no longer disabled without explanation while WPML reconnects to our translation system.
  • Sites with translations in progress check for finished ones every two minutes as intended, and the check no longer holds up your browser.
  • During a reconnect, Step 2 of the Translations dashboard shows no retry countdown or 'can't reach' message, and the held Translate Everything button explains why.
  • The Translate Everything estimate names the block widgets row 'Block' instead of 'Widget' or 'Widgets'.
  • The setup wizard's cost estimate no longer counts a post's category in a language it is already translated into, matching the Translations dashboard.
  • A job the translation engine could not translate appears in the list of jobs that could not be completed, with Resend and Discard.
  • Translate Everything no longer sends and charges a taxonomy label twice when its status record is lost.
  • Turning on Translate Everything no longer claims the default language is unsupported when WPML simply could not read the support information.
  • While WPML reconnects to our translation system, the Translate Everything box stays visible in a paused state and explains what is happening.
  • A translation that keeps failing to apply is given up after the third attempt and listed with Resend and Discard; Resend starts a new job.
  • WPML recognizes 'missing language mapping' answers from our translation system and clears the error icon of a job cancelled there.
  • Returning from the Advanced Translation Editor, WPML says when the translation could not be saved, with the reason and the next step.
  • Automatic translations keep being delivered when another plugin fails to save one of them, and the admin bar progress no longer restarts at zero.
  • After paying through the account widget on the WordPress Dashboard, the paused automatic translation box clears right away.
  • On Pay-As-You-Go, jobs held by a pending or failing payment say why they are waiting and how to continue.
  • A connection outage with our translation system ends only when sending works again, and Retry no longer lets a duplicate job through.
  • After a send to automatic translation, the result counts only the jobs actually created, and Retry no longer replaces a held-back job each time.
  • When part of a Translate Everything send fails, the failed items are held and sent again later.
  • An answer WPML cannot read, such as a proxy page, no longer blocks those items from automatic translation for good.
  • Sends from outside the Translation Dashboard, such as the post editor or the posts list, are no longer refused while WPML waits out an outage.
  • The connection notice tells account problems apart from Advanced Translation Editor problems, so one no longer hides the other.
  • A new connection outage no longer shows 'cannot access' at once because another request closed the previous outage mid-send.
  • String sends that fail, are cut short, target a paused language or are refused no longer leave empty string batches behind.
  • Resending a failed term job keeps the term, and a failed resend is reported as failed.
  • Turning Translate Everything off while strings are being translated no longer leaves them 'Translation in progress' for good.
  • On phone-width screens, the Set up Translate Everything window fits the screen and can be closed.
  • Translate Everything no longer re-sends, and charges again for, a job you cancelled while its first site-wide pass is still running.
  • Taxonomy jobs paused because the account ran out of words resume once words are added.
  • The dashboard no longer counts jobs our translation system never accepted as pending, so no phantom translations wait for pickup.
  • When WPML cannot read which languages automatic translation supports, cost estimates and the Translation Dashboard's language list no longer come out wrong or empty.
  • Translate Everything no longer lists a content type with nothing to translate as waiting for your approval.
  • Content types a plugin registers only in the admin, such as WPBakery's Grid Builder, can be included from Adjust content limits.

Fixes in the translation editors and translation jobs

  • Existing Classic Translation Editor translations of content with several blocks are kept when opened in the Advanced Translation Editor.
  • The Classic Translation Editor shows HTML with video, audio and picture elements in a plain text field, so no tags are lost.
  • In the translation editor, a text repeated in several blocks, shortcodes or attributes is listed under its first occurrence, so no block looks missing.
  • Completing a translation job never writes into, or moves, a post that is not the job's own translation.
  • In the Classic Translation Editor, a job whose source is a secondary language no longer loads the default-language page instead.
  • Opening a translation job sent from another translation, not the original, keeps that translation as its source language.
  • A string package or post reviewed in the Advanced Translation Editor completes and publishes when the reviewer clicks Save and Complete.
  • Reopening a delivered product translation no longer creates a new job with empty fields; the editor waits until the translation is collected.
  • An empty target in a delivered XLIFF file no longer voids the job: text-free units keep the source, and bad units are skipped.
  • Opening a translation in the editor no longer takes over an automatic job our translation system is still translating.
  • Accepting a reviewed translation of a scheduled post no longer publishes it before its original.
  • In the translation editor, a page-builder shortcode text is labelled with only the attributes it currently has.
  • In the translation editor, shortcodes inside blocks are listed in page order, with one entry per repeated text.
  • In the translation editor, a page with shortcodes inside blocks shows its two groups of texts under different names.
  • No translation job is created for a translation whose status record a simultaneous save removed, so the related PHP warnings are gone.
  • A failed write of a translation status record no longer hands back another translation's id.
  • Simultaneous saves of a translation that has no job create one baseline job, not one each.
  • A term translation reviewed in the Advanced Translation Editor is applied to the site again.
  • Files in a downloaded translation job archive have names Windows accepts, so the archive extracts everywhere.
  • When the translated post cannot be created or updated, the job is reported as failed with its reason and can be applied again.
  • The Classic Translation Editor shows a double-quoted shortcode inside a double-quoted attribute correctly.
  • Reopening a translation from a link with its job id keeps the translator's unsaved progress.
  • After an admin opens a completed translation, removing the translator or importing an XLIFF file leaves the job in the right state.
  • On the translation review page, language switcher links point to their own languages, not the language under review.

Fixes in Translation Management and the Translation Dashboard

  • Edit links of translated posts stay in place for users with no translator language pair.
  • The pencil icon of a duplicated post opens the WordPress editor again when that is the chosen translation editor.
  • Posts translated in the WordPress editor open there again while our translation system does not recognize the site's new address, and blocked translations say why.
  • Editors can open the original post from the translation status column without a 'not allowed to translate this language pair' error.
  • Sending a page, category or tag again from another language, before its translation exists, shows the new source language in Translation Jobs.
  • With automatic string registration off, returning to the Translation Dashboard window no longer starts string processing.
  • A translation that cannot open in an editor explains why above the Translation Tasks list, as the posts list does.
  • Cancel and Save in the automatic string registration dialog no longer leave the Translation Dashboard for a blank page.
  • Changing an original's language updates its translations' source language, so their jobs stay listed in Translation Jobs.
  • The jobs list no longer shows a database error for a translator whose language pair has no target languages.
  • The translation updates email no longer counts a string package job as the post with the same id.
  • Translate content stays available for a mixed selection when one kind of item is already translated.
  • The jobs summary email no longer shows a PHP warning when a job's manager is not a user.
  • The Translation Dashboard sends categories marked 'Translate automatically' even when the previous send used 'Translate myself'.

Fixes for page builders

  • Elementor: editing a translation opens the editor in your admin language, not in the page's language.
  • Elementor: saving a translation no longer fails when a theme widget needs the current document or a widget errors while rendering.
  • Elementor: each button on a translated page links to the translation of its own target, not all to the same page.
  • Elementor Pro: the Form widget's Message field is no longer sent for translation, so notification emails keep the submitted data.
  • Avada: accented characters in translated form notification emails are no longer stored as escape codes.
  • WPBakery: a Single Image with a custom link keeps its image and link on the translation.
  • Page builder values that are not lists of attachment ids are no longer rewritten to zeros on translations.
  • Flatsome and other shortcode builders: text between two shortcodes of the same name is offered for translation and translated.
  • Beaver Builder: on a translated page, the Pattern module and patterns panel list only that language's patterns.
  • Divi 5: a Loop module on the original page is kept on the translation and lists the translated posts.
  • Divi: theme-builder layouts Divi marks as unused are no longer offered in the Translation Dashboard or sent by Translate Everything.
  • A shortcode or block declared in several language configuration files keeps the attributes and settings from all of them.
  • After a search-and-replace, shortcode-based builders no longer offer the same text twice, and texts the page no longer has are removed.
  • A shortcode-built page whose content holds a block comment gets its Classic Translation Editor translation applied.
  • A shortcode ID attribute setting no longer also converts other attributes whose names end the same way.
  • Translating a shortcode attribute no longer changes another attribute with the same text.

Fixes for blocks and the block editor

  • Without String Translation, a translated page keeps the settings of a block inserted from a pattern, and translating again repairs earlier pages.
  • Editing a block widget's text keeps the translation of the text it replaces.
  • Block settings that are code, such as an HTML tag, an alignment or an animation type, keep their value in every language.
  • Block attributes holding lists of ids, such as Gallery image ids, show the translated items.
  • Custom HTML blocks: CSS holding SVG images is no longer cut, and escaped markup, ampersands and non-breaking spaces stay as written.
  • Translated pages no longer turn text that shows HTML tags, written as text in a paragraph, heading or list, into real markup.
  • Translated blocks keep their own references: link copies follow the translated anchor, and image blocks name the translated attachment.
  • Beaver Builder: a tab or accordion item that shows a saved row, column, module or template shows its translation.
  • Blocks that store a link in both markup and attributes, such as GenerateBlocks buttons, are no longer reported as broken in the editor.
  • A plugin's or theme's own language configuration is now applied as soon as it is activated, so blocks such as Kadence Blocks can be translated right away.
  • Block editor saves use the post's language, not the admin language, so a Sensei course keeps its modules.

Fixes for the language switcher

  • Language switcher AJAX navigation reads only HTML page answers, safely, so other responses never load resources or run code.
  • The footer language switcher settings window no longer opens blank, and settings that did not arrive are no longer reported as saved.
  • Language switcher data no longer resets the current post inside listings and loops.
  • With a different domain per language and WP_HOME built from the request, the default language's switcher links use its own domain.
  • The Language Switcher block works for users without the unfiltered_html capability: it saves cleanly and keeps its arrow, styles and image size.
  • A Language Switcher block whose saved markup lacks the current language no longer causes a fatal error; it lists the other languages.
  • In the block editor, the Language Switcher dropdown's toggle points screen readers to its list of languages.
  • Two Language Switcher blocks on one page no longer share a submenu id in the block editor.
  • Custom language switcher settings show their own style rules, and a switcher can no longer be saved empty or with every display option off.
  • Language switcher options no longer accept template code that every page would then render.
  • The Language Switcher block renders accented and non-Latin language names correctly on hosts with newer libxml versions.
  • The Language Switcher block no longer reports invalid content for administrators whose admin language is not English.

Fixes for categories, tags and other taxonomies

  • A term translation delivered without one of its texts, such as the description, stays open for the missing part instead of completing.
  • A taxonomy archive whose slug is the same in two languages shows the term of the requested language, and that term saves again.
  • A taxonomy's default term is no longer rewritten on every language switch, and new posts get the default term of their own language.
  • A plugin checking whether a term exists on a secondary-language page gets that term back, not its translation.
  • A custom taxonomy's default term can no longer be deleted from another language's admin, which made WordPress recreate it in the wrong language.
  • When a default category or term is deleted by code or in the database, WPML recreates it in the default language with its translations.
  • Changing a taxonomy's translation mode moves every post onto the term in its own language.
  • Deleting a category or term by code from another language's page files its posts under their own language's default, without deleting other defaults.
  • A language added from an admin in another language gets its own default category name, such as 'Uncategorized' for English.
  • A term translation created through WPML's term API keeps the source language its caller names.
  • Creating a term translation through the API by naming the original term's id works and joins the original's translation group.
  • Re-sending a translated category or tag no longer renames its slug when the original or another language shares it.
  • The admin language no longer switches back to the previously browsed language after visiting the taxonomy translation screen.
  • Sites whose term ids and term taxonomy ids differ no longer get unrelated terms in hreflang links and category counts.
  • When a custom taxonomy's English default term is gone and its translations share its name, each language keeps its own default term.
  • A late automatic translation delivery no longer overwrites manual term translations or clears their update state.

Fixes for menus

  • On sites with a persistent object cache such as Redis, translated menus and term translations are no longer replaced by the default language's.
  • In Menus, the 'Translation of' placeholder appears in the admin language, not in Spanish.
  • Saving a menu outside Appearance > Menus, through REST, the Customizer or code, keeps it linked to its translations.
  • Menu items added by code in one request keep their positions.
  • WP Menus Sync creates translated menus inside their original's translation group.
  • WP Menus Sync no longer flattens translated menus when a wpml-config file, as in the Porto theme, sets menu item fields to copy.
  • Removing an item from the original menu also removes its translated copies.
  • Applying the same WP Menus Sync changes twice no longer creates a second translated menu.
  • WP Menus Sync no longer adds draft translations to translated menus, so visitors get no 404 links.
  • Removing a parent item from the original menu no longer leaves translated child items pointing at a deleted item.
  • Publishing a menu change in the Customizer with a non-default admin language no longer renames that language's translated menu.

Fixes for links, URLs and redirects

  • Translating or duplicating a post into several languages at once no longer saves a link to a custom post type with a translated slug in the wrong language.
  • A page made with Create root page is the site's root page from its first save, in the block and classic editors.
  • A draft or pending page with the same slug no longer sends a published page in another language to a 404.
  • With a different domain per language, WPML > Settings > URLs saves again instead of failing a check for a hidden field.
  • A category address ending in a category that does not exist, often requested by crawlers, no longer writes a database error.
  • Links to archives and other non-page addresses are no longer rewritten to an Elementor template in translations.
  • Links to a post whose slug is translated are converted correctly in the default language, whatever the post's original language.
  • The login page on a hidden language's domain is no longer redirected to the default language.
  • With a hidden language and a translated login page, the hidden language's login address always works.
  • When WPML restores a missing URL format setting during a page load, that page's language links use the saved format, not ?lang= parameters.
  • A site that lost its stored language URL format keeps serving language directories and saves the setting again.
  • A translated link field holding a plain link to the translated page, as Sticky Links stores it, opens that page in the translation's language.
  • A category archive opened by its ?cat= and lang= address shows the archive instead of redirecting to the language's home page.
  • Converted page links, ACF Link and URL fields included, keep their #anchor, query string and sub-path.
  • A paginated address no longer makes links point to the wrong post.
  • A new root page gets a language after the old root page was permanently deleted.
  • A term's link updates as soon as the term is saved, so SEO plugins can create the redirect.
  • Converted anchor links no longer get a trailing slash after the #anchor.
  • A link no longer stays in the original language for a while after its translation is published.
  • Links to untranslated posts no longer lead to a 404 on sites with a different domain per language.

Fixes for languages and the setup wizard

  • The setup wizard resumes at the languages step when only the default language is left, instead of locking the admin.
  • The setup wizard's Languages step no longer shows an empty default language when the saved default language was not active.
  • In the setup wizard, adding a country variant of a language the site used before asks whether to keep the content or start fresh.
  • A language no longer in WPML's catalogue can be added as a custom language with its own code and locale.
  • The language catalogue sync fills a preset's language when an earlier version left it empty.
  • A text direction corrected in WPML's language catalogue reaches sites using that language without changing their language settings.
  • A language code of '0' no longer sends links to the default language; affected sites are repaired, and failed code changes are reported.
  • A custom language created before WPML 5.0 under a code WPML now uses, such as de-at, becomes that built-in language, keeping its content.
  • A custom language that cannot be taken over is marked Needs a mapping and is not sent to automatic translation until mapped.
  • Language search no longer offers to add Chinese (Hong Kong) as a custom language once the site has it.
  • Language pack downloads finish on hosts with a low PHP time limit, resuming instead of stalling at the last pack.
  • Resetting language defaults no longer shows PHP 8.1 deprecation notices.

Fixes for registration and updates

  • Updating WPML by upload from version 5.1 no longer shows a one-time critical error.
  • Updating WPML no longer sends a critical-error email when a management plugin such as InfiniteWP adds a post right after the update.
  • Activate & Update opens for accounts whose subscription type matches no product, instead of stopping with a critical error.
  • Activate & Update shows the registration box in every account state, with Unregister and a site key field, so old registrations can be replaced.
  • Plugin details of WPML plugins no longer warn about an untested WordPress version on WordPress point releases.
  • A registered site no longer shows 'A New Site Key Is Required' with a persistent object cache, or loses its key when wpml.org is unreachable.
  • After a site moves to a new address and keeps its translation account, WPML says the site moved instead of calling it a copy.
  • Multisite: Get a key for this site names the network's address, so the key it leads to is accepted.
  • A site that has not moved no longer shows the site-copy notice after re-registering with our translation system.
  • When the WPML products feed cannot be reached, Activate & Update keeps the last known products and says what failed, with Check again.
  • WP-CLI lists plugins without a warning while a WPML update is pending.
  • After switching back to the Production channel, Activate & Update installs the Production version, and a Download with nothing to install says so.
  • Each plugin's Release notes in Activate & Update show only that plugin's own notes.
  • After updating, browsers and CDNs load WPML's current scripts and styles instead of cached old ones.
  • Advanced Custom Fields Multilingual and other companion plugins load when their version is a beta of the release WPML requires.
  • A site no longer revalidates its key many times a second, also when several update notifications arrive at once.
  • A site key defined in wp-config.php keeps its registration when wpml.org only throttles or times out.
  • The plugin download handler checks the request's security token before validating the site key.
  • Multisite: two sites of one network with different predefined site keys no longer re-register back and forth.
  • The setup wizard no longer re-registers a site key defined in wp-config.php every time it loads.
  • The subscription update route answers success for a site whose subscription is already current, so proxies and monitors stop logging false refusals.
  • A site key in wp-config.php is stored correctly even when copied with a trailing space or line break.
  • Sites with a Blog licence no longer get a fatal error about a missing constant.

Fixes for WooCommerce sites

  • On sites with WooCommerce Multilingual, WPML no longer falls back to its setup wizard on its own and shows every language's posts.
  • WPML's admin scripts, CMS Navigation and Sticky Links no longer fail with 'addLoadEvent is not defined' on the WooCommerce Multilingual setup wizard.
  • Removing a category from a product updates the translated category's product count in every language.
  • Products translated with the Classic Translation Editor keep variation, attribute and custom-field translations when opened in the Advanced Translation Editor.
  • Importing translated variable products no longer fails on duplicate attribute rows when a parent product carries both languages' terms.
  • WooCommerce Multilingual no longer rebuilds its translated account and checkout addresses twice when content types are registered late.

Fixes for custom fields and Advanced Custom Fields

  • The Custom Fields Translation and Custom Term Meta Translation settings screens open again when a plugin or import left a nameless custom-field row.
  • A background task queued without asking after the 5.1.0 update is retired; a newly translatable custom field waits for your decision instead.
  • The Custom Term Meta Translation settings say a translated field is translated with the term, not with the post.
  • Nested ACF fields (Flexible Content, Repeater, Group) on taxonomy terms are translated, automatically and in the editor.
  • Repeater and flexible content sub-fields set to Copy now reach the translations when a row is added outside the post editor, for example with update_field() or a front-end ACF form.
  • A newly translatable custom field marks as 'Needs update' only the translated posts that actually have the field.
  • Changing an ACF field's translation preference also updates existing term translations.
  • ACF field-group labels keep their translations after the Advanced Custom Fields Multilingual 2.2 migration.
  • Upgrading from WPML 4.x no longer restores old custom-field settings after Advanced Custom Fields Multilingual's cleanup, which kept unneeded data loading.
  • In Custom Fields Translation, a preference picked while search results load is kept, instead of being lost after 'Data saved'.
  • Saving a translation through the REST API from an outside client no longer runs a full custom-field sync each time.
  • Custom fields written after WPML copies a post's fields still reach its translations.
  • Changing a word in an ACF Link field on the Taxonomy translation screen keeps the translated link.
  • Changing an ACF field to Copy, Copy once or Don't translate in WPML Settings updates the existing translations.

Fixes for media and images

  • Media Translation: a translated block-editor page keeps its own image after the translation is saved on object cache hosting.
  • Completing a translation job that carries media no longer creates orphan attachment copies in every secondary language.
  • A query for an attachment in a secondary language returns its translation, or the attachment itself, fixing Enfold Color Section backgrounds.
  • An image a page builder names by its URL shows the media texts of the page's language.
  • Page-builder images, such as a Divi section background, show the right original texts in the translation editor and save to the right image.
  • An image without a usable address in a widget or content no longer causes an object cache error on every page load.

Fixes for posts and pages

  • Custom post type posts no longer vanish from admin lists after a wpml-config.xml file makes the type translatable; affected sites are repaired on update.
  • Deleting, trashing or restoring a translated post from a scheduled task or front-end form applies to its translations, as in the admin.
  • Saving a post whose database row disappeared no longer stops with a fatal error.
  • Restoring a post from the Trash keeps its translations' status; draft and private translations no longer come back published.
  • A scheduled post no longer publishes its trashed or unfinished translations on its date when publishing dates are copied to translations.
  • Front-end requests no longer crash with infinite recursion while resolving the current language.
  • Updating a post whose language is disabled keeps that language, and saving a post no longer disconnects another of its translations.
  • Checking a post id that matches no post no longer produces PHP warnings.

Fixes for compatibility with other plugins and themes

  • Other plugins' admin pages, such as Slider Revolution and Avada options, load their scripts again with WPML active.
  • No critical error on every page when another plugin, such as the Tatsu builder, looks up posts while plugins are loading.
  • When another plugin fails while WordPress loads, the site shows WordPress's critical-error page again, not a blank page.
  • WPML restores the site's language when another plugin, such as WP All Export Pro, switches it and never switches it back.
  • Cache plugins that flush the object cache no longer cause 'Commands out of sync' database errors, because WPML reads its page settings once.
  • Yoast SEO sitemaps list each translated post under its own URL when WPML SEO is not active.
  • WPML SEO translates the text values of every Rank Math schema type.
  • The Events Calendar: the root page no longer appears blank with 'Integrate events in main blog loop' enabled.

Fixes for admin screens and settings

  • A site whose stored WPML setting was removed, by a cleanup plugin or a partial restore, gets it back from WPML's saved copy.
  • Settings saved while WPML is finalizing its database update are no longer lost.
  • Troubleshooting: rebuilding the cache for a single URL runs reliably in the background, and the Rebuild click is no longer lost.
  • The 'Your automatic translation pricing has been upgraded' notice shows only to users who can manage translations.
  • Settings search: the Theme and plugins localization entry scrolls to the Localization options under Compatibility.
  • The old Theme and plugins localization address leads to Settings > Compatibility with the theme and plugin scan shown.
  • Requests that run during WPML Reset can no longer re-create WPML's tables and settings.
  • WPML Reset from the Network Admin also checks for secondary languages first.
  • Removing Translation Priority no longer writes a false 'item deleted' record on upgrading sites.
  • The notice shown when WPML's admin health check fails names the request that failed.
  • Support > Communication log stays readable after Refresh services.
  • Changing the translation engine is reported in the site's daily check-in with wpml.org.
  • The "Same as default" tooltip in WPML's language settings can now be translated.
  • In admin REST requests, switching the locale applies to translations as expected.

Fixes for databases and multisite

  • On database clusters that refuse named locks, such as Percona XtraDB strict mode, WPML switches to a table-based lock and keeps working.
  • WPML creates its tables with a matching character set and collation on MariaDB 11.
  • WPML creates all its tables with one character set and collation, and a notice names any table the database refuses to create.
  • On databases that refuse named locks, the Installer log is written without a database error.
  • Multisite: network sites where WPML is inactive, or active but not set up, no longer log errors about a missing languages table.

Other fixes

  • String Translation no longer writes a language's translation file from an inactive language sharing its locale, which left strings untranslated.
  • String Translation: a deleted string that came from a block's default text, as in WooCommerce blocks, no longer comes back.
  • Importing a .po file whose translations contain internal links no longer fails with a server error.
  • String Translation registers and imports theme and plugin translation files when WordPress is installed at the server's filesystem root.

Read the release announcement for WPML 5.2 for the full story behind this version.

Update or download

The update is available to all WPML clients with an active subscription — it appears on the Plugins page in your WordPress admin within 24 hours of release. You can also check for it right away under Plugins → Add New Plugin → Commercial. To download and install manually, go to Downloads in your wpml.org account (see the installation instructions) and remember to update all components together without mixing versions.

Need help or want to give feedback? Please use our technical support forum.

See all WPML Multilingual CMS versions