Планирование сообщений для обновления один раз в день с помощью 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();
}
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 );
}