WordPress的定时任务是存储在数据库option表中的,option_name为cron,如下图所示:
![图片[1]-WordPress的cron定时任务 - KEKC博客-KEKC博客](http://www.kekc.cn/wp-content/uploads/2024/04/20240425165640375-image.png)
在底层中,用_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
暂无评论内容