Вопрос или проблема
Необходимо установить пост в черновик, когда он достигает даты из поля выбора даты ACF. Вот код, который я использую:
// истечение постов предложения по полю даты.
if (!wp_next_scheduled('expire_posts')){
wp_schedule_event(time(), 'twicedaily', 'expire_posts'); // это может быть каждый час, дважды в день или ежедневно
}
add_action('expire_posts', 'expire_posts_function');
function expire_posts_function() {
$today = date('Ymd');
$args = array(
'post_type' => array('event'), // типы постов, которые вы хотите проверить
'posts_per_page' => -1
);
$posts = get_posts($args);
foreach($posts as $p){
$expiredate = get_field('ev_date', $p->ID, false, false); // получить необработанную дату из базы данных
if ($expiredate) {
if($expiredate < $today){
$postdata = array(
'ID' => $p->ID,
'post_status' => 'draft'
);
wp_update_post($postdata);
}
}
}
}
Это не работает. Что я делаю не так? Это мои настройки поля:
И источник:
форум ACF
ACF сохраняет значение в формате Ymd
в базе данных независимо от формата отображения и возврата. Все, что вам нужно, это мета-запрос, чтобы получить правильные посты.
function expire_posts_function() {
//Получить истекшие посты только
$expired_posts = get_posts(arrasy(
'post_type' => 'event',
'posts_per_page' => -1,
'post_status' => 'publish',
'meta_query' => array(
array(
'key' => 'ev_date',
'value' => date('Ymd'),
'compare' => '<',
),
),
));
//Перебрать посты и установить статус
if ( $expired_posts ) {
foreach( $expired_posts as $expired_post ) {
wp_insert_post(array(
'ID' => $expired_post->ID,
'post_status' => 'draft',
));
}
}
}
Ответ или решение
Установка статуса поста на ‘черновик’ при помощи поля выбора даты ACF
В данной статье мы разберем, как корректно изменить статус поста на ‘черновик’ (draft), когда наступает дата, заданная в поле выбора даты плагина Advanced Custom Fields (ACF). Вы уже сделали шаги по настройке этого процесса, однако вам не удалось добиться ожидаемого результата. В этой статье будут рассмотрены распространенные ошибки, а также даны рекомендации по их исправлению.
Описание проблемы
У вас есть функция, которая должна проверять посты типа ‘event’ и переводить их в статус ‘черновик’, если текущая дата превышает дату, установленную в пользовательском поле ACF. Однако существующий вами код не функционирует должным образом. Давайте взглянем на ваш код и определим, что можно улучшить.
Ошибки в исходном коде
-
Неправильный метод получения постов с использованием ACF:
Исходный код используетget_posts
без корректного указания мета-запроса. Чтобы получить посты с истекшей датой, необходимо использоватьmeta_query
для фильтрации постов. -
Необходимая проверка статуса постов:
В вашем коде отсутствует проверка на статус поста. Вам нужно убедиться, что вы хотите изменить только те посты, которые в данный момент находятся в статусе ‘опубликовано’ (publish).
Исправленный код
Ниже представлена исправленная версия функции, которая будет работать согласно вашим требованиям:
// Создание события для проверки и обновления статуса постов
if (!wp_next_scheduled('expire_posts')) {
wp_schedule_event(time(), 'twicedaily', 'expire_posts');
}
add_action('expire_posts', 'expire_posts_function');
function expire_posts_function() {
// Получение постов с истекшей датой
$expired_posts = get_posts(array(
'post_type' => 'event',
'posts_per_page' => -1,
'post_status' => 'publish',
'meta_query' => array(
array(
'key' => 'ev_date',
'value' => date('Ymd'),
'compare' => '<',
),
),
));
// Перебор постов и изменение их статуса
if ($expired_posts) {
foreach ($expired_posts as $expired_post) {
wp_update_post(array(
'ID' => $expired_post->ID,
'post_status' => 'draft',
));
}
}
}
Объяснение изменений
-
Использование
meta_query
:
В запросе добавленmeta_query
, который фильтрует посты по значению поля даты ‘ev_date’. Это позволяет корректно находить все посты, дата которых прошла. -
Обновление статуса:
Вместоwp_insert_post
теперь используетсяwp_update_post
, что является правильным подходом для первой версии WordPress и позволяет вам обновлять существующие посты. -
Чистота кода:
Исправленный код выглядит аккуратнее и проще для понимания, что в долгосрочной перспективе упростит его поддержку.
Заключение
Следуя приведенным выше рекомендациям, вы успешно реализуете функционал перевода постов в статус ‘черновик’ на основе установленной даты. Не забывайте тестировать произвели ли изменения в рабочей среде WordPress и проводить обновление кода в соответствии с лучшими практиками программирования.
Если у вас остались вопросы или требуется дополнительная помощь в настройках, не стесняйтесь обращаться за поддержкой.