Wordpress bietet eine Art Cron-Job Funktion an um regelmäßig in festen Abständen eine Aktion ausführen zu lassen. Die Wordpress Cron Events werden jedoch ausgeführt, wenn Nutzer die Seite besuchen, d.h. je nach Cron-Task dauert es ggf. entsprechend Lange bis ein armer Nutzer erst die Seite laden sieht. Um das zu umgehen, solltest du auf deinem Server einen echten Cron-Taks einrichten, der direkt die wp-cron.php
im Hauptverzeichnis aufruft. Dann werden die Tasks/Events im Hintergrund ausgeführt ohne das die Frontend User etwas mit bekommen.
Es handelt sich bei den Wordpress Crons um scheduled Events, die mit der Funktion wp_schedule_event() registriert werden. Jeder Cron den man einrichtet besteht aus zwei Teilen:
Der Code sagt WP, dass es in einem täglichen Rhythmus eine Action ausgeführt werden soll. Die Action selbst ist in einer zweiten File, siehe zweites Beispiel.
namespace theme\wp_cron; use DateTime; use DateInterval; /**------------------------------------------------------------ * Register a Cron in Wordpress * ------------------------------------------------------------ * * Aktion im WP-Cron registrieren und täglich ausführen lassen. * * Dokumentation von wp_schedule_event() * @link https://developer.wordpress.org/reference/functions/wp_schedule_event/ * */ add_action( 'init', ['theme\wp_cron\RegisterCron','do'] ); final class RegisterCron { // --- Settings public static $action_name = 'name_of_registered_action'; // <- Das muss der gleiche Name wie die Action sein die ausgeführt werden soll public static $repetition = 'daily'; //hourly, twicedaily public static function do() { //wp_clear_scheduled_hook(self::$cron_name); // --- falls es resettet werden muss, z.b. zum debuggen // Check ob es den cron bereits gibt, falls nicht init if ( ! wp_next_scheduled( self::$cron_name ) ) { //$date = new DateTime( 'tomorrow' ); // -> morgen 00:00 Uhr Serverzeit //$date->modify( '+ 6 hour' ); // -> morgen 06:00 Uhr Serverzeit $date = new DateTime( 'today 21:00' ); // -> Heute 21:00 Uhr Serverzeit $timestamp = $date->getTimestamp(); wp_schedule_event( $timestamp, self::$repetition, self::$action_name ); } } }
Diese Code ist der eigentliche “Cron” der dann regelmäßig ausgeführt wird. Dazu gibt es eine Bonus Methode um zu überprüfen ob die Action entsprechend als Cron/Scheduled Event registriert wurde und wann die Action als nächstes ausgeführt wird.
namespace theme\wp_cron; use DateTime; /**------------------------------------------------------------ * Täglich: Action die ausgeführt wird * ------------------------------------------------------------ * * Check if is running: * $cron_infos = []; * YourCronAction::is_cron_running( $cron_infos ); * var_dump( $cron_infos ); */ // Action & Function die beim Cron aufgerufen wird YourCronAction::$action_name = 'name_of_registered_action'; // <- Das muss der gleiche Name wie in der RegisterCron Class sein add_action( YourCronAction::$action_name, ['thene\wp_cron\YourCronAction','do'] ); final class YourCronAction { public static $action_name = '' public static function do() { // ... action code ... } public static function is_cron_running( &$cron_infos = [] ):bool { $all_cron_jobs = get_option( 'cron' ); $cron_name = self::$action_name; $is_cron_running = false; foreach( $all_cron_jobs as $key => $single_cron ) { $is_export_cron = ( isset( $single_cron[$cron_name] ) ) ? true : false; if( $is_export_cron ){ $is_cron_running = true; $first_array_key = array_key_first($single_cron[$cron_name]); $cron_infos = $single_cron[$cron_name][$first_array_key]; } } return $is_cron_running; } }