Das Kommandozeilenwerkzeug für WordPress

WP-CLI – das Schweizer Messer für Entwickler
Keine Kommentare

Wer WP-CLI noch nicht benutzt, verpasst etwas. Damit zu arbeiten, ist ein wahrer Geschwindigkeitsrausch für Plug-in-, Theme- und WordPress-Macher. Es handelt sich um ein Werkzeug, das die träge Verwaltung per Browser durch schnelle Befehle auf der Konsole ersetzt. Auch Tests und kollaboratives Arbeiten werden dadurch leichter.

Es ist allgemein bekannt, dass zu jedem guten System auch ein Werkzeug auf Kommandozeilenebene gehört, die auch Konsole, Terminal oder CLI genannt wird. Magento hat Magerun, mit dem sich Produkte, Warenkörbe und Co. verwalten lassen. Symfony bringt bin/console mit, das tiefe Einblicke in Routing, Datenbank, Caching und mehr ermöglicht. In WordPress gibt es das WP-CLI, womit sich Beiträge, Seiten, Optionen, Benutzer, Plug-ins (Abb. 1) und sehr viel mehr verwalten lassen – alles ohne den Browser, komplett über das CLI.

Abb. 1: Beispiel: Alle Plug-ins einer Webseite auflisten

Abb. 1: Beispiel: Alle Plug-ins einer Webseite auflisten

WP-CLI ist für jeden WordPress-Kenner so intuitiv zu bedienen, dass bereits zwei bis drei Beispiele ausreichen, um ein Gefühl für die Struktur der Befehle zu bekommen. Der Befehl wp startet WP-CLI. Darauf folgt ein bestimmter Bereich in WordPress, z. B. ein Plug-in (Abb. 2) oder eine Option (Abb. 3). Danach kommt eine Aktion, die dort ausgeführt werden soll.

Abb. 2: Plug-ins mit WP-CLI updaten

Abb. 3: „wp option get home“

Im Allgemeinen gilt also: wp <Bereich> <Aktion> <…> [Optionen]. Ein Beispiel zeigt Tabelle 1. Eine vollständige Liste aller Befehle und deren Aufbau kann über den Befehl wp help ausgeben werden. Per wp help [Befehl] wird eine detaillierte Dokumentation zu einzelnen Befehlen aufgerufen.

wp plugin list>
wp plugin update hello-dolly
wp plugin update –all

Tabelle 1: Die WP-CLI_Befehlsstruktur

Eigene Befehle für Plug-ins und Themes definieren

Wer ein Plug-in oder Theme entwickelt, möchte dessen Strukturen, Entitäten und Optionen wahrscheinlich auch über WP-CLI kontrollieren. WooCommerce ist ein bekanntes Beispiel für ein Plug-in, das Befehle wie wp woo product create oder woo order delete mitbringt. Damit ist der Shop über das Terminal anstelle des Browsers steuerbar, was DevOps/SysOps die Arbeit erleichtert. Das wollen wir für unsere eigenen Plug-ins auch.

Zur Demonstration der Möglichkeiten von WP-CLI wollen wir ein Plug-in entwickeln, das sich um die Verwaltung von Tieren in einem Tierheim kümmert. Was bequem per Backend funktioniert, soll auch über das Terminal möglich sein. Über den Befehl wp animal add [Name] lässt sich ein Tier hinzufügen. Ein adoptiertes Tier wird per wp animal adopt [Name] wieder entfernt.

Es gibt verschiedene Varianten, um Befehle in WP-CLI zu registrieren: per Funktion, pro Klassenmethode ein Befehl oder sogar pro Befehl eine komplett eigene Klasse. Zusammen mit der Magie der Doc Comments ist das ein riesiges Thema für sich und kann im Detail auf https://make.wordpress.org/cli nachgelesen werden. Beschränken wir uns für den Einstieg auf einfache Funktionen, schlichte Plug-ins und als zweite Variante eine eigene Klasse je Befehl, angelehnt an das Single-Responsibility-Prinzip. Wer lieber mit einfachen Funktionen arbeitet als mit tatsächlichen Klassen, wird mit dem Snippet in Listing 1 bereits glücklich. Dort wird per Funktion ein neues Tier erfasst.

\WP_CLI::add_command( 'animal add', function( $arguments ) {
  if ( ! $arguments ) {
    \WP_CLI::error( 'Bitte einen Namen angeben' );
  }

  // Tier hinzufügen
  wp_insert_post( [ 'post_title' => $arguments[1], ... ] );
} );

Wenige Sekunden und ein paar Zeilen später ist der erste Befehl bereits fertig. Wir können der Methode auch einen Namen geben und das Ganze darüber verdrahten:

function my_own_cli_animal_add() { ... }
\WP_CLI::add_command( 'animal add', 'my_own_cli_animal_add' );

So ist es möglich, der Funktion eine Dokumentation und vieles mehr per Doc Comments mitzugeben. Auch das Verhalten der Befehle kann über die Doc Comments genauer bestimmt werden. In Listing 2 findet sich ein Beispiel dafür, wie Tiere per Klasse adoptiert werden.

class Adopt_Command extends \WP_CLI_Command {
  /**
   * Mark an animal as adopted.
   *
   * The best day has come for some little pet.
   * It can be marked as adopted using this command.
   * So great that it has a new home now!
   *
   * ## OPTIONS
   *
   * 
   * : The name of the happy one.
   *
   * [--type=]
   * : Doggo or kitty?
   * ---
   * default: dog
   * options:
   *   - cat
   *   - dog
   * ---
   *
   */
  public function __invoke( $arguments, $options ) {
    // $arguments[0] beinhaltet den Namen.
    // $options['type'] ist vorbelegt mit "dog".
  }
}

Wir nutzen in Listing 2 viel Dokumentation, die im richtigen Format einiges bewirken kann. Die Überschrift und der Detailtext finden sich nun in wp animal adopt –help wieder. Anhand der Überschrift OPTIONS erkennt WP-CLI die aufgeführten Argumente (spitze Klammern) und meckert den Benutzer in der CLI sogar an, wenn bei wp animal adopt der Name des Tieres fehlt. Optionen werden in eckige Klammern gefasst, sodass WP-CLI ein assoziatives Array an den Befehl oder die Methode übergeben kann. Durch den in drei Strichen oben und unten eingefassten Kommentar, mit YAML vergleichbar, bekommt das CLI eine Whitelist an Möglichkeiten und beschwert sich bei wp animal adopt Lucy –type=wombat zurecht über die falsche Tierart.

Hinter den Doc Comments steckt noch viel mehr Magie, die sich auf https://make.wordpress.org nachlesen lässt. Insbesondere die Bereiche Documentation Standards und Commands Cookbook sind hier interessant.

Die Konfigurationsdatei

Als Nächstes wollen wir uns anschauen, wie Konfigurationsdateien den Tag erleichtern können. Im Allgemeinen ordnet WP-CLI den Optionen diese Prioritäten zu:

  1. Die direkte Eingabe von Optionen, wie zum Beispiel –path=foo.
  2. wp-cli.local.yml im aktuellen Verzeichnis, was toll für die lokale Entwicklung ist.
  3. wp-cli.yml im aktuellen Verzeichnis, um Configs im Team je Projekt zu teilen.
  4. ~/.wp-cli/config.yml im Benutzerverzeichnis.
  5. WP-CLI-Standardwerte.

Mit diesen Möglichkeiten können wir uns ganz viel Tipparbeit sparen und unseren Kollegen helfen, die Projekte in wenigen Befehlen alle auf die gleiche Weise zu erstellen.

Abkürzungen per YAML-Datei

Dieser Part ist sehr intuitiv und somit schnell erklärt. Ein langer Befehl mit vielen Optionen (Listing 3) kann sich auf Standardwerte in der YAML-Datei beziehen, was den Aufruf auf wp core install kürzt. Ein Beispiel für wp core config findet sich in Listing 4. Das ist wunderbar einfach, denn der Bereich in der YAML-Datei heißt core install, genau wie der Befehl. Außerdem sind die Optionen vom Namen her 1:1 dieselben. Mit dieser Datei im Repo oder im Home-Ordner lässt sich auch die wp-config.php per wp core config für verschiedene Projekte sehr leicht erstellen.

wp core install \
  --url="http://42.13.37.255" \
  --title="Acme dev" \
  --admin_user="admin" \
  --admin_password="SkrrraPumPum" \
  --admin_email="root@localhost"
core install:
  url:  http://42.13.37.255
  title: Acme dev
  admin_user: admin
  admin_password: SkrrraPumPum
  admin_email: "root@localhost"

Die interessantesten Befehle von WP-CLI

Wir schauen uns nun einige der nützlichsten Befehle im Detail an. Als Erstes muss wp shell genannt werden. Die Anweisung startet eine PHP-Shell, in der WordPress mit allen Plug-ins geladen wird. Das ist mit dem Terminal vergleichbar, allerdings können PHP-Funktionen hier aus WordPress aufgerufen werden, z. B. wp_insert_post(), locate_template(). Auch Funktionen und Klassen von Plug-ins sind hier ansprechbar. Ebenso wie sich hier in die Geschehnisse von WordPress eingreifen lässt, befördert uns der Befehl wp db cli direkt in die SQL-Datenbank. Dort können alle möglichen SQL-Befehle ausgeführt werden – ein ideales Hilfsmittel für alle Entwickler. Noch verrückter wird es mit wp post edit 1, was einen Editor im Terminal öffnet, sodass sich ganze Posts bearbeitet lassen – ganz ohne Backend im Browser, alles auf dem CLI. Wer den Standardeditor des Terminals nicht mag, kann per EDITOR=nano wp post edit 1 zu einem anderen wechseln. Ein paar Befehle bieten sogar Möglichkeiten, die nicht im WP-Admin-Interface zu finden sind. Zum Beispiel kann man per wp media regenerate alle Thumbnails neu erstellen. Cronjobs lassen sich per wp cron auflisten und auslösen. Auch wp rewrite list liefert eine sehr interessante Liste für alle, die eigene Rewrites schreiben oder debuggen wollen, was welche URL auslöst.

International PHP Conference 2018

Getting Started with PHPUnit

by Sebastian Bergmann (thePHP.cc)

Squash bugs with static analysis

by Dave Liddament (Lamp Bristol)

API Summit 2018

From Bad to Good – OpenID Connect/OAuth

mit Daniel Wagner (VERBUND) und Anton Kalcik (business.software.engineering)

Zu guter Letzt gibt es ein paar Hilfen für das Veröffentlichen von Webseiten, wofür es ebenfalls keine Option im Backend gibt. Natürlich ändert sich dabei der URL, sodass einige Einträge in der Datenbank geändert werden müssen, was wp search-replace für alle WP-Tabellen bis in serialisierte Felder hinein erledigt. Danach darf man wp cache flush und wp transient delete –all nicht vergessen, damit jede Art von Cache einmal gesäubert wird.

Kommentar zu WP-CLI

WP-CLI ist vor allem für Entwickler ein sehr mächtiges Tool. Es arbeitet jedoch nicht ausschließlich auf PHP-Basis, sondern bezieht andere Programme mit ein. So delegiert ein wp db dump lediglich an mysqldump und ein import an mysql weiter, was einen MySQL-Client auf der Maschine voraussetzt. Auch das Blättern durch die Dokumentation, z. B. per wp help core config, wird durch den Pager (z. B. less) geschickt. In der Summe gibt es also einige Abhängigkeiten in WP-CLI, die nicht einfach per Composer installiert werden können und auf ganz nackten Debian-Servern sogar fehlen.

Ein wenig schmerzhaft kann die erste Installation von WP-CLI per Composer sein. Dabei werden so viele Pakete hinzugezogen, dass GitHub nach einer Authentifizierung fragt. Daher empfehle ich jedem, WP-CLI wie auf www.wp-cli.org beschrieben als PHAR-Archiv herunterzuladen und global zu installieren. Das ist viel einfacher, global verfügbar und dank wp cli update immer auf dem aktuellsten Stand.

Besonders toll finde ich die einfache Integration eigener Befehle. Wer seine Plug-ins auf CQRS stützt, dem wird es ein Leichtes sein, alle Features auch auf das CLI zu portieren. Ich kann mir als Entwickler kaum vorstellen, wie WordPress zuvor ohne eine solche Shell ausgekommen ist. Heute möchte ich das CLI jedenfalls nicht mehr missen, weil das Arbeiten damit um einiges produktiver geworden ist. Weg von dem langsamen „Geklicke“ im Backend, hinein in das „Runterrattern“ von Befehlen auf der Shell.

Entwickler Magazin

Entwickler Magazin abonnierenDieser Artikel ist im Entwickler Magazin erschienen.

Natürlich können Sie das Entwickler Magazin über den entwickler.kiosk auch digital im Browser oder auf Ihren Android- und iOS-Devices lesen. In unserem Shop ist das Entwickler Magazin ferner im Abonnement oder als Einzelheft erhältlich.

Unsere Redaktion empfiehlt:

Relevante Beiträge

Hinterlasse einen Kommentar

Hinterlasse den ersten Kommentar!

avatar
400
  Subscribe  
Benachrichtige mich zu:
X
- Gib Deinen Standort ein -
- or -