Работа WP Cron каждые 1 и 15 числа месяца
Пытаясь настроить пользовательские расписания для WP Cron, зная, что они используют интервал, возможно ли вообще настроить задание cron для каждого первого числа месяца? Как и каждый пятнадцатый. Это то, что у меня есть до сих пор:
private function cron_schedules( $schedules ) {
$midnight = strtotime( "midnight", current_time( 'timestamp' ) );
$first = strtotime( 'first day of this month', $midnight );
$fifteenth = $first + (7 * 24 * 60 * 60) * 2;
$schedules['1st'] = array(
'interval' => $first,
'display' => __('1st of every month'),
);
$schedules['15th'] = array(
'interval' => $fifteenth,
'display' => __('15th of every month'),
);
$schedules['weekly'] = array(
'interval' => ( 7 * 24 * 60 * 60 ),
'display' => __('Weekly'),
);
$schedules['biweekly'] = array(
'interval' => ( 7 * 24 * 60 * 60 ) * 2,
'display' => __('Biweekly'),
);
return $schedules;
}
2 answers
wp_cron
работает с интервалами, и нет интервала, который приходился бы точно на первый день и 15-е число каждого месяца.
Вы можете запускать свою работу wp-cron
каждый день и проверять дату, аналогично этому, но с простым обратным вызовом, например:
cron_callback_wpse_113675() {
$date = date('d');
if ('01' == $date || '15' == $date) {
// run your function
}
}
Или используйте wp_schedule_single_event
с более сложным обратным вызовом. Что-то вроде этого:
function cron_callback_v2_wpse_113675() {
$date = date('d');
if (!wp_next_scheduled(cron_callback_v2_wpse_113675)) {
$date = ($date < 15) ? '15' : '01';
}
if ('01' == $date || '15' == $date) {
// run your function
switch ($date) {
case '01' :
wp_schedule_single_event( strtotime('+14 days',strtotime('first day of')), 'cron_callback_v2_wpse_113675' );
break;
case '15' :
wp_schedule_single_event( strtotime('first day of'), 'cron_callback_v2_wpse_113675' );
break;
}
}
}
Едва Полностью непроверенный. Возможно, глючит. Предостережение. Никаких возвратов.
Я столкнулся с аналогичной проблемой, но мне нужно было запустить событие в последний день месяца. Я нашел альтернативное решение, которое сработало бы для этой и моей проблемы. Вместо изменения расписаний я использовал ежедневное расписание, чтобы при необходимости просто запускать свои ежемесячные действия.
Сначала я добавил такой код в активацию плагина, чтобы настроить ежедневную проверку
function my_activation(){
// Set the cron job for the monthly cron
if( ! wp_next_scheduled ( 'maybe_monthly_cron' ) ) {
// This will trigger an action that will fire the "monthly_cron" action on the last day of each month at 4:00 am UTC
wp_schedule_event( strtotime('04:00:00'), 'daily', 'maybe_monthly_cron');
}
}
register_activation_hook( __FILE__, 'my_activation' );
Затем я добавил задание для ежедневного запуска, чтобы узнать, нужно ли запускать ежемесячный cron
// Check if we need to fire the monthly cron action "monthly_cron"
function maybe_run_monthly_cron(){
$now = strtotime();
$this_day = date( 'j', $now );
$days_this_month = date( 't', $now );
if( $this_day == $days_this_month ){
do_action( 'monthly_cron' );
}
}
add_action( 'maybe_monthly_cron', 'maybe_run_monthly_cron' );
Для настройки это сработает 1-го и 15-го числа, вы можете просто настроить приведенный выше код примерно так:
// Check if we need to fire the monthly cron action "monthly_cron"
function maybe_run_monthly_cron(){
$now = strtotime();
$this_day = date( 'j', $now );
if( in_array( $this_day, array( 1, 15 ) ) ){
do_action( 'monthly_cron' );
}
}
add_action( 'maybe_monthly_cron', 'maybe_run_monthly_cron' );
Затем вы можете просто использовать действие "monthly_cron", чтобы выполнить свои действия следующим образом:
function my_monthly_cron(){
// Execute monthly or bimonthly code here...
}
add_action( 'monthly_cron', 'my_monthly_cron' );