Eine Art Cron Event in Wordpress schedulen mit wp_schedule_event()

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:

  1. Einen Event mit einem Interval Regisrieren, der eine Action ausführt
  2. Eine Action registrieren, die von dem scheduled Event ausgeführt wird

Code Beispiel um einen Event zu schedulen/registrieren

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 );
		}
	}
}

Code Beispiel um eine Action zu registrieren die vom Event ausgeführt wird

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;
	}
}

Page Tools