2017-05-16 3 views
1

Ich arbeite in einem einfachen Plugin, das einen wp_cron Job initiiert.wp_cron() Aktualisierungszeit von Optionen Seite

Ich habe eine Optionen-Seite mit einem Feld (daily_message_time), wo ich meine gewünschte Zeit eingeben, um die Cron zu planen, sagen 17:30:00 zum Beispiel, und es wird wie erwartet in der Tabelle _options gespeichert. Ich kann dann diesen Wert bekommen und es verwenden, in meinem Plugin Skript wie folgt:

register_activation_hook(__FILE__, 'send_message'); 
function send_message() { 
    if (! wp_next_scheduled ('daily_email_event')) { 
     $options  = get_option('my_settings'); 
     $daily_time  = $options['daily_message_time']; 

     // Honour WordPress timezone setting 
     $date = new DateTime($daily_time, new DateTimeZone(get_option('timezone_string'))); 
     $timestamp = $date->getTimestamp(); 

     // Shedule the event 
     wp_schedule_event($timestamp, 'daily', 'daily_email_event'); 
    } 
} 

add_action('daily_email_event', 'send_email'); 
function send_email() { 
    // Do stuff 
} 

Dies funktioniert und ich kann meine cron ist geplant für die korrekte Zeit sehen:

enter image description here

Aber die Problem ist das: Wenn ich die Zeit auf meiner Optionen-Seite ändere, wird die neue Zeit in der Datenbank gespeichert, aber der Cron-Job zeigt die neue Zeit nicht an (sie behält die ursprüngliche Zeit bei). Die einzige Möglichkeit, es zum Laufen zu bringen, ist das Deaktivieren und Reaktivieren des Plugins. Danach zeigt es die neue Zeit an.

Wie kann ich das umgehen?

+0

Gibt es ein Cache-Plugin, das Sie in Ihrem WordPress verwenden? Wenn ja, versuchen Sie den Cache zu löschen, nachdem Sie die Zeit geändert haben. –

+0

@DharmaSaputra Nein, es ist kein Cache. In der Tat ist es eine neue Instanz von WordPres mit absolut keinen Plugins außer für die Basis (oben erwähnt), die ich gerade erstelle. – user3256143

Antwort

1

Nun, diese register_activation_hook wird nur beim Aktivieren des Plugins ausgelöst. Dies wird beim Speichern der Optionen nicht ausgelöst. Um also die Funktion zum Speichern von Optionen auszulösen, müssen Sie diese an update_option_{$option} oder einen allgemeineren Haken update_option haken.

Jetzt wird Ihr Code wie sein unten-

// This hook fires only on activating the plugin 
register_activation_hook(__FILE__, 'send_message'); 
// This will fire when you update my_settings option. 
add_action('update_option_my_settings', 'send_message'); 
// or if the above hook doesn't work then use this below. It's for global options update. 
// add_action('update_option', 'send_message'); 
function send_message() { 
    if (! wp_next_scheduled ('daily_email_event')) { 
     // May be you should use the below function to clear any previous schedule. 
     // wp_clear_scheduled_hook('daily_email_event'); 
     $options  = get_option('my_settings'); 
     $daily_time  = $options['daily_message_time']; 

     // Honour WordPress timezone setting 
     $date = new DateTime($daily_time, new DateTimeZone(get_option('timezone_string'))); 
     $timestamp = $date->getTimestamp(); 

     // Shedule the event 
     wp_schedule_event($timestamp, 'daily', 'daily_email_event'); 
    } 
} 

add_action('daily_email_event', 'send_email'); 
function send_email() { 
    // Do stuff 
} 

Blick sein können Sie auch wp_clear_scheduled_hook alle bisherigen Zeitplan löschen verwenden sollten. Bitte untersuchen Sie das vor der Verwendung.

Hoffnung, das hilft.

+0

Schöne Lösung, aber wahrscheinlich muss das geändert werden '! wp_next_scheduled (...) ', da' 'update_option_ *' den Zeitplan nicht ändern kann – brasofilo

Verwandte Themen