====== 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:
- Einen Event mit einem Interval Regisrieren, der eine Action ausführt
- 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;
}
}