wp_cron()没有更新选项页

时间:2017-05-16 01:03:47

标签: wordpress

我正在使用一个启动wp_cron作业的简单插件。

我有一个带有字段的选项页面(daily_message_time),我输入我所需的时间来安排cron,例如17:30:00,并按预期存储在_options表中。然后我可以获得该值并在我的插件脚本中使用它:

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
}

这有效,我可以看到我的cron已安排在正确的时间:

enter image description here

但问题是:如果我在选项页面中更改时间,新时间会存储在数据库中,但cron作业不会显示新时间(它会保留原始时间)。我可以让它工作的唯一方法是再次停用并重新激活插件,之后它会显示新的时间。

我怎样才能解决这个问题?

1 个答案:

答案 0 :(得分:1)

好吧,这个register_activation_hook仅在激活插件时触发。保存选项时不会触发此操作。因此,要在保存选项上触发函数,您需要将其挂钩到update_option_{$option}或更通用的挂钩update_option

现在您的代码如下所示 -

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

您可能也应该使用wp_clear_scheduled_hook来清除之前的日程安排。请在使用前进行研究。

希望有所帮助。