WP Cron仅在第一次运行

时间:2018-12-19 作者:johnson

这是我的密码

function cron_add_weekly( $schedules ) {

   $schedules[\'seconds\'] = array(
       \'interval\' => 5,
       \'display\' => __( \'5 Seconds\' )
   );
   return $schedules;
 }

add_filter( \'cron_schedules\', \'cron_add_weekly\' );

register_activation_hook(__FILE__, \'my_activation\');
function my_activation() {
    if ( ! wp_next_scheduled( \'my_hook\' ) ) {
    wp_schedule_event( time(), \'seconds\', \'my_hook\' );
    }

}
add_action( \'my_hook\', \'my_exec\' );

register_deactivation_hook(__FILE__, \'my_deactivation\');
    function my_deactivation() {
        wp_clear_scheduled_hook(\'my_hook\');
    }

function my_exec() {
    $value = 91;
    update_user_meta($value + 1, \'from_cron\', \'updated\');
}
刷新页面后,应该每5秒更新一次用户元。但cron只是第一次运行

2 个回复
最合适的回答,由SO网友:Krzysiek Dróżdż 整理而成

好的,我已经测试了你的代码,我很确定它甚至不能运行一次。。。这就是为什么。。。

如果你看看wp_schedule_event 您将在函数顶部看到此检查:

if ( !isset( $schedules[$recurrence] ) )
    return false;
这意味着您无法安排重复性未知的事件。

那么让我们回到你的代码。。。它所做的是:

添加自定义重复(使用cron_schedules 钩子),

  • 在插件激活期间安排一个重复发生的事件

    激活钩子在插件激活期间激发。因此,该插件在激活运行之前不起作用。因此,您的自定义重复未注册。所以您的挂钩未计划。我已经测试过了wp_schedule_event 在你的激活钩子是假的,所以事件没有安排。

    那么该怎么办呢

    简单-如果要使用自定义重复,请不要将事件安排在激活挂钩上。

    下面是您的安全代码:

    register_deactivation_hook(__FILE__, \'my_deactivation\');
    function my_deactivation() {
        wp_clear_scheduled_hook(\'cron_every_5_seconds\');
    }
    
    function add_every_5_seconds_cron_schedule( $schedules ) {
        $schedules[\'every_5_seconds\'] = array(
            \'interval\'  => 5,
            \'display\'   => __( \'Every 5 Seconds\', \'textdomain\' )
        );
        return $schedules;
    }
    add_filter( \'cron_schedules\', \'add_every_5_seconds_cron_schedule\' );
    
    function schedule_my_cron_events() {
        if ( ! wp_next_scheduled( \'cron_every_5_seconds\') ) {
            wp_schedule_event( time(), \'every_5_seconds\', \'cron_every_5_seconds\' );
        }
    }
    add_action( \'init\', \'schedule_my_cron_events\' );
    
    function cron_every_5_seconds_action() {
        $value = 91;
        update_user_meta( $value + 1, \'from_cron\', \'updated\' );
    }
    add_action( \'cron_every_5_seconds\', \'cron_every_5_seconds_action\' );
    
    PS。(but it may be important) 你的代码还有一个缺陷,但可能是在这里发布之前进行了一些编辑造成的。。。

    您将无法检查cron是否只运行一次或多次。您的事件操作将更新用户元。但设置的新值始终等于91。既然你使用update_user_meta, 数据库中只存储一个这样的元数据。

  • SO网友:RiddleMeThis

    假设您上面的代码是正确的(我没有测试),请务必注意,wp cron只会在有人访问站点时运行,因此它不会像您可能想的那样每隔5秒在后台运行一次。

    作为一种解决方法,您可以禁用wp cron,然后实现真正的cron作业。

    这是一个good article 关于这个话题。

    编辑:尝试这样添加

    function cron_every_5_seconds( $schedules ) {
        $schedules[\'every_5_seconds\'] = array(
            \'interval\'  => 5,
            \'display\'   => __( \'Every 5 Seconds\', \'textdomain\' )
        );
        return $schedules;
    }
    
    add_filter(\'cron_schedules\', \'cron_every_5_seconds\');
    
    if (! wp_next_scheduled( \'cron_every_5_seconds\')) {
        wp_schedule_event(time(), \'every_5_seconds\', \'cron_every_5_seconds\');
    }
    
    add_action(\'cron_every_5_seconds\', \'cron_every_5_seconds_action\');
        function cron_every_5_seconds_action() {
            $value = 91;
            update_user_meta($value + 1, \'from_cron\', \'updated\');
        }
    ?>
    

    相关推荐

    WP cron and update post meta

    我尝试创建一个每小时运行一次的定时cron作业,这是我第一次使用wp cron。在cron函数中,如果满足某些条件,我想更新post meta值。我还在cron外部测试了cron函数的代码,以查看/打印结果。结果看起来不错,但当cronjob运行时,不会更新任何帖子。Iam使用WP Crontrol查看所有可用的cronjobs。首先,我安排一个活动(这似乎有效):function prfx_hourly_status_update_cron_job() { if ( ! wp_next_