Since I wrote the post about using the Multisite Language Switcher I got many questions asking how I “disabled” the main site “/” in my WordPress Multisite configuration.
The answer is simple: I did not disable it, but just created an own, small redirect theme to make sure every user accessing the main site “/” is redirected to the correct language URL – in my case either “/en/” or “/de/”.
The following source code isn’t completely from me. I remember that I just searched the web for a good solution and changed it as I needed it, but that’s a longer time ago. Therefore no idea where parts or this code are from originally.
Anyway, here is the source code of the file index.php of my redirect theme just as I use it on this WordPress site right now:
<?php
/**
* The main template file.
*
* This is the most generic template file in a WordPress theme
* and one of the two required files for a theme (the other being style.css).
* It is used to display a page when nothing more specific matches a query.
* E.g., it puts together the home page when no home.php file exists.
* Learn more: http://codex.wordpress.org/Template_Hierarchy
*
* @package WordPress
* @subpackage Redirect
*/
/**
* Detect browser language.
*
* @param array $allowed_languages An array of languages that are available on the site.
* @param string $default_language Default language to use if none could be detected.
* @param string $lang_variable Custom user language support. If not specified $_SERVER['HTTP_ACCEPT_LANGUAGE'] is used.
* @param string $strict_mode If true (default) the whole language code ("en-us") is used and not only the left part ("en").
* @return string The detected browser language.
*/
function get_lang_from_browser($allowed_languages, $default_language, $lang_variable = NULL, $strict_mode = TRUE) {
// Use $_SERVER['HTTP_ACCEPT_LANGUAGE'] if no language variable is available
if (NULL === $lang_variable)
$lang_variable = $_SERVER['HTTP_ACCEPT_LANGUAGE'];
// Any info sent?
if (empty($lang_variable))
return $default_language;
// Split the header
$accepted_languages = preg_split('/,\s*/', $lang_variable);
// Set default values
$current_lang = $default_language;
$current_q = 0;
// Now work through all included languages
foreach ($accepted_languages as $accepted_language) {
// Get all info about this language
$res = preg_match(
'/^([a-z]{1,8}(?:-[a-z]{1,8})*)'.
'(?:;\s*q=(0(?:\.[0-9]{1,3})?|1(?:\.0{1,3})?))?$/i',
$accepted_language,
$matches
);
if (!$res)
continue;
// Get language code and split into parts immediately
$lang_code = explode('-', $matches[1]);
// Is there a quality set?
if (isset($matches[2]))
$lang_quality = (float)$matches[2];
else
$lang_quality = 1.0;
// Until the language code is empty...
while (count($lang_code)) {
// Check if the language code is available
if (in_array(strtolower(join('-', $lang_code)), $allowed_languages)) {
// Check quality
if ($lang_quality > $current_q) {
$current_lang = strtolower(join('-', $lang_code));
$current_q = $lang_quality;
break;
}
}
// If we're in strict mode we won't try to minimalize the language
if ($strict_mode)
break;
// Cut the most right part of the language code
array_pop($lang_code);
}
}
return $current_lang;
}
$allowed_langs = array('en', 'de');
$lang = get_lang_from_browser($allowed_langs, 'en', NULL, FALSE);
header('Location: http://' . $_SERVER['HTTP_HOST'] . "/$lang/");
exit();
?>
So just create a new theme folder and copy the PHP code above (change the allowed languages if needed, of course) into a file named index.php.
Then you just need to create an additional dummy file style.css with some info about the theme. Otherwise WordPress won’t recognize your theme:
/*
Theme Name: Redirect
Theme URI: http://wordpress.org/extend/themes/redirect
Author: AB-WebLog.com
Author URI: http://www.ab-weblog.com
Description: Redirects
Version: 1.0
Tags: redirect
*/
That’s it: after you have seleted this new theme for your main site “/”, every user will automatically be redirected to the correct language version based on the browser language settings.
Do you use the Multisite Language Switcher or your blog, too?