In meinem Beitrag „WP-CLI – was ist das, was brauche ich dafür und wie installiere ich das?“ habe ich kurz angerissen, was mit dem Kommandozeilen-Interface für WordPress möglich sein könnte. Hier möchte ich euch am Beispiel automatischer Updates zeigen, wie WP-CLI eingesetzt werden kann, um Aufgaben zu automatisieren.

Die Vorüberlegung für ein Update-Skript mit WP-CLI

WP-CLI bietet unter anderem Kommandos an, um Themes, Plugins und den WordPress-Core zu aktualisieren. Dabei muss das nicht heißen, dass direkt alle verfügbaren Updates installiert werden – je nach Komplexität der Installation ist das vielleicht auch nicht immer eine gute Idee.

Es wären beispielsweise die folgenden Szenarien denkbar, die sich mit WP-CLI automatisieren ließen:

  1. Regelmäßig alle verfügbaren Updates für Core, Plugins und Themes installieren.
  2. Regelmäßig alle verfügbaren Minor- oder Patch-Updates für Core und Plugins installieren (das ist für Themes nicht möglich, später dazu mehr).
  3. Regelmäßig prüfen, ob Updates vorhanden sind und dem User eine Mail mit den Ergebnissen schicken, damit er selbst die Updates vornehmen kann.

Als fertiges Skript werde ich in diesem Artikel den ersten Weg zeigen. Doch vorher die Kommandos für alle drei:

Die notwendigen WP-CLI-Kommandos

Zunächst einmal zu den vier Grund-Kommandos, mit denen wir uns gleich beschäftigen:

  • wp core update – Aktualisiert WordPress auf eine neuere Version.
  • wp core check-update – Prüft, ob eine neue WordPress-Version vorhanden ist.
  • wp plugin update – Aktualisiert ein oder mehrere Plugins.
  • wp theme update – Aktualisiert ein oder mehrere Themes.

Eigentlich recht übersichtlich, oder? Kommen wir nun zu den konkreten Kommando-Aufrufen, die wir für unsere drei Szenarien benötigen.

Alle Updates installieren

Folgende drei Befehle braucht es, um alle verfügbaren Updates für Core, Themes und Plugins zu installieren:

wp core update
wp plugin update --all
wp theme update --allCode-Sprache: Bash (bash)

Über --all geben wir an, dass wir alle Plugins und Themes aktualisieren möchten, statt nur ein bestimmtes.

Alle Minor-Updates installieren

Um die Updates nur auf Minor-Versionen zu beschränken, also beispielsweise 1.0 auf 1.1 aber nicht 1.0 auf 2.0, können wir die folgenden Befehle nutzen:

wp core update --minor
wp plugin update --all --minor
wp theme update --allCode-Sprache: Bash (bash)

Für Themes ist das nicht möglich, da WordPress.org keine Versionsliste für Themes bereitstellt. Alternativ zum Installieren von allen verfügbaren Theme-Updates könnte hier die Variante mit dem Prüfen auf Updates genutzt werden, die im nächsten Schritt vorgestellt wird – so gebe es für Core und Plugins die Minor-Updates und für Themes die Prüfung, ob eine neue Version verfügbar ist.

Nur auf Updates prüfen

Um nur zu überprüfen, ob Updates vorhanden sind, bieten sich die folgenden Aufrufe an:

wp core check-update
wp plugin update --all --dry-run
wp theme update --all --dry-runCode-Sprache: Bash (bash)

Über die Option --dry-run erhaltet ihr eine Vorschau, für welche Themes und Plugins es Updates gibt, ohne dass sie installiert werden.

Das Shell-Skript schreiben

Bisher hat uns das noch nicht sehr viel gebracht. Gut, wir können uns über die Befehle den Weg ins Backend sparen, aber automatisiert ist das noch nicht so richtig. Dafür schreiben wir uns jetzt ein kleines Shell-Skript, das über einen Cronjob regelmäßig ausgeführt werden kann.

Ein Cronjob ist ein Task, der über den Cron-Service nach benutzerdefinierten Intervallen ausgeführt wird, wie im Handbuch von Uberspace zu lesen ist.

Ich mache das hier wie erwähnt am Beispiel des Szenarios, das alle Updates installiert – wenn ihr eins der anderen haben möchtet (oder Teile von anderen), könnt ihr die entsprechenden Kommandos austauschen. Damit es nachher auch mit einem Cronjob funktioniert, geben wir für jeden Befehl über die --path-Option den absoluten Pfad zu der WordPress-Installation an.

Ich setze hier das Beispiel so um, dass der User eine E-Mail bekommt, worin die Ergebnisse der Kommando-Aufrufe stehen. Wenn ihr das nicht braucht, könnt ihr den Teil mit Variablen weglassen und direkt die reinen Befehle in die Bash-Datei schreiben.

Beginnen wir damit, eine cli-auto-update.sh-Datei zu erstellen und die WP-CLI-Aufrufe hineinzuschreiben. Die Rückgabewerte der Befehle, die normalerweise in der Kommandozeile angezeigt werden, speichern wir für den E-Mail-Text in Variablen:

#!/bin/bash
CORE_UPDATE="$(wp core update --path='/absolute/path/to/wordpress/install/')"
PLUGIN_UPDATES="$(wp plugin update --all --path='/absolute/path/to/wordpress/install/')"
THEME_UPDATES="$(wp theme update --all --path='/absolute/path/to/wordpress/install/')"Code-Sprache: Bash (bash)

Nun müssen wir uns noch eine kleine Text-E-Mail erstellen, die Variablen einbauen und die E-Mail abschicken:

MAIL_TEXT="Hi,
 
das hier ist der automatische Report des WP-CLI-Skripts für Updates von WordPress-Core, Plugins und Themes auf example.com.
 
Core-Updates
${CORE_UPDATE}
 
Plugin-Updates
${PLUGIN_UPDATES}
 
Theme-Updates
${THEME_UPDATES}
 
Viele Grüße
Dein Server"
 
mail -s "WP-CLI-Report für example.com" mail@example.com <<< "$MAIL_TEXT"Code-Sprache: Bash (bash)

Und damit ist das Skript fertig. Jetzt müsst ihr es noch auf den Server laden und könnt es mit bash cli-auto-update.sh testen. Ihr solltet eine E-Mail mit dem Ergebnis bekommen (ich nutze hier den mail-Befehl zum Versand der E-Mail).

Cronjob für regelmäßige Ausführung einrichten

Wie ein Cronjob eingerichtet wird, hängt von eurem Hoster ab. Gegebenenfalls müsst ihr für den Cronjob das WP-CLI in den PATH eintragen, damit das Skript die WP-CLI nutzen kann – bei Uberspace ist es jedenfalls so, dass der PATH für den Cronjob anders ist als auf der Shell selbst, und deshalb ohne Anpassung das WP-CLI nicht verfügbar ist. Außerdem musste ich die Berechtigung der Bash-Datei hochstellen, damit der Cronjob sie ausführen konnte.

Angepasst sieht beispielhaft eine Cronjob-Datei für mich bei Uberspace so aus:

PATH=/home/username/bin:/usr/bin:/bin
0 0 * * 0 /var/www/virtual/username/html/cli-auto-test.shCode-Sprache: Bash (bash)

In der ersten Zeile füge ich das ~/bin-Verzeichnis zum PATH hinzu, in dem ich das WP-CLI installiert habe. Die nächste Zeile sorgt dafür, dass das Automatisierungs-Skript jeden Sonntag um 0 Uhr ausgeführt wird.

Damit haben wir uns jetzt mit relativ wenig Aufwand ein kleines System erstellt, das uns entweder automatisch direkt Updates installiert oder  regelmäßig über verfügbare Updates informiert.

So sieht das dann beispielhaft aus, wenn ein Plugin und Theme aktualisiert wurden und WordPress bereits auf dem aktuellsten Stand ist:

E-Mail-Report mit durchgeführten Updates. (Screenshot: Thunderbird)

22 Kommentare zu “WordPress-, Theme- und Plugin-Updates via WP-CLI automatisieren

  1. Servus,

    Guter Beitrag. Ich finde aber die Automatisierung von Updates nicht als Praktikable Lösung.

    Bei umfangreicheren WordPressseiten mit einer vielzahl an Plugins kann das sehr schnell dazu führen das man durch inkompatibilität eine zerschossene seite erhält.
    So dauert dann die Fehlersuche umso länger um den übeltäter zu entdecken.
    Oder liege ich da falsch?

    • Hi Steffen,

      nein, da liegst du nicht falsch – wenn es sehr viele Plugins sind, die möglicherweise noch vom Theme oder so verändert werden, muss man natürlich überlegen, ob die automatische Installation aller Updates eine praktikable Lösung ist 🙂

      Ich für meinen Teil habe auf meiner Installation eigentlich bisher noch keine großen Probleme beim Aktualisieren von Plugins gehabt, weshalb ich mir eine automatisierte Lösung gut vorstellen kann (regelmäßige Backups natürlich vorausgesetzt 🙂 ).

      LG
      Florian

    • Hallo Eve,

      eine Funktion eines Plugins regelmäßig auszuführen ist nicht so leicht, wenn das von dem Plugin nicht vorgesehen ist. Da müsstest du vermutlich am besten jemanden beauftragen, der dir ein Programm dafür schreibt.

      Viele Grüße
      Florian

  2. Danke für deinen Artikel, ich arbeite auch viel mit WP-CLI. „wp language“ müsste man ggf. noch ergänzen, um wirklich alles zu aktualisieren.

    Was spricht allerdings dagegen, die automatische Update Funktion von WordPress selbst zu verwenden, wenn es unkritisch ist?

    https://codex.wordpress.org/de:Automatische_Hintergrund_Updates_einstellen

    Man kann dann z.B. über die functions.php des Child Themes steuern, was automatisch aktualisieret werden soll und ob minor oder major Updates, etc.

    • Hi Nick,

      danke für deinen Kommentar. Stimmt, die Übersetzungen könnte man da auch noch mit aufnehmen.

      Gegen die automatische Update-Funktion spricht nichts 🙂 WP-CLI ist halt nur eine andere Möglichkeit. Was mir jedoch als eventueller kleiner Nachteil der automatischen Updates über die Filter/Konstanten einfällt ist, dass du dann (jedenfalls nicht mal eben) steuern kannst, wann diese Updates gemacht werden.

      Wenn du WP-CLI nutzt könntest du relativ einfach einen Cronjob einrichten, um die gegebenenfalls vorhandenen Updates zum Beispiel immer dann zu installieren, wenn du danach relativ schnell Zeit hättest, dich um mögliche Fehler zu kümmern. Mit etwas mehr Aufwand als im Codex steht könnte man das aber natürlich auch für die Lösungen mit Filtern einrichten.

      Viele Grüße
      Florian

  3. Hallo Florian, vielen Dank, das ist sehr hilfreich! Ginge auch eine „for each“ Abfrage um mehrere WP-Installationen nacheinander abzuklappern? Also irgendwie ein Array mit den jeweiligen Pfaden und dann einen nach den anderen ansprechen? Das wäre echt knorke wenn du da einen schnellen Hinweis parat hättest 😉

Schreibe einen Kommentar

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