当前浏览:首页 / WordPress钩子 / cron_schedules

apply_filters( 'cron_schedules', array[] $new_schedules )

过滤非默认的cron计划任务

cron

schedule 计划任务


参数

$new_schedulesarray[]
非默认的cron计划任务数组。默认为空。

更多信息

过滤器接受数组中的非默认cron计划任务数组(多维数组)。外部数组有一个键,该键是计划的名称(例如,“weekly”)。其值是一个具有两个键的数组,一个是“interval”,另一个是“display”。

“interval”是cron计划运行时间的秒数。因此,对于每小时计划,“interval”值将为3600或60*60。对于每周计划,“interval”值为60*60*24*7或604800。

“display”是非默认cron计划的描述。对于“weekly”键,“display”可能是__(‘Once weekly)。

为什么这很重要?

当计划使用WordPress Cron服务运行自己的操作时,您必须指定WordPress应该使用的时间间隔。WordPress有自己的、有限的、默认的时间间隔或“时间表”,包括“hourly”(每小时)、“twicedaily”(每两天)和“daily”(每天)。此过滤器允许您将自己的间隔添加到默认设置。

对于您的插件,将向您传递一个数组,您可以通过执行以下操作轻松添加每周计划:

function my_add_weekly( $schedules ) {
	// add a 'weekly' schedule to the existing set
	$schedules['weekly'] = array(
		'interval' => 604800,
		'display' => __('Once Weekly')
	);
	return $schedules;
}
add_filter( 'cron_schedules', 'my_add_weekly' );

添加多个间隔的工作原理类似:

function my_add_intervals($schedules) {
	// add a 'weekly' interval
	$schedules['weekly'] = array(
		'interval' => 604800,
		'display' => __('Once Weekly')
	);
	$schedules['monthly'] = array(
		'interval' => 2635200,
		'display' => __('Once a month')
	);
	return $schedules;
}
add_filter( 'cron_schedules', 'my_add_intervals');

确保将计划添加到传递的数组中,如示例所示。如果您只返回自己的时间表数组,则可能会删除其他插件创建的时间表。



源码

查看源码 官方文档


更新日志

版本描述
2.1.0开始引入

使用示例

  • 示例1

    添加一个自定义cron计划为每5分钟:

    /**
     * Adds a custom cron schedule for every 5 minutes.
     *
     * @param array $schedules An array of non-default cron schedules.
     * @return array Filtered array of non-default cron schedules.
     */
    function devhub_custom_cron_schedule( $schedules ) {
    	$schedules[ 'every-5-minutes' ] = array( 'interval' => 5 * MINUTE_IN_SECONDS, 'display' => __( 'Every 5 minutes', 'devhub' ) );
    	return $schedules;
    }
    add_filter( 'cron_schedules', 'devhub_custom_cron_schedule' );
  • 示例2

    自定义cron计划,每10 & 15秒

    function custom_cron_job_recurrence( $schedules ) 
    {
    	if(!isset($schedules['10sec']))
    	{
    		$schedules['10sec'] = array(
    			'display' => __( 'Every 10 Seconds', 'twentyfifteen' ),
    			'interval' => 10,
    		);
    	}
    	
    	if(!isset($schedules['15sec']))
    	{
    		$schedules['15sec'] = array(
    		'display' => __( 'Every 15 Seconds', 'twentyfifteen' ),
    		'interval' => 15,
    		);
    	}
    	
    	return $schedules;
    }
    add_filter( ‘cron_schedules’, ‘custom_cron_job_recurrence’ );
  • 示例3

    添加用户定义的间隔值:
    使用函数方法

         add_filter( 'cron_schedules', 'wpdocs_add_cron_interval' );
         function wpdocs_add_cron_interval( $schedules ) {
              $options = get_option( 'wpdocs_custom_interval' );
              $interval = ( ! empty( $options ) ? absint( $options ) * HOUR_IN_SECONDS : DAY_IN_SECONDS );
    
              $schedules['wpdocs_interval'] = array(
                   'interval' => $interval,
                   'display' => esc_html__( 'Custom Interval' )
              );
    
              return $schedules;
        }

    使用基于类的方法

         add_filter( 'cron_schedules', array( $this, 'add_cron_interval' ) );
    
        /**
         * Adds custom time intervals for the cron.
         */
        private function add_cron_interval( $schedules ) {
              $options = get_option( 'wpdocs_custom_interval' );
              $interval = ( ! empty( $options ) ? absint( $options ) * HOUR_IN_SECONDS : DAY_IN_SECONDS );
    
              $schedules['wpdocs_interval'] = array(
                   'interval' => $interval,
                   'display' => esc_html__( 'Custom Interval' )
              );
    
              return $schedules;
        }
  • 示例4

    为了节省您的时间,我建议您始终在每次页面加载时运行的主要动作中挂接cron_schedules过滤器。像initwp_loaded。在使用自定义计划编写代码之前,还可以挂接到该过滤器。

    例如:

    // function that registers new custom schedule
    
    function bf_add_custom_schedule( $schedules )
    {
        $schedules[ 'every_five_minutes' ] = array(
            'interval' => 300,
            'display'  => 'Every 5 minutes',
        );
    
        return $schedules;
    }
    
    // function that schedules custom event
    
    function bf_schedule_custom_event()
    {
        // the actual hook to register new custom schedule
    
        add_filter( 'cron_schedules', 'bf_add_custom_schedule' );
    
        // schedule custom event
    
        if( !wp_next_scheduled( 'bf_your_custom_event' ) )
        {
            wp_schedule_event( time(), 'every_five_minutes', 'bf_your_custom_event' );
        }
    }
    add_action( 'init', 'bf_schedule_custom_event' );
    
    // fire custom event
    
    function bf_do_something_on_schedule()
    {
        // your code...
    }
    add_action( 'bf_your_custom_event', 'bf_do_something_on_schedule' );

    这种方法可以确保在wp_schedule_event函数中使用自定义计划之前始终注册该计划。并将您从令人讨厌的"invalid_schedule":"Event schedule does not exist."错误中拯救出来。

    干杯:)