Tôi có một chức năng mà tôi chỉ muốn chạy thông qua một công việc định kỳ. Có cách nào để tôi có thể kiểm tra xem một sự kiện theo lịch trình cụ thể đang gọi chức năng này chứ không phải bất cứ điều gì khác không?
Tôi có một chức năng mà tôi chỉ muốn chạy thông qua một công việc định kỳ. Có cách nào để tôi có thể kiểm tra xem một sự kiện theo lịch trình cụ thể đang gọi chức năng này chứ không phải bất cứ điều gì khác không?
Câu trả lời:
WordPress có một hằng số DOING_CRON
giúp chúng ta biết chúng ta có đang thực hiện các công việc định kỳ hay không. Nó được định nghĩa trong wp-cron.php
tập tin.
Vì vậy, bạn có thể kiểm tra hằng số này trong mã của mình:
if ( defined( 'DOING_CRON' ) )
{
// Do something
}
wp_doing_cron()
có thể được sử dụng thay thế.
Chỉ cần xem qua »Trình kiểm tra API Cron« , mà tôi đã viết cho câu hỏi # 18017 . Plugin xây dựng một bảng hiển thị trên shutdown
-hook / cuối trang.
Nó sử dụng _get_cron_array()
chức năng để lấy tất cả các hành động đã đăng ký và theo lịch trình. Một chức năng hữu ích khác là wp_get_schedules()
. Cách thứ ba là gọi _get_cron_array()
trực tiếp dữ liệu cơ bản bằng cách gọi get_option( 'cron' );
- tốt hơn hết là sử dụng các hàm API mặc định từ lõi WP.
Nếu bạn muốn biết nếu bạn hiện đang ở trong Công việc Cron, thì bạn có thể kiểm tra defined( 'DOING_CRON' ) AND DOING_CRON
.
Tôi không nghiên cứu về phát triển (Tôi chỉ là một người đam mê) nhưng tôi nghĩ bạn có thể thêm add_action vào sự kiện
Nó chỉ là một bản lý lịch ...
//to the event
if(your_condition)
{
add_action('original_event_to_hook', 'your_scheduled');
}
function your_scheduled()
{
//create a param here
//And shedule your function with arg
wp_schedule_event(time(), 'hourly', 'your_function', array('param_1' => value));
}
function your_function($args){
$verification = $args['param_1'];
if($verification)
{
//OK
//Eventually delete this schedule with this specific arg
}
}
Để lấy danh sách cron "your_factor" của bạn, nơi có đối số này
//Get a filtered list of cron hooks
function kw_filter_crons_hooks($hooks = false, $args = false)
{
$crons = get_option('cron');
if (!$crons)
{
$crons[0] = NULL;
}
$filter = array();
$cronlist = array();
$schedule = array();
foreach($crons as $timestamp => $cron)
{
//@param $hooks = string 'schedule'
//@param $args = false
//Return an array of cron task sheduled
$schedule[] = $cron;
if(!$schedule && $hooks == 'schedule' && $args == false)
{
$schedule[0] = NULL;
}
foreach($hooks as $hook)
{
if(isset($cron[$hook]))
{
//@param $hooks = array($hook);
//@param $args = false
//Return an array of cron task sheduled
$cronlist[] = $cron;
if(!$cronlist && is_array($hooks) && $args == false)
{
$cronlist[0] = NULL;
}
if(!empty($args))
{
foreach($cronlist as $key => $value)
{
foreach($value as $k => $v)
{
foreach($v as $x => $y)
{
foreach($args as $arg => $val)
{
if ($y['args'][$arg] == $val)
{
//@param $hooks = array($hook);
//@param $args = array($arg);
//Return an array of cron task specified filtered by arg
$filter[$x] = $y;
if(!$filter && is_array($hooks) && is_array($args))
{
$filter[0] = NULL;
}
}
}
}
}
}
}
}
}
}
if(is_array($hooks) && $args === false && $cronlist)
{
return $cronlist;
}
else if(is_array($hooks) && is_array($args) && $filter)
{
return $filter;
}
else if($hooks === 'schedule' && $args === false && $schedule)
{
return $schedule;
}
else if($hooks === false && $args === false && $crons)
{
return $crons;
}
else
{
return false;
}
}
//Usage
$cron_filtered = kw_filter_crons_hooks(array('your_function'), array('param_1' => value));
var_dump($cron_filtered);