WordPress的cron定时任务

WordPress的定时任务是存储在数据库option表中的,option_name为cron,如下图所示:

图片[1]-WordPress的cron定时任务 - KEKC博客-KEKC博客

在底层中,用_set_cron_array函数增加定时任务,在执行时用函数_get_cron_array获取所有定时任务,可以用过滤钩子pre_get_ready_cron_jobs完全修改计划任务。

1、新增定时任务

在插件中,我们可以在插件安装时往数据库里面添加定时任务,像这样:

register_activation_hook( __FILE__, 'kekc_register_cron' );
register_activation_hook( __FILE__, 'kekc_register_cron' );
register_activation_hook( __FILE__, 'kekc_register_cron' );

再由kekc_register_cron函数增加定时任务:

function kekc_register_cron() {
if ( ! wp_next_scheduled( 'kekc_cron_1' ) ) {
wp_schedule_event( time(), 'twicedaily', 'kekc_cron_1' );
}
}
function kekc_register_cron() {
  if ( ! wp_next_scheduled( 'kekc_cron_1' ) ) {
    wp_schedule_event( time(), 'twicedaily', 'kekc_cron_1' );
  }
}
function kekc_register_cron() { if ( ! wp_next_scheduled( 'kekc_cron_1' ) ) { wp_schedule_event( time(), 'twicedaily', 'kekc_cron_1' ); } }

同时kekc_cron_1是一个动作钩子,我们需要添加执行任务。比如这样:

add_action('kekc_cron_1','kekc_cron_1_function');
function kekc_cron_1_function(){
//这里执行任务
}
add_action('kekc_cron_1','kekc_cron_1_function');
function kekc_cron_1_function(){
//这里执行任务
}
add_action('kekc_cron_1','kekc_cron_1_function'); function kekc_cron_1_function(){ //这里执行任务 }

这样就加好了,系统就会有一个计划任务了,12小时执行一次。在上方wp_schedule_event函数中第一个下次执行时间,第二个参数是执行频率,第三个是执行的钩子。

在执行的频率中,WordPress默认带了几个执行频率,可以用wp_get_schedules函数获取所有的执行频率,也可以用钩子cron_schedules增加执行频率,比如10分钟一次。我上面的是12小时一次。其他的频率如下:

$schedules = array(
'hourly' => array(
'interval' => HOUR_IN_SECONDS,
'display' => __( 'Once Hourly' ),
),
'twicedaily' => array(
'interval' => 12 * HOUR_IN_SECONDS,
'display' => __( 'Twice Daily' ),
),
'daily' => array(
'interval' => DAY_IN_SECONDS,
'display' => __( 'Once Daily' ),
),
'weekly' => array(
'interval' => WEEK_IN_SECONDS,
'display' => __( 'Once Weekly' ),
),
);
  $schedules = array(
    'hourly'     => array(
      'interval' => HOUR_IN_SECONDS,
      'display'  => __( 'Once Hourly' ),
    ),
    'twicedaily' => array(
      'interval' => 12 * HOUR_IN_SECONDS,
      'display'  => __( 'Twice Daily' ),
    ),
    'daily'      => array(
      'interval' => DAY_IN_SECONDS,
      'display'  => __( 'Once Daily' ),
    ),
    'weekly'     => array(
      'interval' => WEEK_IN_SECONDS,
      'display'  => __( 'Once Weekly' ),
    ),
  );
$schedules = array( 'hourly' => array( 'interval' => HOUR_IN_SECONDS, 'display' => __( 'Once Hourly' ), ), 'twicedaily' => array( 'interval' => 12 * HOUR_IN_SECONDS, 'display' => __( 'Twice Daily' ), ), 'daily' => array( 'interval' => DAY_IN_SECONDS, 'display' => __( 'Once Daily' ), ), 'weekly' => array( 'interval' => WEEK_IN_SECONDS, 'display' => __( 'Once Weekly' ), ), );

值:

Array
(
[hourly] => Array
(
[interval] => 3600
[display] => Once Hourly
)
[twicedaily] => Array
(
[interval] => 43200
[display] => Twice Daily
)
[daily] => Array
(
[interval] => 86400
[display] => Once Daily
)
)
Array
(
[hourly] => Array
(
[interval] => 3600
[display] => Once Hourly
)
[twicedaily] => Array
(
[interval] => 43200
[display] => Twice Daily
)
[daily] => Array
(
[interval] => 86400
[display] => Once Daily
)
)
Array ( [hourly] => Array ( [interval] => 3600 [display] => Once Hourly ) [twicedaily] => Array ( [interval] => 43200 [display] => Twice Daily ) [daily] => Array ( [interval] => 86400 [display] => Once Daily ) )

2、删除定时任务

同时,我们可以在卸载插件时,可以删除我们的计划任务。

register_deactivation_hook( __FILE__, 'kekc_delete_cron' );
function my_deactivation() {
wp_clear_scheduled_hook( 'kekc_cron_1' );
}
register_deactivation_hook( __FILE__, 'kekc_delete_cron' );
 
function my_deactivation() {
    wp_clear_scheduled_hook( 'kekc_cron_1' );
}
register_deactivation_hook( __FILE__, 'kekc_delete_cron' ); function my_deactivation() { wp_clear_scheduled_hook( 'kekc_cron_1' ); }

3、获取定时任务

①、获取单个hooks的定时任务

例子(存在即删除):

if ( false !== wp_get_scheduled_event( 'kekc_cron_1' ) ) {
wp_clear_scheduled_hook( 'kekc_cron_1' );
}
if ( false !== wp_get_scheduled_event( 'kekc_cron_1' ) ) {
  wp_clear_scheduled_hook( 'kekc_cron_1' );
}
if ( false !== wp_get_scheduled_event( 'kekc_cron_1' ) ) { wp_clear_scheduled_hook( 'kekc_cron_1' ); }

②、获取所有定时任务

这也是在执行hook时的系统代码,能获取到所有定时任务:

$crons = wp_get_ready_cron_jobs();
$crons = wp_get_ready_cron_jobs();
$crons = wp_get_ready_cron_jobs();

当然,我们也可以自己写函数控制计划任务的新增和删除,而不是在插件激活和禁用时进行管理。

© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
I only smile very joy, sorrow will not be see.
我只有笑的很欢,忧伤才不会被看穿
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容