WordPress und die verpasste Planung – wann man den Cronjob besser anders löst
Ich bin derzeit ein bisschen in der Administration oder dem Aufbau einer neuen Website mit WordPress involviert. Artikel sollen mehrmals in der Woche zu einer bestimmten Uhrzeit erscheinen. Das ist mit WordPress ja über die Planung machbar und ein Cronjob veröffentlicht den geplanten Artikel dann eben. In der Theorie sieht das so aus.
Wie funktioniert der Cronjob von WordPress?
Sehen wir uns zunächst den Mechanismus an, wie WordPress geplante Artikel veröffentlicht oder wie der Cronjob ausgeführt wird. Keine Panik, ich halte es einfach und verständlich.
Bei WordPress gibt es eine Datei, die sich wp-cron.php nennt. Dort werden geplante Aufgaben abgearbeitet. Der Code in der Datei wp-cron.php wird aber nur dann ausgeführt, wenn die Website auch aufgerufen wird. Daraus ergeben sich eventuell Probleme bei zwei Szenarien.
Gehen wir aber zuerst auf den Cronjob einer sehr neuen Website ein.
WordPress meldet verpasste Planung
Etwas verdutzt ist man schon, wenn man sich 2 Tage später an einer Website anmeldet und ein Beitrag ist nicht online gegangen. Zum Einen, dass es niemandem aufgefallen ist und zum anderen, warum der Artikel nicht veröffentlicht wurde.
In roten Buchstaben ist er mit verpasste Planung gekennzeichnet und auch ein Aufrufe der Website veröffentlicht den Beitrag nicht. Erst nachdem ich ihn aktualisiert hatte, konnte ich ihn davon überzeugen, dass er eigentlich schon online sein sollte.
Wie viel Zeit zwischen einer verpassten Planung und der geplanten Veröffentlichung sein darf, weiß ich nicht.
Ich kann es auch nicht ganz beweisen, aber vermute, dass die verpasste Planung mit der geringen Frequenz der Besucher zu tun hat.
Hast Du anfangs noch nicht viele Besucher auf Deiner Website, dann ist die Planung außerdem sehr ungenau. Stellst Du einen Artikel für 10:30 ein, würde er erst beim nächsten Seitenaufruf veröffentlicht. Vielleicht ist das erst spät nachmittags.
Eine sehr gut besuchte Website
Ist Deine Website sehr gut besucht, dann wird bei jedem Aufruf die Datei wp-cron.php aufgerufen. Es steht zwar nicht viel drin, aber es ist trotzdem nicht notwendig. Aus Sicht des Performance Tunings würde es vielleicht auch reichen, wenn der Cronjob von WordPress zum Beispiel alle 10 Minuten aufgerufen wird.
Performance Tuning bei Servern und Websites bedeutet häufig, dass viele kleine Änderungen große Wirkung zeigen. Den Cronjob nicht WordPress zu überlassen, ist eine davon.
Cronjob anderen überlassen
Du kannst den Cronjob in WordPress deaktivieren und ihn über ein anderes System anstoßen. Der Vorteil daran ist, dass Du selbst bestimmen kannst, wie oft der Cronjob ausgeführt werden soll.
Zunächst deaktivierst Du den WordPress-Cron über die Datei wp-config.php. Öffne sie und füge nach der Datenbank-Konfiguration diese Zeile ein:
define('DISABLE_WP_CRON', true);
Die Zeile stammt von den WordPress-Entwicklern höchstpersönlich. Bei mir habe ich noch einen Kommentar hinzugefügt. Der ist zwar nicht notwendig, ist aber eine Angewohnheit.
Danach müssen wir den Cronjob anders anstoßen. Verschiedene Hoster stellen unterschiedliche Optionen zur Verfügung. Da musst Du Dich ein bisschen schlau machen, wie Dein Hoster geplante Aufgaben ermöglicht. Hast Du einen eigenen Server, dann kannst Du unter Linux oder macOS den eingebauten Cron nehmen. Die WordPress-Entwickler nehmen wget, aber natürlich funktioniert curl genauso. hier zwei Beispiele, die die geplanten Aufgaben alle 59 Minuten (mit wget) oder 10 Minuten (via curl) anstoßen:
*/59 * * * * /usr/bin/wget -q -O - https://Deine_Seite/wp-cron.php >/dev/null 2>&1
*/10 * * * * /usr/bin/curl https://Deine_Seite/wp-cron.php > /dev/null 2>&1
Benutzt Du Windows, könntest Du den Cron über die Powershell kitzeln:
powershell "Invoke-WebRequest http://Deine_Seite/wp-cron.php"
Alternativ dazu könntest Du die Kommandozeilenschnittstelle wp-cli nutzen. Persönlich gehe ich gerne den Weg des geringsten Widerstandes und wenn es anders auch funktioniert … weiterhin musst Du in so einem Fall einen eigenen Server benutzen, auf dem Du etwas installieren darfst.
Bei direktem Zugriff auf den Server gibt es noch die Option, die Datei wp-cron.php über php und die Kommandozeile aufzurufen:
cd /Pfad/zu/Deiner/WP-Installation; php -q wp-cron.php
Es ist natürlich auch möglich, den Aufruf von einem Gerät ausführen zu lassen, das sowieso immer läuft. Hast Du vielleicht irgendwo einen Raspberry Pi, der immer läuft? Möglicherweise sind irgendwo sogar die stromsparenden Modelle Raspberry Pi A+ oder Raspberry Pi Zero W im Einsatz? Alle 10 Minuten eine Website schubsen, merkt das Gerät gar nicht. Es gibt auf jeden Fall viele Möglichkeiten, den Cronjob auszuführen.
Einige raten dazu, den Zusatz ?doing_wp_cron an die URL anzuhängen. Mir ist noch nicht ganz klar, was das bringen soll, aber ich wollte es nicht unterschlagen. Solltest Du Probleme haben, wäre das noch eine Option zum Ausprobieren. Ein Aufruf würde dann zum Beispiel so aussehen:
*/10 * * * * /usr/bin/curl https://Deine_Seite/wp-cron.php?doing_wp_cron > /dev/null 2>&1
Vorsicht bei Plugins, die den Scheduler oder Planer benutzen!
Nicht nur geplante Artikel, sondern auch das Schicken von E-Mails oder diverse Plugins für Backups benutzen den in WordPress eingebauten Cronjob. Änderst Du an der Art etwas, wie der Cronjob benutzt wird, dann teste, ob Deine anderen Mechanismen noch funktionieren.
Geht es nur um die Veröffentlichung von Beiträgen, sollte die Methode ohne Probleme funktionieren. Ich kann aber nicht für alle möglichen Plugins und Eigenlösungen sprechen. Deswegen nach Veränderungen immer schön monitoren, welche potenziellen Auswirkungen das hat!
Funktioniert das auch?
Siehst Du den Beitrag hier, dann hat das geklappt. Ich habe die Lösung mit 10 Minuten und curl auf meinem eigenen Server im Einsatz und der Beitrag hier wurde geplant.
Nette Pi-Konstellation
Suchst Du ein VPN für den Raspberry Pi? NordVPN* bietet einen Client, der mit Raspberry Pi OS (32-Bit / 64-Bit) und Ubuntu für Raspberry Pi (64-Bit) funktioniert.