- verstehen, wie WP-Cron funktioniert und wo seine Grenzen liegen
- wiederkehrende und einmalige Aufgaben planen und sauber entfernen
- WP-Cron durch einen Server-Cronjob ersetzen
- lange Aufgaben mit Warteschlangen wie dem Action Scheduler aufteilen
Viele Plugins müssen Dinge tun, die nicht an einen Seitenaufruf gebunden sind: jeden Morgen Terminerinnerungen verschicken, stündlich Daten mit einem Kalender abgleichen, nachts alte Einträge aufräumen oder nach einer Buchung im Hintergrund eine Rechnung erzeugen. WordPress bietet dafür ein eigenes Planungssystem, WP-Cron. Es ist einfach zu nutzen, hat aber eine Eigenheit, die man kennen muss – sonst kommen Erinnerungen zu spät oder gar nicht. Diese Lektion erklärt WP-Cron, seine Grenzen und robuste Alternativen für größere Aufgaben.
1. So funktioniert WP-Cron
Der entscheidende Punkt: WP-Cron läuft nur, wenn jemand die Website besucht. Auf einer Seite mit wenig Besuchern kann eine für 6 Uhr geplante Erinnerung erst um 9 Uhr verschickt werden – beim ersten Besuch des Tages. Probieren Sie es aus:
2. Aufgaben planen
Eine geplante Aufgabe besteht aus einem Hook und einem Zeitplan. Man plant den Hook einmal ein – typischerweise bei der Aktivierung – und hängt eine Funktion an ihn. Wichtig ist, vorher zu prüfen, ob die Aufgabe schon geplant ist, sonst entstehen Duplikate. Bei der Deaktivierung wird sie wieder entfernt.
1<?php2register_activation_hook( RADWERK_DATEI, function () {3 if ( ! wp_next_scheduled( 'radwerk_erinnerungen' ) ) {4 wp_schedule_event( strtotime( 'tomorrow 06:00' ), 'daily', 'radwerk_erinnerungen' );5 }6} );78add_action( 'radwerk_erinnerungen', function () {9 foreach ( radwerk_termine_morgen() as $termin ) {10 wp_mail( $termin->mail, 'Ihr Werkstatttermin morgen', radwerk_text( $termin ) );11 }12} );1314register_deactivation_hook( RADWERK_DATEI, function () {15 wp_clear_scheduled_hook( 'radwerk_erinnerungen' );16} );Variablen
Ausgabe
Für einmalige Aufgaben gibt es wp_schedule_single_event: etwa zwei Tage nach einer Reparatur eine Bitte um Bewertung zu verschicken. Mit Argumenten lässt sich festlegen, für welchen Termin die Aufgabe gilt.
3. Zuverlässig machen
Für alles, was pünktlich sein muss, wird WP-Cron vom Seitenaufruf entkoppelt. In der wp-config.php schaltet DISABLE_WP_CRON die Auslösung durch Besuche ab, und ein echter Cronjob des Servers ruft alle fünf Minuten wp-cron.php oder den Befehl wp cron event run --due-now auf. Das ist zuverlässiger und entlastet zugleich die Seitenaufrufe der Besucher. Die meisten Hoster bieten Cronjobs im Kundenmenü an.
1<?php2define( 'DISABLE_WP_CRON', true );34# Cronjob des Servers (alle 5 Minuten):5# */5 * * * * cd /var/www/html && wp cron event run --due-now --quiet4. Lange Aufgaben aufteilen
Eine Cron-Aufgabe läuft in einer normalen PHP-Anfrage und hat damit dieselben Grenzen: Nach 30 bis 60 Sekunden bricht der Server sie oft ab. Wer 5.000 E-Mails verschicken oder 10.000 Produkte abgleichen muss, teilt die Arbeit in kleine Pakete auf. Dafür hat sich der Action Scheduler etabliert, eine Bibliothek aus WooCommerce, die viele Plugins mitbringen. Er speichert Aufgaben in eigenen Tabellen, arbeitet sie in Paketen ab, wiederholt fehlgeschlagene und zeigt im Backend eine Übersicht mit Protokoll.
| Aufgabe | Werkzeug |
|---|---|
| Täglich aufräumen, stündlich abgleichen | WP-Cron (mit Server-Cron) |
| Einmalig in zwei Tagen eine Mail | wp_schedule_single_event |
| Tausende Einträge verarbeiten | Action Scheduler (Pakete) |
| Sehr große, rechenintensive Jobs | eigener Worker außerhalb von WordPress |
Ein Beispiel
Ein Yogastudio verschickt Erinnerungen am Vorabend jeder Stunde und fragt zwei Tage nach einem Probetraining nach Feedback. Anfangs lief beides über WP-Cron ohne Server-Cronjob. Die Folge: Weil die Website abends wenig besucht wurde, kamen Erinnerungen manchmal erst am nächsten Morgen – nach der Stunde. Nach der Umstellung auf DISABLE_WP_CRON und einen Cronjob des Hosters alle fünf Minuten sind die Zeiten verlässlich. Die Feedback-Mails werden als einmalige Ereignisse mit der Buchungsnummer als Argument geplant; wird eine Buchung storniert, entfernt das Plugin das zugehörige Ereignis mit wp_unschedule_event. Als das Studio später alle 2.000 Mitglieder über neue Kurse informieren wollte, übernahm der Action Scheduler den Versand in Paketen zu je 50 Mails.
Wichtig für den Betrieb: Aufgaben sollten so geschrieben sein, dass sie ohne Schaden zweimal laufen dürfen. Wer eine Erinnerung verschickt, speichert danach ein Metafeld „erinnert“ und prüft es vor dem Versand. Bricht eine Aufgabe mittendrin ab und startet neu, bekommt niemand doppelte Mails.
5. Häufige Fragen
Wie sehe ich, was geplant ist? Mit wp cron event list auf der Kommandozeile oder mit dem Plugin WP Crontrol, das alle Aufgaben mit nächster Ausführung anzeigt und sie manuell starten lässt – sehr hilfreich bei der Fehlersuche.
Warum laufen meine Aufgaben doppelt? Meist wurde ohne wp_next_scheduled geprüft eingeplant, etwa bei jedem Aufruf auf init. Dann steht der Hook mehrfach in der Liste. wp_clear_scheduled_hook räumt auf.
Welche Zeitzone gilt? WP-Cron arbeitet mit Zeitstempeln in UTC. Wer „6 Uhr deutscher Zeit“ meint, rechnet die Zeitzone der Website ein, etwa mit der Klasse DateTimeImmutable und wp_timezone().
6. Übung zum Selbermachen
Planen Sie in Ihrem Übungsplugin eine stündliche Aufgabe, die die Anzahl veröffentlichter Beiträge in eine Option schreibt. Installieren Sie WP Crontrol in Playground, prüfen Sie, dass Ihr Hook genau einmal erscheint, und starten Sie ihn manuell. Deaktivieren Sie das Plugin und kontrollieren Sie, dass der Eintrag verschwunden ist. Wer mag, ergänzt ein eigenes Intervall „alle 15 Minuten“ über den Filter cron_schedules.
- [1]WordPress.org (2026): Plugin Handbook – Cron: Understanding WP-Cron, Scheduling WP Cron Events, Hooking WP-Cron Into the System Task Scheduler.
- [2]WP-CLI (2026): wp cron – Command Reference.
- [3]Action Scheduler (2026): Documentation. actionscheduler.org.
Stand: September 2026, WordPress 7.1, PHP 8.3. Kursmaterial der Klarwerk Akademie. WordPress entwickelt sich schnell – maßgeblich ist die aktuelle Dokumentation auf developer.wordpress.org.