Multisite Language Switcher ins Menü einbauen

Mir ist kürzlich aufgefallen, dass ich noch nie richtig erklärt habe, wie man den Multisite Language Switcher (recht) einfach in die Navigationsmenüs von WordPress einbauen kann. Wie man die neuen Menüs selbst in das Thema einbaut und benutzt, will ich aber nicht noch einmal erklären. Es gibt zu diesem Thema bereits unzählige Posts. Empfehlenswert ist beispielsweise der Artikel WordPress als CMS: Menüs im Admin-Bereich anlegen und verwalten von Ellen.

Am besten ich zeige erst einmal etwas PHP-Code, den ich dann exemplarisch für die Erläuterungen zur Funktionalität heranziehen kann. Die Funktionen sind als Filter implementiert, die automatisch von WordPress ausgeführt werden, sobald die entsprechenden Hooks (wenn man so will auch: Ereignisse) erreicht werden. Ich habe die Beispiele in diesem Artikel auch bewusst einfach gehalten, damit ihr nicht gleich den Mut verliert, wenn ihr selbst versuchen wollt, damit in der functions.php eures Themas zu experimentieren.

Vergesst bitte nicht, eure Originaldatei vorher noch einmal als Sicherheitskopie abzuspeichern!

1) Menü erweitern


<?php
function my_custom_menu_item( $items, $args ) {
if ( class_exists( 'MslsOutput' ) && 'primary-nav' == $args->theme_location ) {
$obj = new MslsOutput;
foreach ( $obj->get( 0 ) as $item ) {
$items .= '<li>' . $item . '</li>';
}
}
return $items;
}
add_filter( 'wp_nav_menu_items', 'my_custom_menu_item', 10, 2 );

view raw

menu-msls-1.php

hosted with ❤ by GitHub

Die Funktion my_custom_menu_item sorgt dafür, dass der Sprachumschalter an ein bestimmtes Menü angehängt wird. Am Anfang der Funktion wird erst einmal geprüft, ob der Multisite Language Switcher überhaupt aktiv ist und ob es sich um das Menü primary-nav handelt. Die Benennung hängt natürlich davon ab, mit welchen Argumenten die Funktion register_nav_menus aufgerufen wurde, um das/die Menü(s) in eurem Thema zu aktivieren. Sucht einfach nach dieser  Funktion in der functions.php! Der Aufruf $obj->get( 0 ) holt die Sprachlinks in der Kombination Flagge + Sprache (außerdem gibt es noch 1 = nur Text, 2 = nur Flagge und 3 Sprache + Flagge). Prinzipiell könnte man bereits in der foreach-Schleife an der Ausgabe der Links arbeiten, aber das wird bei komplexeren Szenarien schnell unsauber, sodass die folgende Funktion eine bessere Lösung bietet.

2) Links anpassen


<?php
function my_msls_output_get( $url, $item, $current ) {
return sprintf(
'<a href="%s" title="%s"%s>%s</a>',
$url,
$item->txt,
( $current ? ' class="current"' : '' ),
$item
);
}
add_filter( 'msls_output_get', 'my_msls_output_get', 10, 3 );

view raw

menu-msls-2.php

hosted with ❤ by GitHub

Die Funktion my_msls_output_get ist für die Gestaltung der Links zuständig. Die Variablen, welche an die Funktion übergeben werden, sind – denke ich – ausreichend, um an der Ausgabe feilen zu können.

Der Parameter $url sollte eigentlich selbsterklärend sein. Er enthält das Linkziel zur entsprechenden Sprache.

Der Parameter $item ist ein MslsLink-Objekt, welches die Eigenschaften $src (URL zur Flagge), $txt (Beschreibung aus der Konfiguration) und $alt (Sprachcode der Website bsp. de-DE) besitzt. Man kann ein MslsLink-Objekt auch direkt ausgeben. Es präsentiert dann seine vordefinierte Ausgabe.

Der Parameter $current wiederum signalisiert, ob es sich um die aktuelle Website handelt, was natürlich nur wahr sein kann, wenn man das in der Konfiguration des Multisite Language Switcher auch so eingestellt hat, dass auch die Links zu aktuellen Seite ausgegeben werden sollen.

3) Alternativ eigene MslsLink-Klasse benutzen


<?php
function my_msls_link_create() {
return new MyMenuMslsItem();
}
add_filter( 'msls_link_create', 'my_msls_link_create' );
class MyMenuMslsItem extends MslsLink {
protected $format_string = '<img src="{src}" alt="{alt}"/> <strong>{txt}</strong>';
}

view raw

menu-msls-3.php

hosted with ❤ by GitHub

Alternativ – oder aber auch zusätzlich, je nach Aufgabenstellung – kann dieser Schritt benutzt werden, wenn es darum geht, die Ausgabe im Link genauer zu steuern. Während sich der Code in Schritt 2 darum kümmert, wie der Link selbst gestaltet wird, kann man mit den wenigen Zeilen dieses Schritts steuern, was passiert, wenn das MslsLink-Object (in Schritt 2 das Object $item) als Zeichenkette ausgegeben wird.

Wenn die vordefinierten Eigenschaften src, alt und txt genug sind, reicht es aus, der eigenen Klasse lediglich einen angepassten format_string zuzuweisen, der den Anforderungen gerecht wird. Das obige Beispiel zeigt den Linktext nach der Flagge fett gedruckt an.

Have fun!

68 Gedanken zu „Multisite Language Switcher ins Menü einbauen“

  1. Sehr interessantes Plugin. Da ich schön länger mit dem Gedanken gespielt habe einen zweisprachigen Blog ins Leben zu rufen muss ich – aufgrund dieser einfachen Lösung – jetzt wohl und habe keine Ausreden mehr.

  2. Sehr interessantes Plugin. Da ich schön länger mit dem Gedanken gespielt habe einen zweisprachigen Blog ins Leben zu rufen muss ich – aufgrund dieser einfachen Lösung – jetzt wohl und habe keine Ausreden mehr.

  3. 1A Lösung für mehrsprachige Websites und gute Dokumentation. Alles klappt auf Anhieb.
    Gibt es eine Möglichkeit wenn „global“ zwischen den Sprachen gewechselt wird die jeweilige Seite beizubehalten?

      1. bei mir wird beim sprachwechsel immer auf die wordpress startseite der jeweiligen sprache gewechselt. es wäre schön wenn die aktuelle seite bleiben würde und nur die sprache (der content etc.) wechselt… evtl. ganz einfach?

          1. @realloc Die Frage war, ob der Klick auf den Sprachumschalter die derzeit aufgerufene Seite “umschalten” kann, also ein “Switch current page”. Mit der Anleitung oben klappt das derzeit nicht, der Link führt immer auf die Startseite. Das würde mich auch interessieren!

          2. Ich habe die Frage anders verstanden. Die Sache ist ja, dass der Switcher Seiten verbindet, die Resourcen für sich darstellen. Das findet bereits im Header statt, wo die canonical links geschrieben werden (um ein Beispiel zu geben). Es gibt ja auch die Möglichkeit, keine Flagge anzuzeigen, wenn keine Übersetzung existiert. Wäre das das erwünschte Verhalten?

  4. 1A Lösung für mehrsprachige Websites und gute Dokumentation. Alles klappt auf Anhieb.
    Gibt es eine Möglichkeit wenn „global“ zwischen den Sprachen gewechselt wird die jeweilige Seite beizubehalten?

      1. bei mir wird beim sprachwechsel immer auf die wordpress startseite der jeweiligen sprache gewechselt. es wäre schön wenn die aktuelle seite bleiben würde und nur die sprache (der content etc.) wechselt… evtl. ganz einfach?

          1. @realloc Die Frage war, ob der Klick auf den Sprachumschalter die derzeit aufgerufene Seite “umschalten” kann, also ein “Switch current page”. Mit der Anleitung oben klappt das derzeit nicht, der Link führt immer auf die Startseite. Das würde mich auch interessieren!

          2. Ich habe die Frage anders verstanden. Die Sache ist ja, dass der Switcher Seiten verbindet, die Resourcen für sich darstellen. Das findet bereits im Header statt, wo die canonical links geschrieben werden (um ein Beispiel zu geben). Es gibt ja auch die Möglichkeit, keine Flagge anzuzeigen, wenn keine Übersetzung existiert. Wäre das das erwünschte Verhalten?

  5. Hy Dennis, sag mal hat das Plugin einen „Language-Checker“ eingebaut der dem Besucher gleich auch die richtige Sprache anzeigt wenn der Besucher mit dem entsprechenden Brower bzw. der entsprechenden Länderkennung zu Besuch kommt?

  6. Hy Dennis, sag mal hat das Plugin einen „Language-Checker“ eingebaut der dem Besucher gleich auch die richtige Sprache anzeigt wenn der Besucher mit dem entsprechenden Brower bzw. der entsprechenden Länderkennung zu Besuch kommt?

    1. @sovus Das sollte – für mein Empfinden – bereits vor dem Einbau eines Plugins für Mehrsprachigkeit (wenigstens) in der Planung gewesen sein. 😉

    1. @sovus Das sollte – für mein Empfinden – bereits vor dem Einbau eines Plugins für Mehrsprachigkeit (wenigstens) in der Planung gewesen sein. 😉

  7. hey danke für die Anleitung, was meint ihr wieviel mehr Besucher sowas bringt wenn man auf zwei Sprachig Anbietet ? Für einen Blog ist es ja schon irgendwie ne menge Arbeit alles zu übersetzen. Sollte sich ja auch irgendwie zumindest Besuchertechnisch lohnen.

    1. @sascha Aus der eigenen Erfahrung heraus würde ich sagen, dass sich das nur lohnt, wenn man da genauso viel Fleiß hineinsteckt, wie in das Hauptblog geflossen ist. Andererseits wird WordPress auch als CMS eingesetzt und da findet man in den Anforderungen ja oft Mehrsprachigkeit als ein Kriterium.

  8. hey danke für die Anleitung, was meint ihr wieviel mehr Besucher sowas bringt wenn man auf zwei Sprachig Anbietet ? Für einen Blog ist es ja schon irgendwie ne menge Arbeit alles zu übersetzen. Sollte sich ja auch irgendwie zumindest Besuchertechnisch lohnen.

    1. @sascha Aus der eigenen Erfahrung heraus würde ich sagen, dass sich das nur lohnt, wenn man da genauso viel Fleiß hineinsteckt, wie in das Hauptblog geflossen ist. Andererseits wird WordPress auch als CMS eingesetzt und da findet man in den Anforderungen ja oft Mehrsprachigkeit als ein Kriterium.

  9. Abgefahrenes Plugin, bin begeistert! Vielen Dank!

    Was aber noch geiler wäre wenn der Parent-Menüpunkt „Sprachen“ heissen würde und es dann Unterseiten wie „Englisch“ und „Dänisch“ geben könnte…

    Geht das? 😉

  10. Abgefahrenes Plugin, bin begeistert! Vielen Dank!

    Was aber noch geiler wäre wenn der Parent-Menüpunkt „Sprachen“ heissen würde und es dann Unterseiten wie „Englisch“ und „Dänisch“ geben könnte…

    Geht das? 😉

  11. Hallo
    gibt es eine Möglichkeit die Flagge der aktuellen Sprache nicht anzuzeigen.
    Konkret möchte ich auf der deutschen Seite nur die englische Flagge und umgekehrt im Menü haben.
    Geht das und wie sieht der entsprechende Code aus?

    Gruss

  12. Hallo
    gibt es eine Möglichkeit die Flagge der aktuellen Sprache nicht anzuzeigen.
    Konkret möchte ich auf der deutschen Seite nur die englische Flagge und umgekehrt im Menü haben.
    Geht das und wie sieht der entsprechende Code aus?

    Gruss

  13. Hallo
    Vielen Dank für die Anleitung. Wir benutzen The7 Theme von DreamTheme. An welcher Stelle in der functions.php soll denn der Code einegfügt weden, Wenn ich es mache zerhaut es immer alles.

    1. Hmm … das sollte keine Probleme bereiten. Der Code kann ruhig ans Ende der functions.php, nur musst Du darauf achten, die erste Zeile mit dem <?php aus den Beispielen nicht zu kopieren.

  14. Hallo
    Vielen Dank für die Anleitung. Wir benutzen The7 Theme von DreamTheme. An welcher Stelle in der functions.php soll denn der Code einegfügt weden, Wenn ich es mache zerhaut es immer alles.

    1. Hmm … das sollte keine Probleme bereiten. Der Code kann ruhig ans Ende der functions.php, nur musst Du darauf achten, die erste Zeile mit dem <?php aus den Beispielen nicht zu kopieren.

  15. Hallo,

    erstmal *thumps up* für dieses Plugin. Hatte einige andere auf meiner Seite installiert, aber dieses ist nun wirklich das Beste!
    Leider bekomme ich trotz deiner Anleitung den Sprachwechsler nicht auf die gleiche Ebene wie das Navigationsmenu (bin auch ein zimlicher Noob in WP…).
    Ich benutze ein Genesis Theme (Parallax Pro). Wenn ich den Code von Punkt 1 in die function.php einfüge… passiert rein gar nichts. Was genau muss ich am Code verändern?

  16. Hallo,

    erstmal *thumps up* für dieses Plugin. Hatte einige andere auf meiner Seite installiert, aber dieses ist nun wirklich das Beste!
    Leider bekomme ich trotz deiner Anleitung den Sprachwechsler nicht auf die gleiche Ebene wie das Navigationsmenu (bin auch ein zimlicher Noob in WP…).
    Ich benutze ein Genesis Theme (Parallax Pro). Wenn ich den Code von Punkt 1 in die function.php einfüge… passiert rein gar nichts. Was genau muss ich am Code verändern?

  17. hallo,

    ich hatte vorher mit wpml gearbeitet und muss sagen, dass mir die lösung mit multisite und dem language-switcher tausendmal besser gefällt. vielen dank für das tolle plugin!!!

    ich habe nun noch eine relativ dummer frage: meine php-kenntnisse sind gleich null und ich würde den switcher gerne ans hauptmenü meines themes hängen. soweit ich das verstanden habe, sollte es mit dem code bei 1) klappen. muss ich da noch irgendwas anpassen? bei mir tut sich absolut gar nichts (the7.2 theme). in der erklärung heißt es ja, man solle nach „register_nav_menus“ in der functions.php suchen. ich kann diese funktion leider auch nach ausgiebiger suche in anderen dateien meines themes nicht finden.

    für einen tip wäre ich sehr dankbar!

    gruß philipp

  18. hallo,

    ich hatte vorher mit wpml gearbeitet und muss sagen, dass mir die lösung mit multisite und dem language-switcher tausendmal besser gefällt. vielen dank für das tolle plugin!!!

    ich habe nun noch eine relativ dummer frage: meine php-kenntnisse sind gleich null und ich würde den switcher gerne ans hauptmenü meines themes hängen. soweit ich das verstanden habe, sollte es mit dem code bei 1) klappen. muss ich da noch irgendwas anpassen? bei mir tut sich absolut gar nichts (the7.2 theme). in der erklärung heißt es ja, man solle nach „register_nav_menus“ in der functions.php suchen. ich kann diese funktion leider auch nach ausgiebiger suche in anderen dateien meines themes nicht finden.

    für einen tip wäre ich sehr dankbar!

    gruß philipp

  19. Hallo,
    Ich habe alles jetzt implementiert in meiner lokalen WP Multisite Version. Das Plugin mslsmenu wird auch in der Navi-bar angezeigt mit meinen beiden Flaggen für FR und DE wenn ich auf EN bin. Die Startseiten in den Menues sind auch verlinkt. Soweit alles parametriert jedoch wenn ich auf die Flage mit der Maus drücke zeigt es mir nur den Link am Mausezeiger an aber lädt diesen nicht!
    Hast Du da eine Idee kann ich einen Screenshot schicken?

    Grüsse
    Andreas

    1. Ich nehme an, dass ich auf dem Screenshot nicht so viel erkennen kann, wenn es für Dich bereits stimmig aussieht. Sind denn die Tags alle geschlossen?

  20. Hallo,
    Ich habe alles jetzt implementiert in meiner lokalen WP Multisite Version. Das Plugin mslsmenu wird auch in der Navi-bar angezeigt mit meinen beiden Flaggen für FR und DE wenn ich auf EN bin. Die Startseiten in den Menues sind auch verlinkt. Soweit alles parametriert jedoch wenn ich auf die Flage mit der Maus drücke zeigt es mir nur den Link am Mausezeiger an aber lädt diesen nicht!
    Hast Du da eine Idee kann ich einen Screenshot schicken?

    Grüsse
    Andreas

    1. Ich nehme an, dass ich auf dem Screenshot nicht so viel erkennen kann, wenn es für Dich bereits stimmig aussieht. Sind denn die Tags alle geschlossen?

Schreibe einen Kommentar

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