$schedules * @return array */ public static function addInterval(array $schedules): array { $schedules[self::INTERVAL] = [ 'interval' => 900, 'display' => __('Every 15 minutes (DomainWarn)', 'domainwarn'), ]; return $schedules; } public static function schedule(): void { // Der Filter gehört hierher, nicht nur in Plugin::boot(): Bei der Aktivierung lädt WordPress die Datei in // einem Durchlauf, in dem plugins_loaded längst gelaufen ist. Ohne den Filter kennt WordPress das // Intervall nicht, wp_schedule_event legt still nichts an – und das Lebenszeichen, um das es hier geht, // bliebe für immer aus, ohne dass jemand einen Fehler sieht. add_filter('cron_schedules', [self::class, 'addInterval']); if (wp_next_scheduled(self::HOOK) === false) { wp_schedule_event(time() + 60, self::INTERVAL, self::HOOK); } } public static function unschedule(): void { $timestamp = wp_next_scheduled(self::HOOK); if ($timestamp !== false) { wp_unschedule_event($timestamp, self::HOOK); } } /** * Der Lauf selbst. Fehler landen im Fehlerprotokoll und beenden den Lauf nicht: Ein Aussetzer bei DomainWarn * darf eine Website nicht ins Stocken bringen. */ public function run(): void { try { $this->report->run(); } catch (\Throwable $e) { if (defined('WP_DEBUG') && WP_DEBUG) { // phpcs:ignore WordPress.PHP.DevelopmentFunctions.error_log_error_log -- nur mit WP_DEBUG; ohne Spur bliebe ein stiller Ausfall unauffindbar. error_log('DomainWarn: '.$e->getMessage()); } } } }