Планирование сообщений для обновления один раз в день с помощью wp cron


У меня есть функция, которая подключается к save_post, которая изменяет значение пользовательского термина таксономии на основе сегодняшней даты. Это прекрасно работает. Когда я обновляю сообщение, термин таксономии обновляется правильно.

Но я хочу, чтобы это обновление происходило автоматически, один раз в день, без необходимости вручную обновлять сообщения самостоятельно. Я прочитал на wp_cron и создал приведенный ниже код, который в основном представляет собой попытку раз в день запрашивать определенный набор сообщений, а затем просто запускать их через wp_update_post(), который должен вызвать упомянутую выше функцию, которая изменяет значение термина таксономии.

Но, похоже, это не работает. Кроме того, я действительно не знаю, как протестировать wp_cron, просто не дождавшись дня и не посмотрев, что произойдет. У меня установлена консоль, чтобы я мог видеть предстоящие запланированные события, и приведенное ниже событие определенно запланировано, оно просто не оказывает никакого эффекта.

Может ли кто-нибудь дать несколько советов о том, куда я мог бы пойти неправильно?

    //Schedule active events to update_post every day
    if( !wp_next_scheduled( 'event_status_refresh' ) ) {  
       wp_schedule_event( time(), 'daily', 'event_status_refresh' );  
    }  
//When the event fires, we call the function to update the posts
    add_action( 'event_status_refresh', 'update_event_status' ); 

//The function to update the posts
function update_event_status() {
    global $post;

    $active = array( 
    'post_type'=>'event',
    'posts_per_page'=>'-1',
    'tax_query'=>array(
        array(
            'taxonomy'=>'event_status',
            'field'=>'slug',
            'terms'=>array(
                'playing_now',
                'opening_soon'
            )
        )
    ),
);
$query   = new WP_Query($active);
if ($query->have_posts()) {
    while ($query->have_posts()) {
        $query->the_post();

            $update = array(
            'ID' => get_the_ID(),
            );

            // Update the post into the database
            wp_update_post( $update );
    }
}
wp_reset_postdata();

}
Author: Eckstein, 2013-09-03

1 answers

Это типичный пример проблемы X-Y. Твой крон в порядке. Ваша логика не такова.

У вас есть функция, которая подключается к save_posts, и вы думаете, что передача массива $update = array( 'ID' => get_the_ID() ) вызовет действие, и поэтому ваш пост обновит таксономию. К сожалению, это неверно.

Передача этого типа массива (только поля идентификатора) в wp_update_post только идентифицирует запись, в ней нет данных для сохранения в другом месте массива. Таким образом, он ничего не обновит и не вызовет никаких save_post действия.

Итак, ваш cron работает каждый день, но ничего не делает.

Решение:

Функция, которая подключается к save_post, вероятно, принимает post_id в качестве параметра и при необходимости обновляет сообщение, верно. Поэтому вместо того, чтобы запускать wp_update_post и позволять ему обновлять сообщение, вызовите свою функцию самостоятельно.

while ($query->have_posts()) {
  $query->the_post();
  $toupdate = get_the_ID();

  your_function_that_hook_into_save_post( $toupdate );

}
 5
Author: gmazzap, 2017-03-20 10:29:37