Fatale Fehler in WordPress mit PHP 8+ und einer fehlerhaften Übersetzung

Letzte Woche habe ich die Meldung bekommen, dass eine Seite kaputt war, die mich ein wenig überrascht hat. Ich habe hier den Fehler mal in einem Dummy-Plugin reproduziert, um euch zeigen zu können, was schiefgelaufen ist. Beim Aufruf der defekten Seite wurde ich mir die folgende Fehlermeldung präsentiert:

Fatal error: Uncaught Error: Missing format specifier at end of string
in /var/www/html/wp-content/plugins/broken-format-string/broken-format-string.php on line 15

Also habe ich mir den Code dazu angesehen und dort stand Folgendes:

printf(
	__( 'Publish date: %s', 'broken-format-string' ),
	date_i18n( get_option( 'date_format' ), get_post_datetime() )
);

Nichts wirklich spannendes. Nur ein Format-String mit einem Platzhalter für einen String, der mit dem Veröffentlichungsdatum im WordPress-Datumsformat ersetzt wird.

Fehlerhafte Übersetzung

Ich konnte also nicht wirklich nachvollziehen, was genau hier der Fehler war. Aber da Sprache der Seite nicht „English (US)“ war, habe ich mir mal die Übersetzungsfunktion angesehen. Hier wieder ein einfaches Beispiel mit einem ähnlichen Fehler:

#: broken-format-string.php:14
msgid "Publish date: %s"
msgstr "Veröffentlichungsdatum: %"

Die deutsche Übersetzung des „Publish date:“ ist korrekt, aber der Platzhalter wird hier nur ein % verwendet und nicht %s, was dann zu diesem Fehler führt. WordPress würde hier also den Original-String ins Deutsche übersetzen und an die printf() Funktion weitergeben, was dann zu dem „Fatal error“ führt.

Unterschiedliche Fehlerbehandlung in PHP 8+

Wenn ihr diesen Code in PHP 7.4 oder früher ausführt, dann bekommt ihr keinen fatalen Fehler. Ihr bekommt noch nicht einmal eine PHP Warning oder Notice. Es würde einfach der Platzhalter nicht korrekt ersetzt. Das % würde einfach durch einen leeren String ersetzt werden. Aber sobald ihr auf PHP 8+ aktualisiert, habt ihr eine defekte Seite.

Das war das erste Mal, dass ich wirklich ein Problem mit PHP 8+ auf einer WordPress-Website festgestellt habe. Vielleicht hatte ich einfach Göück, oder aber die Übersetzungen hatten die Platzhalter immer korrekt übersetzt.

Fazit

Ich habe häufiger mal Prüfungen auf PHP 8+ Kompatibilität mit PHPCompatibilityWP gemacht und bisher hat es immer funktioniert. Aber ich hätte nie erwartet, dass eine fehlerhafte Übersetzung mal einen fatalen Fehler auslösen würde. Wenn man Übersetzungen mti GlotPress macht (was auf translate.wordpress.org verwendet wird), dann wird einem eine Warnung angezeigt, wenn in einer Übersetzung ein Platzhalter fehlt. Aber Tools wie Poedit zeigen hier leider keine Warnung an. Wenn ihr also jemanden damit beauftragt euer Plugin/Theme in einer Sprache zu übersetzten, die ihr selbst nicht sprecht, dann prüft am besten sehr genau, ob alle Format-String korrekt sind.

Veröffentlicht von

Bernhard ist fest angestellter Webentwickler, entwickelt in seiner Freizeit Plugins, schreibt in seinem Blog über WordPress und andere Themen, treibt sich gerne bei den WP Meetups in Berlin und Potsdam herum und läuft nach Feierabend den ein oder anderen Halbmarathon.

7 Kommentare » Schreibe einen Kommentar

  1. Moin Bernhard,
    ich glaube so etwas habe ich auch erlitten. Ich bin nur Anwender mit einer Hobby-Website. Als ich las das PHP 7.4 ausläuft habe ich natürlich mal auf 8.0 bzw. 8.1 umgestellt. Zack! Meine ganze Seite ging dann nicht mehr ordentlich. Bestimmt irgendein Plugin dachte ich, aber mir fehlte schlicht die Zeit an dem Abend das in Ruhe durchzutesten. Also musste ich alles wieder auf 7.4 zurückdrehen und kann nur abwarten.
    Deine Analyse mag helfen das es vielen Anderen besser geht als mir. Hoffentlich hält das Einzug in ein WP Update demnächst.

    Danke Dir!
    Viele Grüße
    Malte

    • Hallo Malte,

      so etwas ist natürlich immer ärgerlich. WordPress selbst funktioniert problemlos mit PHP 8.1, aber nicht alle Themes und Plugins sind bereits kompatibel. Solche Probleme mit Übersetzungen können dann natürlich nochmal zu echten Herausforderungen werden.

      Ich würde dir empfehlen, einfach mal den Debug-Modus zu aktivieren. Dazu hatte ich bereits im Adventskalender 2015 beschrieben, wie das geht. Dort solltest du dann feststellen können, wie es zu dem Fehler kommt und wie du es vielleicht beheben kannst.

  2. > Aber Tools wie Poedit zeigen hier leider keine Warnung an.

    Das ist nicht korrekt. Die aktuelle PoEdit-Version 3.2.2 zeigt mir eine Warnung an, wenn ich statt %s nur ein % übersetze.

    • Danke für den Hinweis. Ich konnte leider unter Linux mit Version 3.2.2 (inkl. Premium-Lizenz) keine Warnung finden und selbst beim Klick auf „Prüfen“ wird mir bestätigt, dass keine Fehler gefunden wurden. Bei den Warnungen ist auch die „Platzhalter-Korrektheit“ aktiviert. Echt komisch.

  3. Ich hab auch Probleme mit meinem Extra Theme mit PHP 8 und musste wieder zurück auf PHP 7.4. Da ich mich auch nicht so mit PHP auskenne kann es durchaus ein ähnlicher Fehler sein. Obwohl ich keine Übersetzungen angepasst habe.

Schreibe einen Kommentar

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