Fehlerhafte Plugin-Übersetzung in WPML reparieren

Letzte Woche hatte ich in einem Projekt ein Problem, bei dem für ein Plugin nicht die richtige Sprache geladen wurde. Es war ein mehrsprachiges Projekt mit drei Sprachen. Die Standardsprache war Deutsch, eine der beiden anderen war Englisch. Wenn es Probleme beim Laden von Übersetzungen gibt, wird ja normalerweise immer nur der englische Originaltext angezeigt. Nicht so in diesem Fall. Alle Texte waren in der Standardsprache Deutsch zu sehen, selbst auf der englischen Seite.

Das Projekt verwendete WPML für die Übersetzung der Inhalte. Für alle anderen Plugins, das Theme und die Inhalte, wurde immer die korrekte Sprache angezeigt. Nur eben nicht für dieses eine Plugin. Den Fehler zu finden war gar nicht einfach. Nachdem ich ihn dann aber ausgemacht hatte, war die Lösung schnell gefunden.

Der fehlerhafte Code

Vor zwei Jahren habe ich auf dem WordCamp Berlin 2015 einen Vortrag über die korrekte Initialisierung eines Plugins gehalten. Ich hatte damals ein ähnliches Problem mit einer nicht geladenen Übersetzung, allerdings wurden damals immer die englischen Strings angezeigt.

<?php
/**
 * Plugin Name: Broken Plugin
 */

# Load translation files.
load_plugin_textdomain( 'broken-plugin', false, 'broken-plugin/languages' );

# Initialize plugin.
add_action( 'after_setup_theme', 'broken_plugin_theme_setup', 12 );

function broken_plugin_theme_setup() {
	// Some code ...
}

Ich möchte jetzt nicht den Plugin-Autoren schlecht machen und habe daher den Namen anonymisiert. Oben seht ihr aber den Code, so wie er im Plugin vorkommt. Wie ihr sehen könnt, wird die Sprachdatei zu beginn der Plugin-Datei geladen. Das Plugin hat eine Callback-Funktion auf den Hook after_setup_theme, welcher perfekt für das Laden der Übersetzung wäre.

Der Grund für den Fehler

Aber wieso wird die Übersetzung nicht richtig geladen? Wie ich euch zu Beginn schon gesagt habe, sieht es ja eigentlich so aus, als würden Übersetzungen geladen werden. Andernfalls müssten ja alle Strings immer in Englisch sein und nicht immer in der Standardsprache Deutsch. Der Grund ist recht einfach. Das Plugin beginnt mit dem Buchstaben B (nicht nur das hier anonymisierte, sondern auch das echte Plugin) und da Plugins in alphabetischer Reihenfolge geladen werden und der Ordnername von WPML “sitepress-multilingual-cms” ist, kommt der Code einfach zu früh. Der Wechsel zur korrekten Sprache passiert in WPML einfach erst dann, wenn es selbst komplett geladen wurde. Zu diesem Zeitpunkt wurde aber schon die falsche Sprachdatei geladen (Deutsch) und somit werden die Strings nicht mehr mit den richtigen ersetzt.

Das Plugin reparieren

Eine Lösung ist ja recht einfach. Wir verschieben einfach den Funktionsaufruf in die passende Callback-Finktion. Richtig? Das würde natürlich funktionieren, allerdings nur bis zum nächsten Plugin-Update. Dann wäre unser Fix wieder weg.

Wie machen wir es also besser? Der beste Weg, um ein Plugin zu reparieren, ist es immer, den Plugin-Autoren auf den Fehler aufmerksam zu machen. Und das ist genau, was ich getan habe. Ich konnte das Plugin bei Github finden, habe den Fehler in einem Fork behoben und für den Autoren einen Pull Request eröffnet. Da es aber einige PRs gab, die schon lange existierten und noch nicht gemerged waren und da es seit über 2 Jahren kein Update gab, habe ich nicht damit gerechnet, dass meine Fehlerlösung schnell veröffentlicht wird. Also war es jetzt OK, dass ich das Plugin erst einmal selbst reparierte? Das hätte ich natürlich tun können, aber es gab noch einen anderen Weg. Ich konnte das Plugin von außen fixen, was eigentlich sehr einfach ist.

Viele Entwickler kennen vermutlich die Funktion load_plugin_textdomain, aber wie viele so benannter Funktionen gibt es in WordPress auch eine Funktion, die das genaue Gegenteil macht. In diesem Fall können wir die Funktion unload_plugin_textdomain nutzen:

function broken_plugin_wpml_fix() {
	unload_textdomain( 'broken-plugin' );
	load_plugin_textdomain( 'broken-plugin', false, 'broken-plugin/languages' );
}
add_action( 'after_setup_theme', 'broken_plugin_wpml_fix', 13 );

Innerhalb einer weiteren Callback-Funktion auf den Hook after_setup_theme enladen wir also zuerst die Sprachdatei und fügen sie anschließend mit dem gleichen Aufruf wie im Plugin neu hinzu. Wir verwenden hierbei eine Priorität, die um eins höher als im Plugin liegt. Somit funktioniert unser Fix auch dann noch, wenn das Plugin schon repariert wurde, wir das aber noch nicht mitbekommen haben.

Diesen Code kopieren wir in ein kleines Plugin (oder vorübergehend in die functions.php Datei des Themes) und sobald das Plugin gefixt wurde, können wir ihn wieder entfernen.

Fazit

Wie ihr an diesem kleinen Beispiel erkennen könnt, ist es oft möglich, ein fehlerhaftes Plugin zu reparieren, ohne den Code selbst verändern zu müssen. Auch bei einem Update funktioniert der Fix dann weiterhin. Ich würde aber immer empfehlen, erst einmal dem Plugin-Autoren einen Fix zu schicken. Einige sind wirklich sehr schnell bei der Veröffentlichung von solchen Patches und ihr erspart euch dann die externe Korrektur. Viel wichtiger noch: ihr löst das Problem dann nicht nur für eure Seite, sondern auch für alle anderen Nutzer, die eventuell das gleiche Problem haben.

WordCamp Europe 2017 – Lernen. Verbinden. Mitwirken.

Ja, ich weiß. Schon wieder ein WordCamp-Rückblick. Aber ich verspreche, dass es der letzte für die nächsten zwei Monate sein wird und ihr euch dann wieder auf “normale” Beiträge freuen könnt 😉 Vor zwei Wochen war es also soweit, das WordCamp Europe 2017 fand in Paris statt. Und da die Erinnerungen noch einigermaßen frisch sind, schreibe ich sie mal für euch nieder.

Paris genießen

Ich bin schon am Montag nach Paris geflogen. Normalerweise reise ich nicht so viel früher an und verbringe nur wenige zusätzliche Tage in der Stadt. Aber da ich Paris liebe, habe ich gleiche eine ganze Woche gebucht. Leider konnte mich einer meiner Kollegen nicht begleiten. Daher habe ich mir ein paar andere “Opfer” aus der deutschen WordPress Community gesucht, denen ich meine Lieblingsorte in Paris zeigen konnte. Natürlich waren auch ein paar typische touristische Orte dabei:

Ich bin nicht nur ein großer Fan der Stadt, sondern auch der französischen Küche. Ein Urlaub in Frankreich ohne Wein, Baguette und Käse geht also nicht. Ich habe zu meiner Käseauswahl auch sehr gute Kritiken bekommen 🙂

Weiterlesen →

Ein erfolgreiches achtes Jahr geht zu Ende

Heute vor 8 Jahren habe ich mit meinem Blog angefangen. Pünktlich zum Geburtstag gibt es wie immer den obligatorischen Beitrag hierzu. Wer meinen Blog schon lange verfolgt, der wird mitbekommen haben, dass ich besonders in den beiden letzten Jahre sehr aktiv war.

Letztes Jahr zu dieser Zeit steckte ich gerade mitten im Projekt 52, bei dem es mein Ziel war, jede Woche einen Blogbeitrag zu schreiben. Ich habe es bis zum Ende durchgehalten und zu allem Überfluss auch noch den Adventskalender wiederholt 🙂

Wie ich im letzten Beitrag von Projekt 52 im letzten Jahr angekündigt habe, wollte ich dieses Jahr das Projekt ein wenig verändern. So blogge ich zwar noch immer jede Woche, aber immer zuerst auf Englisch und danach auf Deutsch. Nur heute gibt es den Beitrag zur Feier des Tages gleich in beiden Sprachen und ich fange auch mal mit dem deutschen Text an. Zuerst kommt natürlich wie immer der kleine Statistikteil 😉

Weiterlesen →

WordCamp Copenhagen – Eine neue Community entdecken

Ihr kennt wahrscheinlich mittlerweile meine Spontanität bezüglich WordCamps,oder? Vor vier Wochen war das WordCamp Berlin. Auf dem Contributor Day am Freitag hat Jenny Wong das Design Team gefragt, ob sie bei der Website für das WordCamp Kopenhagen helfen könnten. Sie war Mentor für das Organizing Team dieses WordCamp – den letzten verbliebenen. Die Organisation lief nicht wirklich gut und sie hatten bis dahin noch keine richtige Website. Also hat unser tollen Design Team ausgeholfen und bis zum Ende des Contributor Days hatte das WordCamp Kopenhagen eine schöne Website.

Neue Communities endecken

Ich war in den Prozess nicht involviert, aber ich meine Hilfe als “erfahrener Organisator” angeboten, falls der Organizer des WordCamp Kopenhagen oder Jenny Hilfe brauchten. Also habe ich mir in der darauf folgenden Woche, 9 Tage vor dem WordCamp, einen Flug nach Kopenhagen gesucht und ein recht gutes Angebot gefunden. Da war ich also wieder, auf meinem Weg zu einem weiteren WordCamp 🙂

Weiterlesen →

WordCamp Berlin 2017 – Wie war es?

Einige von euch werden jetzt vielleicht denke “was, schon wieder ein WordPress Resümee?”, aber keine Angst, dieses wird ein wenig anders werden. Der Grund ist recht einfach. Beim WordCamp Berlin 2017 war ich der Lead-Organizer. Ich hatte also gar keine Zeit, mir so viele Sessions anzusehen. Ihr müsst euch also einer der anderen Reviews von Besuchern ansehen, wenn ich wissen wollt, die die Vorträge waren.

WPAdminDay

Bevor wir uns aber mit dem eigentlichen WordCamp beschäftigen, lasst uns zwei Tage früher beginnen. Stefan Kremer hat unabhängig vom WordCamp den ersten WPAdminDay organisiert. Die Zielgruppe waren Dev-Ops, die sich um die Pflege von Kundenwebsites kümmern. Da ich der Agentur, in der ich angestellt bin, auch die Aufgabe eines Administrators übernehme, konnte ich von diesem Tag einige neue Einblicke gewinnen, wie andere die dabei anfallenden Aufgaben erledigen und wie ein besserer Workflow aussehen könnte.

Marc Nilius hat uns beispielsweise seinen täglichen Workflow gezeigt, mit dem er WordPress Installation mit Hilfe von InfiniteWP aktualisiert. Ich wollte mir dieses Verwaltungstool schon länger mal ansehen und werde dies in den nächsten Wochen auch noch genauer tun. Zusätzlich hat uns Marc noch ein selbst geschriebenes Skript gezeigt, mit der er die E-Mails parst, die Informationen über Dateiänderungen enthalten. Damit kann er potentiell gehackte Website schneller erkennen.

Weiterlesen →