WordPress Multisite: Benutzer basierend auf ihrer Browser-Sprache weiterleiten

Seit ich den Artikel über den Multisite Language Switcher geschrieben habe, erhalte ich viele Fragen wie ich die Hauptseite “/” in meiner WordPress-Multisite-Konfiguration deaktiviert habe.

Die Antwort ist simpel: Ich habe sie nicht deaktiviert, sondern lediglich eine eigene, kleine Theme erstellt, welche sicher stellt, dass jeder Benutzer, der auf die Hauptseite “/” zugreift, auf die korrekte URL – in meinem Fall “/en/” oder “/de/” – weitergeleitet wird.

Der folgende Quelltext ist nicht vollständig von mir. Ich erinnere mich, dass ich einfach im Internet nach einer guten Lösung gesucht und diese nach meinen Bedürfnissen angepasst habe, aber das ist schon eine ganze Weile her. Daher weiß ich nicht mehr woher Teile des Quelltexts ursprünglich herstammen.

Egal, hier jedenfalls der Quelltext der Datei index.php, so wie ich sie aktuell in meiner Weiterleitungs-Theme für diese WordPress-Seite verwende:

<?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
 */

/**
 * Browser-Sprache ermitteln.
 *
 * @param array $allowed_languages Ein Datenfeld der Sprachen, die auf der Seite zur Verfügung stehen.
 * @param string $default_language Die zu verwendende Standardsprache, wenn keine ermittelt werden konnte.
 * @param string $lang_variable Benutzerdefinierte Sprachenunterstützung. Wenn nicht übergeben wird specified $_SERVER['HTTP_ACCEPT_LANGUAGE'] verwendet.
 * @param string $strict_mode Wenn true (Standard) wird der gesamte Sprachencode ("en-us") verwendet und nicht nur der linke Teil ("en").
 * @return string Die ermittelte Browser-Sprache.
 */
function get_lang_from_browser($allowed_languages, $default_language, $lang_variable = NULL, $strict_mode = TRUE) {
    // $_SERVER['HTTP_ACCEPT_LANGUAGE'] verwenden, wenn keine Sprachvariable mitgegeben wurde
    if (NULL === $lang_variable)
        $lang_variable = $_SERVER['HTTP_ACCEPT_LANGUAGE'];

    // Wurde irgendwelche Information mitgeschickt?
    if (empty($lang_variable))
        return $default_language;

    // Den Header auftrennen
    $accepted_languages = preg_split('/,\s*/', $lang_variable);

    // Die Standardwerte einstellen
    $current_lang = $default_language;
    $current_q    = 0;
    // Nun alle mitgegebenen Sprachen abarbeiten
    foreach ($accepted_languages as $accepted_language) {
        // Alle Infos dieser Sprache rausholen
        $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;

        // Sprachcode holen und dann sofort in die Einzelteile trennen
        $lang_code = explode('-', $matches[1]);

        // Wurde eine Qualität mitgegeben?
        if (isset($matches[2]))
            $lang_quality = (float)$matches[2];
        else
            $lang_quality = 1.0;

        // Bis der Sprachcode leer ist...
        while (count($lang_code)) {
            // Prüfen, ob der Sprachcode angeboten wird
            if (in_array(strtolower(join('-', $lang_code)), $allowed_languages)) {
                // Qualität prüfen
                if ($lang_quality > $current_q) {
                    $current_lang = strtolower(join('-', $lang_code));
                    $current_q = $lang_quality;
                    break;
                }
            }
            // Wenn wir im strengen Modus sind, die Sprache nicht versuchen zu minimalisieren
            if ($strict_mode)
                break;

            // Den rechtesten Teil des Sprachcodes abschneiden
            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();
?>

Sie müssen also lediglich ein neues Theme-Verzeichnis anlegen und den obigen PHP-Quelltext (wenn nötig natürlich noch die erlaubten Sprachen anpassen) in eine Datei namens index.php kopieren.

Danach ist nur noch zusätzlich eine Dummy-Datei style.css mit einigen Infos zum Theme zu erstellen. Ansonsten wird WordPress Ihre Theme nicht erkennen:

/*
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
*/

Das war’s: Nachdem Sie diese neue Theme für Ihre Hauptseite “/” ausgewählt haben, wir automatisch jeder Benutzer auf die korrekte Spracheversion basierend auf den Browser-Spracheinstellungen weiter geleitet.

Verwenden auch Sie den Multisite Language Switcher für Ihren Blog?

Der Artikel ist auch in English verfügbar.

6 Gedanken zu “WordPress Multisite: Benutzer basierend auf ihrer Browser-Sprache weiterleiten

  1. Hallo, wäre es auch möglich den Code in mein aktuelles Theme Tweny Ten zu implementieren, und zwar so, dass der User bei Erkennung Sprache der Browsersprache Deutsch auf der Seite / bleibt, andernfalls aber auf die entsprechende Blogseite weitergeleitet wird? Es wäre nämlich äußerst aufwendig, jetzt den Hauptblog auf einen Unterblog zu übertragen.

    • Hallo Herr Anton,

      klar, Sie können das obige PHP-Skript ja einfach an den Anfang Ihrer Datei “index.php” der Twenty-Ten-Theme kopieren und bei allen Sprachen außer eben Deutsch auf die jeweilige Unterseite wechseln lassen.

      Beste Grüße
      Andreas Breitschopp

  2. Hallo Andreas,

    kann ich diese Datei auch ohne das Switcher-Plugin verwenden?
    Ich habe in dieser index.php nichts finden können, wo ich einstellen kann, dass z.B. der englichsprachige Besucher auf (m)eine Subdomain “gallery.meineseite.de” und der deutschsprachige auf die Subdomain “galerie.meineseite.de” weitergeleitet werden kann.
    Ist das so ohne Weiteres möglich mit dieser index?
    Danke.

    • Hallo Chris,

      von welchem “Switcher-Plugin” sprichst du?
      Du benötigst jedenfalls kein Plug-In für obiges Skript.

      Wohin du den Benutzer schickst kannst du ja in dem gesendeten Location-Header basierend auf der Benutzersprache (in der Variable “$lang”) selbst entscheiden.

      Grüße
      Andreas

      • ich meinte den Multisite Language Switcher :-)
        Ich hab leider null Ahnung von derartigem Code. Wo muss ich denn in obiger PHP-Datei den Pfad ändern zu meinen gewünschten Sprachseiten?

Hinterlasse einen Kommentar zu Chris Antworten abbrechen

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Sie können folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>