Работа 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;

}
Author: souporserious, 2013-09-10

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;
    }
  }
}

Едва Полностью непроверенный. Возможно, глючит. Предостережение. Никаких возвратов.

 4
Author: s_ha_dum, 2017-04-13 12:37:34

Я столкнулся с аналогичной проблемой, но мне нужно было запустить событие в последний день месяца. Я нашел альтернативное решение, которое сработало бы для этой и моей проблемы. Вместо изменения расписаний я использовал ежедневное расписание, чтобы при необходимости просто запускать свои ежемесячные действия.

Сначала я добавил такой код в активацию плагина, чтобы настроить ежедневную проверку

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' );
 1
Author: Aaron, 2018-01-09 23:31:21