WordPress ist die OpenSource Komplettlösung schlechthin wenn es um die Erstellung von Webseiten geht. Wie jede Software will WordPress gehegt und gepflegt werden. Wenn man nur eine oder zwei Instanzen betreut, dann nimmt man die manuelle Wartung und Pflege dieser gern in Kauf. Bei steigender Anzahl an Instanzen wächst die Anzahl der Sonderlösungen und die Wartung wird aktiver.
Daher ergeben sich für mich folgende Anforderungen an die Automatisierungslösung:
- Aktualisierung des WordPress Cores muss ohne Web-Login möglich sein
- Installation, Aktualisierung und Entfernen von Plugins und Themes muss ohne Web-Login möglich sein
- Logging von Wartungsaktivitäten ist zwingend notwendig
- Multi-Instanzfähigkeit des Tools muss gewährleistet sein
- Keine zwingende Notwendigkeit eines SSH Zugriffs
- Möglichkeit zum Monitoren / Überwachen der Aktivitäten muss gegeben sein
Ich habe mir das Tool wp-cli genauer angeschaut und festgestellt, dass sich damit alle meine Anforderungen umsetzen lassen.
Installation
Die Installation ist denkbar einfach. Mit folgendem Befehl wird die aktuelle Version des Kommandozeilentools wp-cli mittels cURL heruntergeladen (1) und im aktuellen Verzeichnis mit dem Namen wp gespeichert. Nachdem die Datei wp mit dem Executable-Bit versehen ist (2), kann man diese nun direkt ausführen.
curl -o wp https://raw.githubusercontent.com/wp-cli/builds/gh-pages/phar/wp-cli.phar
chmod +x wp
Ordnung ist das halbe Leben und damit das Script seinen definierten Platz hat, mache ich dieses unter /usr/local/bin global auf dem System verfügbar. Alternativ kann man die Datei auch unter $HOME/bin plazieren.
sudo mv wp /usr/local/bin
Was kann das Tool wp-cli
Das Tool ist in meinen Augen sehr mächtig und läßt keine Wünsch offen. Bei Aufruf von wp erhält man eine Übersicht an Möglichkeiten die das Tool bietet. Hier spricht das Tool von „(sub)commands“ welche ausgeführt werden können.
Die Übersicht ist wie eine man-page aufgebaut. Mit den Pfeil-Tasten, Bild-Tasten oder mit der Maus läßt sich die Seite durchblättern und die man-page Such-Syntax (mittels „/“) ist ebenfalls verfügbar. Das finde ich eine Sache.

Wie nutze ich wp-cli für mich
Prüfen auf Updates
Mit den folgenden Kommandos kann man sich einen Überblick verschaffen, ob man up2date ist oder neue Updates vorliegen. Hier für den WordPress Core:
user@server:/path/to/site/htdocs$ wp core check-update
+---------+-------------+-------------------------------------------------------------------+
| version | update_type | package_url |
+---------+-------------+-------------------------------------------------------------------+
| 5.9.1 | minor | https://downloads.wordpress.org/release/de_DE/wordpress-5.9.1.zip |
+---------+-------------+-------------------------------------------------------------------+
Oder Plugins. Hier sind 9 Plugins installiert und 6 davon brauchen ein Update
user@server:/path/to/site/htdocs$ wp plugin status
9 installed plugins:
A akismet 4.2.2
UA elementor 3.5.4
UA header-footer-elementor 1.6.8
UA essential-addons-for-elementor-lite 5.0.5
UA fluentform 4.3.0
UA happy-elementor-addons 3.4.1
A mautic-for-fluent-forms 1.0.2
A two-factor 0.7.1
UA unlimited-elements-for-elementor 1.4.99
Legend: A = Active, U = Update Available
Oder Themes. Hier sind 5 themes installiert und alle haben ein Update nötig.
user@server:/path/to/site/htdocs$ wp theme status
5 installed themes:
UA hello-elementor 2.4.1
UI twentynineteen 2.1
UI twentytwenty 1.8
UI twentytwentyone 1.4
UI twentytwentytwo 1.0
Legend: A = Active, I = Inactive, U = Update Available
Nach dem Prüfen kommt das Aktualisieren
Im nachfolgenden werden das WordPress core, Plugin, sowie Theme-Update ausgeführt. In den folgenden 3 Screenshots kann man sehen dass wp-cli den Aktualisierungsprozess gut meistert und das Handling des Wartungsmodus übernimmt.
user@server:/path/to/site/htdocs$ wp core update
Updating to version 5.9.1 (de_DE)...
Herunterladen der Aktualisierung von https://downloads.wordpress.org/release/de_DE/wordpress-5.9.1.zip...
Entpacken der aktualisierten Version …
<p>Einige Übersetzungen benötigen eine Aktualisierung. Warte noch ein paar Sekunden ab, während wir diese ebenfalls aktualisieren.</p>
<div class="update-messages lp-show-latest"><h2>Aktualisierung der Übersetzungen für Elementor (de_DE) …</h2><p>Herunterladen der Übersetzung von <span class="code">https://downloads.wordpress.org/translation/plugin/elementor/3.5.4/de_DE.zip</span></p>
<p>Entpacken der aktualisierten Version …</p>
<p>Die aktuelle Version wird installiert …</p>
<p>Alte Übersetzung wird entfernt …</p>
<p>Die Übersetzung wurde erfolgreich aktualisiert.</p>
</div><div class="update-messages lp-show-latest"><h2>Aktualisierung der Übersetzungen für Fluent Forms (de_DE) …</h2><p>Herunterladen der Übersetzung von <span class="code">https://downloads.wordpress.org/translation/plugin/fluentform/4.3.0/de_DE.zip</span></p>
<p>Entpacken der aktualisierten Version …</p>
<p>Die aktuelle Version wird installiert …</p>
<p>Alte Übersetzung wird entfernt …</p>
<p>Die Übersetzung wurde erfolgreich aktualisiert.</p>
</div><div class="update-messages lp-show-latest"><h2>Aktualisierung der Übersetzungen für Two Factor (de_DE) …</h2><p>Herunterladen der Übersetzung von <span class="code">https://downloads.wordpress.org/translation/plugin/two-factor/0.7.1/de_DE.zip</span></p>
<p>Entpacken der aktualisierten Version …</p>
<p>Die aktuelle Version wird installiert …</p>
<p>Alte Übersetzung wird entfernt …</p>
<p>Die Übersetzung wurde erfolgreich aktualisiert.</p>
</div><script type="text/javascript">
(function( wp ) {
if ( wp && wp.updates && wp.updates.decrementCount ) {
wp.updates.decrementCount( "translation" );
}
})( window.wp );
</script>
Success: WordPress updated successfully.
user@server:/path/to/site/htdocs$ wp theme update --all
Anschalten des Wartungsmodus …
Herunterladen der Aktualisierung von https://downloads.wordpress.org/theme/hello-elementor.2.5.0.zip...
Entpacken der aktualisierten Version …
Die aktuelle Version wird installiert …
Die alte Version des Themes wird entfernt...
Das Theme wurde erfolgreich aktualisiert.
Herunterladen der Aktualisierung von https://downloads.wordpress.org/theme/twentynineteen.2.2.zip...
Using cached file '/home/swoodlede/.wp-cli/cache/theme/twentynineteen-2.2.zip'...
...
Das Theme wurde erfolgreich aktualisiert.
Abschalten des Wartungsmodus …
+-----------------+-------------+-------------+---------+
| name | old_version | new_version | status |
+-----------------+-------------+-------------+---------+
| hello-elementor | 2.4.1 | 2.5.0 | Updated |
| twentynineteen | 2.1 | 2.2 | Updated |
| twentytwenty | 1.8 | 1.9 | Updated |
| twentytwentyone | 1.4 | 1.5 | Updated |
| twentytwentytwo | 1.0 | 1.1 | Updated |
+-----------------+-------------+-------------+---------+
Success: Updated 5 of 5 themes.
user@server:/path/to/site/htdocs$ wp plugin update --all
Anschalten des Wartungsmodus …
Herunterladen der Aktualisierung von https://downloads.wordpress.org/plugin/elementor.3.5.6.zip...
Entpacken der aktualisierten Version …
Die aktuelle Version wird installiert …
Die alte Version des Plugins wird entfernt...
Das Plugin wurde erfolgreich aktualisiert.
Herunterladen der Aktualisierung von https://downloads.wordpress.org/plugin/header-footer-elementor.1.6.9.zip...
...
Das Plugin wurde erfolgreich aktualisiert.
Abschalten des Wartungsmodus …
+-------------------------------------+-------------+-------------+---------+
| name | old_version | new_version | status |
+-------------------------------------+-------------+-------------+---------+
| elementor | 3.5.4 | 3.5.6 | Updated |
| header-footer-elementor | 1.6.8 | 1.6.9 | Updated |
| essential-addons-for-elementor-lite | 5.0.5 | 5.0.9 | Updated |
| fluentform | 4.3.0 | 4.3.3 | Updated |
| happy-elementor-addons | 3.4.1 | 3.4.4 | Updated |
| unlimited-elements-for-elementor | 1.4.99 | 1.5.3 | Updated |
+-------------------------------------+-------------+-------------+---------+
Success: Updated 6 of 6 plugins.
Automatisierung
Nachfolgend stelle ich hier ein Script zur Verfügung zum automatischen aktualisieren des WordPress Cores, sowie Plugins und Themes. Dieses nutze ich um meine WordPress Instanzen auf dem aktuellen Stand zu halten.
Ich lasse dieses jedoch nicht voll automatisiert laufen auf produktiven Systemen, da es in diesem Zustand nicht über die geeigneten Absicherungsmaßnahmen verfügt. Aber selbst die teilautomatisierte (manuelle) Ausführung hilft bereits viel Zeit einzusparen, insbesondere wenn es darum geht mehrere Instanzen auf den aktuellen Stand zu bringen.
#!/bin/bash
if [ $# -ne 1 ]; then
echo "Usage: $0 <path to wordpress installation>" && exit 1
fi
if [ ! -f $1/wp-login.php ]; then
echo "ERROR - wrong path to wordpress installation" && exit 1
fi
PHP="/usr/bin/php"
WP="$PHP /usr/local/bin/wp"
PATH="--path=$1"
echo "Core update"
$WP $PATH core update
$WP $PATH core update-db
echo "Plugin and Theme update"
$WP $PATH plugin update --all
$WP $PATH theme update --all
echo "Elementor DB update"
$WP $PATH elementor update db
echo "Language update"
$WP $PATH language core update
$WP $PATH language plugin update --all
$WP $PATH language theme update --all
Das Script kann unter Angabe des Pfades zur jeweiligen WordPress Installation aufgerufen werden. Als Parameter kann der Pfad full-qualified angegeben werden:
/usr/local/bin/wp-upgrade-all.sh /path/to/my/wordpressinstallation
Oder auch absolut. Hier im Beispiel befinden wir uns direkt im WordPress installationsverzeichnis. Dann reicht ein „.“ als relative Pfadangabe.
cd /path/to/my/wordpressinstallation
/usr/local/bin/wp-upgrade-all.sh .
Bildnachweise:
- https://pixabay.com
- https://de.wikipedia.org/wiki/WordPress.com