Blog

♻️ PHP-Kompatibilität für WordPress 6.4 und das Plugin-Verzeichnis maximieren

Leonardo Losoviz
Von Leonardo Losoviz ·

WordPress 6.4 „Shirley" wurde veröffentlicht. Es wird empfohlen, es mit PHP 8.1 oder 8.2 zu betreiben, aber die minimal unterstützte PHP-Version ist nach wie vor 7.0.

Daher müssen unsere WordPress-Plugins (so weit wie möglich) PHP bis hinunter zu 7.0 unterstützen und mit PHP 8.1 und 8.2 kompatibel sein.

Der naheliegendste Weg dafür ist, unsere Plugins mit PHP 7.0 zu entwickeln und dabei:

  • Keine Funktionen zu verwenden, die in PHP 7.x als veraltet markiert wurden, da diese in PHP 8.x entfernt worden sind
  • Keine Funktionen zu verwenden, die in PHP 8.x als veraltet markiert wurden, da diese Warnungen auslösen

Um sicherzustellen, dass der Plugin-Code kompatibel ist, müssen wir ihn gründlich in verschiedenen Umgebungen mit den unterschiedlichen PHP-Versionen testen.

Das Entwickeln in PHP 7.x hat einen offensichtlichen Nachteil: Der Plugin-Code muss mit PHP 8.x kompatibel sein, darf aber keine seiner Funktionen verwenden, wie etwa Union Types, den match-Ausdruck, den Nullsafe-Operator und viele andere.

Es gibt eine bessere Alternative.

PHP-Code von 8.x auf 7.x downgraden

Anstatt in PHP 7 zu entwickeln und sicherzustellen, dass es mit PHP 8 funktioniert, können wir das Gegenteil tun: das Plugin in PHP 8 entwickeln und auf PHP 7 downgraden.

Das ist dank Rector möglich, einem Tool zur Automatisierung von PHP-Code-Refactoring.

Rector stellt Regeln bereit, um Code von PHP 8.1 auf PHP 7.2 downzugraden. Das bedeutet, wir können diese modernen Funktionen in unseren WordPress-Plugins verwenden, da sie auf PHP-7.2-Code downgegradet werden können.

Zum Beispiel konvertiert die Regel DowngradeMatchToSwitchRector den match-Operator in einen switch-Operator:

class SomeClass
{
    public function run()
    {
-        $message = match ($statusCode) {
-            200, 300 => null,
-            400 => 'not found',
-            default => 'unknown status code',
-        };
+        switch ($statusCode) {
+            case 200:
+            case 300:
+                $message = null;
+                break;
+            case 400:
+                $message = 'not found';
+                break;
+            default:
+                $message = 'unknown status code';
+                break;
+        }
    }
}

Beachte, dass die Regeln nur für das Downgraden bis PHP 7.2 geeignet sind, nicht bis PHP 7.1 und 7.0. Das ist jedoch kein großes Problem, da diese beiden PHP-Versionen zusammen nur 3 % der WordPress-Sites ausmachen.

Code downzugraden ist ein besserer Ansatz, weil:

  • Durch die Entwicklung in PHP 8.1 sind wir absolut sicher, dass unser Code mit PHP 8.1 und 8.2 kompatibel ist.
  • Solange wir PHP-Funktionen verwenden, für die es Downgrade-Regeln gibt, funktioniert der Code auch in PHP 7.2, 7.3 und 7.4.
  • Wir können PHP-8.x-Funktionen nutzen, wie etwa Union Types, den match-Ausdruck, den Nullsafe-Operator und viele andere.

Beachte, dass nicht alle PHP-8.x-Funktionen verfügbar sind. Zum Beispiel gibt es (noch) keine Regel, um Enumerationen downzugraden, daher können wir diese nicht verwenden.

Was das Testen betrifft, gibt es keinen Unterschied: Wir müssen das Plugin ebenfalls gründlich in verschiedenen Umgebungen mit den unterschiedlichen PHP-Versionen testen, um auf der sicheren Seite zu sein.

Wie man Code downgradet

Gato GraphQL wird mit PHP 8.1 entwickelt und für die Produktion auf PHP 7.2 downgegradet.

Das Downgraden des Codes, das Testen und anschließende Veröffentlichen des Plugins für die Produktion ist alles über GitHub Actions Workflows automatisiert:

  • downgrade_php_tests.yml: Downgradet den Code und analysiert ihn mit PHP 7.2
  • generate_plugins.yml: Generiert das Plugin für die Veröffentlichung und downgradet es auf PHP 7.2
  • integration_tests.yml: Installiert das neu generierte Plugin in einer Reihe von InstaWP-Instanzen, die verschiedene PHP-Versionen ausführen, und führt Integrationstests durch

Um mehr zu erfahren, habe ich einige Artikel zu diesem Thema geschrieben:

Ich hoffe, du findest es nützlich 🙏


Abonniere unseren Newsletter

Bleib über alle Updates zu Gato GraphQL auf dem Laufenden.