Create a fast translation network on WordPress multisite.
WARNING: MultilingualPress 2 works with WordPress’s latest version, but is incompatible with the Gutenberg editor, which is available as part of WordPress 5.0 and later. BEFORE you update your WordPress to version 5.0, please read our MultilingualPress and WordPress 5.0 guide.
Exciting news! MultilingualPress (version 3 and higher) is available for Pro users! Fully refactored, based on PHP 8, Gutenberg support, improved UI, and optimized for WooCommerce. Get it here!
Have you ever wondered who is behind MultilingualPress?We are Inpsyde, the biggest WordPress Agency in Europe: building plugins and websites with high-quality code for the biggest companies in the World. Our love of WordPress and commitment to 100% remote work, community, and personal development has helped us grow into what we are today. We want you, a proven WordPress Powerhouse, to help us maintain our high standards and reach new heights of success. Apply now, and let’s build something amazing together!
Please note: you can’t update MultilingualPress 2 to the Pro version of MultilingualPress as usual since this is a complete refactor. We are working on a Migration tool available as an alpha version on GitHub. A tutorial for the migration tool can be found here.
Run each language in a separate site of your WordPress multisite and connect the content in a lightweight user interface. Create a language switcher in your custom menu or use a customizable widget to let your users easily select the desired language version.
This plugin lets you connect an unlimited amount of sites with each other. Set a main language for each site, create relationships (connections), and start writing. Now you get a new field to create a linked post on all connected sites automatically.
They are accessible via the post/page editor screen – you can switch back and forth to translate them.
Unlike most other translation plugins, there is no lock-in effect: when you disable our plugin, all sites will still work as separate sites without any data loss or garbage output.
Our Language Manager offers 174 languages, and you can edit them.
MultilingualPress 2 does ot benefit from free or ad hoc support.
We also offer premium support for the Pro version (MultilingualPress version 3 and higher) to save you time.
You get direct help from the developers of the plugin and support from the development. This also includes support for MultilingualPress 2, but no maintenance is provided for this older plugin version.
The team at Inpsyde has been engineering the Web since 2006.
If you’re new to WordPress multisite, you might find our WordPress multisite installation
tutorial helpful.
Use the installer via back-end of your install or …
/wp-content/plugins/
directory.New columns in the site list table for the Relationships (i.e., connections with other sites) and the Site Language.
New settings tab on the Edit Site page.
New settings tab on the Add New Site page.
Plugin settings, including Custom Post Type translation.
The Language Manager.
Dashboard widget informing about currently untranslated posts.
Translate a post directly from the Edit Post page, and set the translation status and Trasher setting.
Translate a term directly from the Add New Category page.
Edit term translations on the Edit Category page.
New user settings for the sitewide Backend Language and the Language Redirect.
New Language Switcher widget.
Frontend view of a post showing both the Quicklinks and the Language Switcher widget.
MultilingualPress is recommended by WP Engine as a solution for multilingual websites.
No, it will not. It manages relationships between sites and translations, but it doesn’t change the content.
That would require changes to the way WordPress stores post content. Other plugins do that; we think this is wrong,
because it creates a lock-in: you would lose access to your content after the plugin deactivation.
Yes, just have a look at our WordPress multisite installation
tutorial.
multilingualpress.deleted_tables
filter to skip table deletion, see #323.__block_editor_compatible_meta_box
with false
value to translation metabox, see #320.STRICT_TRANS_TABLES
in @@sqlmode
, see #302 and #303, props @rebeccahum, @nickdaugherty.multilingualpress.is_related_post_editable
, for the remote post editing capability check.multilingualpress.remote_post_search_arguments
, to manipulate the query arguments for the remote post search.multilingualpress.quicklinks_nofollow
, to render nofollow quicklinks, see #251.multilingualpress.active_taxonomies
, to modify the allowed taxonomies, see issue #282.multilingualpress.render_hreflang
, to force or prevent rendering.multilingualpress.hreflang_post_status
, to restrict post translations, and only query published posts, see issue #276 and issue #277.post_status
, to restrict post translations.multilingualpress.redirect_post_status
, to restrict post redirect targets, and only query published posts, see pull request #278, props @diedexx.$args
argument to Mlp_Language_Negotiation::get_redirect_matches()
and pass it on to Mlp_Language_Api::get_translations()
, see pull request #271, props @diedexx.content_id
to redirect matches, see pull request #271, props @diedexx.multilingualpress.redirect_targets
, to manipulate the found redirect targets, see pull request #265, props @diedexx.multilingualpress.hreflang_type
and multilingualpress.hreflang_translations
, see pull request #267, props @diedexx.hreflang
HTTP headers to 11
.Mlp_Null_Language
and Mlp_Null_Translation
.Mlp_Null_Translation
in favor of null
.hreflang
HTTP header and HTML element output.Mlp_Helpers::get_language_flag()
(and thus mlp_get_language_flag()
) throwing a warning for non-custom flag images.strict
flag.hreflang
HTTP Headers and HTML <link />
tags being provided on paged requests.(get_)home_url()
for all front-end requests/URLs, seeMlp_Helpers::show_linked_elements()
output, seewp_get_sites()
function, seeswitch_theme
action when a site has been duplicated.get_term_by_term_taxonomy_id
cache for term translator, props vaurdan.get_posts()
call, props vaurdan.network_site_new_form
action hook (where available) instead of injecting markup with jQuery. Yay!hreflang
links and headers, see issue #202, propspost_name
through urldecode
to account for non-ASCII characters, seeml_type
value of duplicated custom post type posts, seemultilingualpress
to multilingual-press
with the next (major) release. So, in case you arestate_modules
site option on uninstall, props tiagoschenkel.realpath()
for plugin file in requirements check to allow for symlinked plugin folder, see$wpdb
object to inpsyde_mlp_init
and inpsyde_mlp_loaded
hooks.checkup_blog_message()
and checkup_blog()
.get_relations()
.get_name()
.Mlp_Db_Table_List_Interface
interface and Mlp_Db_Table_List
class.replace_string()
in Mlp_Db_Replace
.Mlp_Db_Replace
class.mlp_hreflang_html
and mlp_hreflang_http_header
filters in Mlp_Hreflang_Header_Output
class.mlp_translations
filter in Mlp_Language_Api
class.mlp_dashboard_widget_access
filter in Mlp_Dashboard_Widget
class.Mlp_Term_Translation
class.mlp_show_translation_completed_checkbox
filter in Mlp_Dashboard_Widget
class.README.md
file, see issue #86.mlp_linked_element_link
filter, seehreflang
attribute to quicklinks, seehtml
tag, see issue #118.admin-ajax.php
or not, seeMlp_Language_Api
class, props iamntz.hfreflang
attribute for content’s own language, seemlp_pre_save_postdata
and mlp_pre_update_post
.get_blog_language()
in favor of mlp_get_blog_language()
.SCRIPT_DEBUG
and MULTILINGUALPRESS_DEBUG
are not set.Mlp_Language_Api::get_translations()
.glob()
on Solaris systems.head
element.mlp_site_relations
. This is faster than the previouswidth
and height
for flagsuninstall.php
to clean up on deletion properlyca
accidentally.readonly
, not disabled
to make copy and paste easier.inc/language-list.php
to get languages in native and English writing by ISO codes.Mlp_Db_Replace
to update multiple tables and columns at once.