Wie MSLS die Blogs im Netzwerk feststellt …

Heute vormittag habe ich die Version 0.8 des Multisite Language Switcher freigegeben. Es gibt eine ganze Menge Neuerungen, welche das Plugin noch weiter abrunden, und ein paar Dinge „unter der Haube“, die den Code übersichtlicher gestalten und schließlich noch performanter machen. Zudem gibt es nun auch die Möglichkeit „von außen einzugreifen“, wenn es darum geht, wie der Switcher die zu verlinkenden Blogs feststellen soll.

Standardmäßig sucht das Plugin alle Blogs im Netzwerk der Multisite-Installation, die dem Administrator des aktuellen Blogs zugeordnet sind. Es kontrolliert, ob eine Konfiguration vorliegt und ob das Blog nicht etwa durch die entsprechende Einstellung in den Optionen ausgeschlossen worden ist. In einigen Setups kann dieses Verhalten durchaus verwirrend oder sogar stöhrend sein.

Vor ein paar Tagen hat mir Peter geschrieben, ob es nicht möglich sei, hier mit einem Filter zu arbeiten, damit man das Verhalten bei Bedarf ändern kann. Wem dieses Konzept noch nicht so geläufig ist, der sollte sich den Abschnitt Hooks, Actions and Filters der WordPress-Dokumentation zur Plugin-API ansehen.

Diese Funktionalität steht nun also auch im Multisite Language Switcher bereit. Allerdings, möchte ich noch einschränkend hinzufügen, ist sie noch als experimentell zu betrachten. Folgender Code soll jedoch schon einmal für etwas mehr Klarheit sorgen, wenn ihr euch nun fragt, wie sich der Filter nun genau nutzen lässt:


<?php
function my_msls_blog_collection_get( $objects ) {
$objects = array();
$blogs = array( 1 => 'Override English', 2 => 'Override Deutsch', );
foreach ( $blogs as $id => $description ) {
$details = get_blog_details( $id );
if ( is_object( $details ) ) {
$objects[$id] = new MslsBlog( $details, $description );
}
}
return $objects;
}
add_filter( 'msls_blog_collection_construct', 'my_msls_blog_collection_get' );

In meinem Beispiel wird das Array, welches ursprünglich bereits MslsBlog-Objekte enthält, komplett überschrieben. Das wirkt vielleicht etwas drastisch, erklärt aber die Funktionsweise viel besser. Der Konstruktor der MslsBlog-Klasse erwartet übrigens ein Objekt – wie es beispielsweise von get_blog_details geliefert wird – und die Beschreibung, die normalerweise aus der Konfiguration des entsprechenden Blogs stammt.

Have fun!

30 Gedanken zu „Wie MSLS die Blogs im Netzwerk feststellt …“

  1. hallo !

    wie bereits angemerkt – vielen danke für deine arbeit !

    Frage bez. des Plugins:
    1. Wie kann ich die aktuell ausgewählte Sprache (bzw. den aktuell ausgewählten Blog feststellen ?

    2. Um die Sprachauswahl / Menue selbst formatieren zu können, würde ich gerne ein Array / Objekt erhalten, das jeweils den link auf das image, die description und den link der verbundenen Übersetzung enthält (ähnlich wie in deiner Ouput Klasse – aber als plain text und ohne href und image Formatierung). Hast du hier einen Tip ?

    3. szenario:
    Auflistung von custom post types (personen), diese besitzten ein custom field mit dem link auf eine page mit der personenliste in dieser sprache (sozusagen die übergeordnete page).
    Im Template für diesen custom type würde ich erkennen das get_msml() entweder kein resultat liefert oder leer ist. Durch das Auslesen meines im post definierten links kann ich auf die Personenlisten – page verweisen, die wiederum mit den entsprechenden Übersetzungen verknüpft ist.

    Würde nun gerne (die ID der verlinkten Page ist mir bekannt) alle mit dieser page verbundenen Übersetzungen erfragen.

    Kurz: habe eine Page ID und möchte im Template alle mit dieser page verbundenen übersetzten Seiten erfragen

    Hast du hierfür eine Idee ?

    Thanks,
    Matthias

  2. hallo !

    wie bereits angemerkt – vielen danke für deine arbeit !

    Frage bez. des Plugins:
    1. Wie kann ich die aktuell ausgewählte Sprache (bzw. den aktuell ausgewählten Blog feststellen ?

    2. Um die Sprachauswahl / Menue selbst formatieren zu können, würde ich gerne ein Array / Objekt erhalten, das jeweils den link auf das image, die description und den link der verbundenen Übersetzung enthält (ähnlich wie in deiner Ouput Klasse – aber als plain text und ohne href und image Formatierung). Hast du hier einen Tip ?

    3. szenario:
    Auflistung von custom post types (personen), diese besitzten ein custom field mit dem link auf eine page mit der personenliste in dieser sprache (sozusagen die übergeordnete page).
    Im Template für diesen custom type würde ich erkennen das get_msml() entweder kein resultat liefert oder leer ist. Durch das Auslesen meines im post definierten links kann ich auf die Personenlisten – page verweisen, die wiederum mit den entsprechenden Übersetzungen verknüpft ist.

    Würde nun gerne (die ID der verlinkten Page ist mir bekannt) alle mit dieser page verbundenen Übersetzungen erfragen.

    Kurz: habe eine Page ID und möchte im Template alle mit dieser page verbundenen übersetzten Seiten erfragen

    Hast du hierfür eine Idee ?

    Thanks,
    Matthias

  3. Hallo Matthias,

    ich gehe mal Deine Fragen der Reihe nach durch:

    1. Wenn das unabhängig vom Plugin funktionieren soll reicht beispielsweise get_blog_option( $blog_id, ‚WPLANG‘ );. Mit dem Plugin ginge das in etwa so MslsBlogCollection::instance()->get_current_blog()->get_language(); … die erste Version liefert bei einem US-Blog in den meisten Fällen einen leeren String. Meine Variante liefert ‚us‘ als Fallback.

    2. Ich hab mir schon gedacht, dass so etwas erfragt wird. 😉 Ich werde das in den nächsten Tagen ändern. Dann kann man die get-Methode in etwa so benutzen, um ein unformatiertes Array zu erhalten:

    $obj = new MslsOutput();
    $arr = $obj->get();

    3. Ich hatte ja schon mal angemerkt, dass ich die Custom Post Types eventuell anfasse, wenn das notwendig sein sollte. Vielleicht wäre jetzt der richtige Zeitpunkt?

    Viele Grüße,
    Dennis.

  4. Hallo Matthias,

    ich gehe mal Deine Fragen der Reihe nach durch:

    1. Wenn das unabhängig vom Plugin funktionieren soll reicht beispielsweise get_blog_option( $blog_id, ‚WPLANG‘ );. Mit dem Plugin ginge das in etwa so MslsBlogCollection::instance()->get_current_blog()->get_language(); … die erste Version liefert bei einem US-Blog in den meisten Fällen einen leeren String. Meine Variante liefert ‚us‘ als Fallback.

    2. Ich hab mir schon gedacht, dass so etwas erfragt wird. 😉 Ich werde das in den nächsten Tagen ändern. Dann kann man die get-Methode in etwa so benutzen, um ein unformatiertes Array zu erhalten:

    $obj = new MslsOutput();
    $arr = $obj->get();

    3. Ich hatte ja schon mal angemerkt, dass ich die Custom Post Types eventuell anfasse, wenn das notwendig sein sollte. Vielleicht wäre jetzt der richtige Zeitpunkt?

    Viele Grüße,
    Dennis.

  5. Hallo Dennis !

    vielen dank für deine antwort – bin schon wirklich gespannt auf die neuen features…

    auch die aussicht custom post types verwenden zu können klingt sehr vielversprechend !

    glaubst du es gibt eine möglichkeit zusätzlich zu den von dir genannten möglichkeiten die im plugin definierten verlinkungen zu einer gegebenen page ID herauszufinden ?

    lg.
    matthias

  6. Hallo Dennis !

    vielen dank für deine antwort – bin schon wirklich gespannt auf die neuen features…

    auch die aussicht custom post types verwenden zu können klingt sehr vielversprechend !

    glaubst du es gibt eine möglichkeit zusätzlich zu den von dir genannten möglichkeiten die im plugin definierten verlinkungen zu einer gegebenen page ID herauszufinden ?

    lg.
    matthias

  7. Sorry, die Frage ist mir scheinbar „durch die Lappen gegangen“. Es sollte auch direkt möglich sein, mit drei Zeilen an die Verlinkung zu kommen:

    $language = 'de_DE';
    $options = MslsOptionsFactory::create();
    echo $options->get_permalink( $language );

  8. Sorry, die Frage ist mir scheinbar „durch die Lappen gegangen“. Es sollte auch direkt möglich sein, mit drei Zeilen an die Verlinkung zu kommen:

    $language = 'de_DE';
    $options = MslsOptionsFactory::create();
    echo $options->get_permalink( $language );

  9. Hallo,
    ich finde das Plugin richtig toll, danke dafür, aber die Diskussion hier ist mir ein bisschen zu hoch, deshalb eine einfache Frage: Kann ich in einer WPMU-Umgebung mehrere Übersetzungsprojekts haben, also z. B.die blogs A-en und B-de gehören zusammen und die blogs C-en und D-de bilden ein Paar und meinetewegen noch E-de, F-it und G-us? Zur Zeit sehe ich nur, dass ich ein Projekt haben kann und dann noch etliche „übersetzungsfreie“ Blogs.
    Gruß
    Dietrich

  10. Hallo,
    ich finde das Plugin richtig toll, danke dafür, aber die Diskussion hier ist mir ein bisschen zu hoch, deshalb eine einfache Frage: Kann ich in einer WPMU-Umgebung mehrere Übersetzungsprojekts haben, also z. B.die blogs A-en und B-de gehören zusammen und die blogs C-en und D-de bilden ein Paar und meinetewegen noch E-de, F-it und G-us? Zur Zeit sehe ich nur, dass ich ein Projekt haben kann und dann noch etliche „übersetzungsfreie“ Blogs.
    Gruß
    Dietrich

  11. Nun habe ich gedacht, dass ich die Lösung selbst gefunden habe, in dem ich für jedes Projekt einen eigenen Administrator eingesetzt habe. Das so auch recht gut aus, bis ich versucht habe, über das Flaggensymbol die Verbindung herzugstellen, da gerate ich regelmäßig in Blogs, die nicht zu diesem Administrator gehören. Hier die Fehlerausschrift

    You attempted to access the „Playground“ dashboard, but you do not currently have privileges on this site. If you believe you should be able to access the „Playground“ dashboard, please contact your network administrator.

    If you reached this screen by accident and meant to visit one of your own sites, here are some shortcuts to help you find your way.
    Your Sites
    Gender Travel Visit Dashboard | View Site
    Test aller mögliche Plugins und weiteres Visit Dashboard | View Site

    Das kommt mir doch wie ein Fehler vor?
    Dietrich

  12. Nun habe ich gedacht, dass ich die Lösung selbst gefunden habe, in dem ich für jedes Projekt einen eigenen Administrator eingesetzt habe. Das so auch recht gut aus, bis ich versucht habe, über das Flaggensymbol die Verbindung herzugstellen, da gerate ich regelmäßig in Blogs, die nicht zu diesem Administrator gehören. Hier die Fehlerausschrift

    You attempted to access the „Playground“ dashboard, but you do not currently have privileges on this site. If you believe you should be able to access the „Playground“ dashboard, please contact your network administrator.

    If you reached this screen by accident and meant to visit one of your own sites, here are some shortcuts to help you find your way.
    Your Sites
    Gender Travel Visit Dashboard | View Site
    Test aller mögliche Plugins und weiteres Visit Dashboard | View Site

    Das kommt mir doch wie ein Fehler vor?
    Dietrich

  13. @Dietrich Es gibt mindestens 2 Möglichkeiten, mehrere „Gruppen“ einzurichten.

    Am einfachsten ist es, wenn man mit verschiedenen User-Accounts arbeitet, denen die entsprechenden Blogs als Admins zugeordnet werden.

    Eine weitere Möglichkeit besteht darin, dies beispielsweise in der functions.php mittels Code einzurichten, wenn die Gruppen unterschiedliche Themen verwenden.

  14. @Dietrich Es gibt mindestens 2 Möglichkeiten, mehrere „Gruppen“ einzurichten.

    Am einfachsten ist es, wenn man mit verschiedenen User-Accounts arbeitet, denen die entsprechenden Blogs als Admins zugeordnet werden.

    Eine weitere Möglichkeit besteht darin, dies beispielsweise in der functions.php mittels Code einzurichten, wenn die Gruppen unterschiedliche Themen verwenden.

  15. @Dietrich Ich habe das mal eben auf meinem Testblog durchgezogen. Zuerst habe ich einen neuen User angelegt, dem ich dann auch gleich 2 neue Blogs gegeben habe. Danach habe ich mich aus- und mit dem entsprechenden User eingeloggt.

    Wichtig ist an dieser Stelle, die Konfiguration des Plugins in allen Blogs durchzuführen. Danach funktionierte bei mir alles reibungslos.

    Der von Dir beschriebene Screen wird angezeigt, sobald Du versuchst, auf das Backend eines Blogs zuzugreifen, welches dem aktuellen User nicht gehört.

  16. @Dietrich Ich habe das mal eben auf meinem Testblog durchgezogen. Zuerst habe ich einen neuen User angelegt, dem ich dann auch gleich 2 neue Blogs gegeben habe. Danach habe ich mich aus- und mit dem entsprechenden User eingeloggt.

    Wichtig ist an dieser Stelle, die Konfiguration des Plugins in allen Blogs durchzuführen. Danach funktionierte bei mir alles reibungslos.

    Der von Dir beschriebene Screen wird angezeigt, sobald Du versuchst, auf das Backend eines Blogs zuzugreifen, welches dem aktuellen User nicht gehört.

  17. Hi!

    Ich ordere gerade eine Runde von Tests von den Programmieren unserer Webagentur. Eine Sache, dass uns aufgefallen ist, ist dass dieses Plugin mit dem All-in-One-SEO Pack nicht sehr gut zusammenarbeitet. Wir wollen beide für alle unserer WordPressprojekte nutzen! Wenn du Zeit/Lust hast, würde ich gerne mit dir darüber reden, am besten per Mail! Vielleicht können wir upstream helfen, diese beiden tollen Plugins in Tandem nutzen zu können.

  18. Hi!

    Ich ordere gerade eine Runde von Tests von den Programmieren unserer Webagentur. Eine Sache, dass uns aufgefallen ist, ist dass dieses Plugin mit dem All-in-One-SEO Pack nicht sehr gut zusammenarbeitet. Wir wollen beide für alle unserer WordPressprojekte nutzen! Wenn du Zeit/Lust hast, würde ich gerne mit dir darüber reden, am besten per Mail! Vielleicht können wir upstream helfen, diese beiden tollen Plugins in Tandem nutzen zu können.

  19. Erstmal großes Lob für dieses Plugin.
    Ich habe wie Dietrich (s.o.) eine Struktur, die mehrere Blogs in Unterverzeichnissen in 2 Sprachen darstellen soll.
    Dabei habe ich festgestellt, dass die Verknüpfung der Blogs auf der email des Admins nicht eindeutig ist.
    Nachträgliches Ändern der Admin accounts hat keinen Einfluß auf die Bindung.
    Zudem werden im root Blog *alle* weiteren Blogs und Sprachen im Widget angezeigt – auch diejenigen, die definitiv eine andere admin email haben.

    Mir ist nicht ganz klar, wie und wo der ‚Filter‘ dies beheben soll.

    Heiko

  20. Erstmal großes Lob für dieses Plugin.
    Ich habe wie Dietrich (s.o.) eine Struktur, die mehrere Blogs in Unterverzeichnissen in 2 Sprachen darstellen soll.
    Dabei habe ich festgestellt, dass die Verknüpfung der Blogs auf der email des Admins nicht eindeutig ist.
    Nachträgliches Ändern der Admin accounts hat keinen Einfluß auf die Bindung.
    Zudem werden im root Blog *alle* weiteren Blogs und Sprachen im Widget angezeigt – auch diejenigen, die definitiv eine andere admin email haben.

    Mir ist nicht ganz klar, wie und wo der ‚Filter‘ dies beheben soll.

    Heiko

  21. In der aktuellen Version versucht das Plugin noch die Email des Admins zu benutzen. Das geht allerdings unter bestimmten Bedingungen schief. Wenn Du mal unter /wp-admin/network/site-settings.php?id=1 nachschaust, siehst Du, dass dort auch eine Email-Adresse gehalten wird, die allerdings völlig losgelöst zu sein scheint von allen anderen Einstellungen.

    In der nächsten Version (Link zur Entwicklerversion) ist das aber kein Thema mehr.

    Das Plugin erfragt bei der Ausführung, ob ein Filter besteht, der die zu inkludierenden Blogs verändert. Ist das der Fall, wird nur der Filter verwendet. Die Filter-Funktion, die ich ja bereits gepostet hatte, lässt sich beispielsweise in der functions.php unterbringen, wenn man für eine „Gruppe“ von Blogs jeweils ein bestimmtes Theme einsetzt. Oder man aktiviert für die entsprechenden Blogs ein eigenes Plugin, welches den Code enthält.

    Ich hoffe, das war jetzt etwas klarer.

  22. In der aktuellen Version versucht das Plugin noch die Email des Admins zu benutzen. Das geht allerdings unter bestimmten Bedingungen schief. Wenn Du mal unter /wp-admin/network/site-settings.php?id=1 nachschaust, siehst Du, dass dort auch eine Email-Adresse gehalten wird, die allerdings völlig losgelöst zu sein scheint von allen anderen Einstellungen.

    In der nächsten Version (Link zur Entwicklerversion) ist das aber kein Thema mehr.

    Das Plugin erfragt bei der Ausführung, ob ein Filter besteht, der die zu inkludierenden Blogs verändert. Ist das der Fall, wird nur der Filter verwendet. Die Filter-Funktion, die ich ja bereits gepostet hatte, lässt sich beispielsweise in der functions.php unterbringen, wenn man für eine „Gruppe“ von Blogs jeweils ein bestimmtes Theme einsetzt. Oder man aktiviert für die entsprechenden Blogs ein eigenes Plugin, welches den Code enthält.

    Ich hoffe, das war jetzt etwas klarer.

  23. Danke für die schnelle Antwort.
    Jetzt sind Zuordnungen mit dem emails korrigiert und andere Blogs funken nicht mehr ins root-blog.

  24. Danke für die schnelle Antwort.
    Jetzt sind Zuordnungen mit dem emails korrigiert und andere Blogs funken nicht mehr ins root-blog.

Schreibe einen Kommentar

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