WP language switcher
A multisite is built in the WordPress CMS feature. We can create a network of sites that use the common administration panel and the same website root url address. Each subsite can use a different language on frontend. A multilingual WP website needs some Lang Switcher to be added.
Language switcher
Here is a PHP snippet for a simple navbar menu with links to subsite homepages. The Lang Menu allows the user to switch between languages. The active CSS class (btn-dark) will highlight the currently active language.
<?php
// header.php
$blog_id = get_current_blog_id();
$en_active_class = 'btn-dark';
$de_active_class = 'btn-primary';
if($blog_id == 2) {
// DE Language
$en_active_class = 'btn-primary';
$de_active_class = 'btn-dark';
}
?>
<ul class="nav">
<li class="nav-item me-lg-5 me-3">
<a href="/" class="btn btn-sm <?php echo $en_active_class; ?>">EN</a>
<a href="/de/" class="btn btn-sm <?php echo $de_active_class; ?>">DE</a>
</li>
<li class="nav-item"><a href="/contact" target="_blank" class="text-decoration-none text-white fs-7"><i class="las la-clipboard-list la-2x u-ico-va me-2"></i><?php esc_attr_e( 'Contact'); ?></a></li>
</ul>
Select switcher
We can also prepare a language widget as select, first element ‘Language’ will be added as an option with the disabled parameter. Based on current blog_id we will select a currently active language item. After the option selection, the user will be redirected to proper path url.
// header.php - LangSwitcher as Select
$current_blog_id = get_current_blog_id();
$lang_select_switcher = '<select style="width:90px;" class="form-control" onchange="this.options[this.selectedIndex].value && (window.location = this.options[this.selectedIndex].value);">';
$lang_select_switcher .= '<option disabled="disabled">'. __('Language') .'</option>';
$blogs_ids = (object) array(
(object) array('blog_id' => 1, 'path' => '/', 'blogname' => 'EN'),
(object) array('blog_id' => 2, 'path' => '/de/', 'blogname' => 'DE'),
(object) array('blog_id' => 3, 'path' => '/es/', 'blogname' => 'ES')
);
foreach( $blogs_ids as $lang ){
$selected = '';
if( $current_blog_id == $lang->blog_id) {
$selected = 'selected="selected"';
}
$lang_select_switcher .= '<option '. $selected .' value="'. $lang->path .'">'. $lang->blogname .'</option>';
}
$lang_select_switcher .= '</select>';
// render HTML
echo $lang_select_switcher;
Fetch site details from the database
If we don’t want to hardcode blogs_ids in PHP, we can query data from the WordPress database. WP core function get_sites() will fetch all public subsites configured in the Admin Network Area.
// header.php - LangSwitcher as Select
$current_blog_id = get_current_blog_id();
$lang_select_switcher = '<select style="width:90px;" class="form-control" onchange="javascript:location.href = this.value;">';
$lang_select_switcher .= '<option disabled="disabled">'. __('Language') .'</option>';
// fetch list of subsites from database
$blogs_ids = get_sites(['public' => 1]);
foreach( $blogs_ids as $lang ){
$selected = '';
if( $current_blog_id == $lang->blog_id) {
$selected = 'selected="selected"';
}
// get subsite blogname value
$details = get_blog_details( array( 'blog_id' => $lang->blog_id) );
$lang_select_switcher .= '<option '. $selected .' value="'. $lang->path .'">'. $details->blogname .'</option>';
}
$lang_select_switcher .= '</select>';
// render HTML
echo $lang_select_switcher;
Using the Multisite Language Switcher
An alternative option would be to use the free WP plugin developed by Dennis Ploetner: the Multisite Language Switcher. It adds the backend ability to choose translated versions for every page / post, and also to render links as Lang Switcher on the frontend. After plugin configuration, we can use PHP functions to display lang switcher with custom HTML markup:
// functions.php
// helper function
function get_redirect_urls_for_mapped_sites_using_msls_plugin() {
$arr = array();
$blogs = MslsBlogCollection::instance()->get_filtered(false);
if($blogs) {
$mydata = MslsOptions::create();
foreach($blogs as $blog) {
$language = $blog->get_language();
$current = ($blog->userblog_id == MslsBlogCollection::instance()->get_current_blog_id());
if($current) {
continue;
} else {
switch_to_blog($blog->userblog_id);
$url = $mydata->get_permalink($language);
$arr[$blog->blog_id] = $url;
restore_current_blog();
}
}
}
return $arr;
}
And here is where we can define our custom HTML markup for the menu:
// header.php
// Multisite Language Switcher - display menu with links
<div class="lang-menu-switcher">
<ul>
<?php
$redirect_urls = get_redirect_urls_for_mapped_sites_using_msls_plugin();
$current_blog_id = get_current_blog_id();
$sites = get_sites();
foreach($sites as $site) {
$class = '';
if($site->blog_id == $current_blog_id){
$class = 'active';
}
if(isset($redirect_urls[$site->blog_id])) {
$url = $redirect_urls[$site->blog_id];
} else {
$url = $site->path;
}
?>
<li class="<?php echo $class; ?>"><a href="<?php echo $url; ?>"><?php echo str_replace('/','',$site->path); ?></a></li>
<?php
}
?>
</ul>
</div>
That’s it for today’s guideline. Make sure to follow us for other useful suggestions and tips.