Срок действия поста истекает в черновик по полю пользовательского выбора даты.

Вопрос или проблема

Необходимо установить пост в черновик, когда он достигает даты из поля выбора даты 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. Однако существующий вами код не функционирует должным образом. Давайте взглянем на ваш код и определим, что можно улучшить.

Ошибки в исходном коде

  1. Неправильный метод получения постов с использованием ACF:
    Исходный код использует get_posts без корректного указания мета-запроса. Чтобы получить посты с истекшей датой, необходимо использовать meta_query для фильтрации постов.

  2. Необходимая проверка статуса постов:
    В вашем коде отсутствует проверка на статус поста. Вам нужно убедиться, что вы хотите изменить только те посты, которые в данный момент находятся в статусе ‘опубликовано’ (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',
            ));
        }
    }
}

Объяснение изменений

  1. Использование meta_query:
    В запросе добавлен meta_query, который фильтрует посты по значению поля даты ‘ev_date’. Это позволяет корректно находить все посты, дата которых прошла.

  2. Обновление статуса:
    Вместо wp_insert_post теперь используется wp_update_post, что является правильным подходом для первой версии WordPress и позволяет вам обновлять существующие посты.

  3. Чистота кода:
    Исправленный код выглядит аккуратнее и проще для понимания, что в долгосрочной перспективе упростит его поддержку.

Заключение

Следуя приведенным выше рекомендациям, вы успешно реализуете функционал перевода постов в статус ‘черновик’ на основе установленной даты. Не забывайте тестировать произвели ли изменения в рабочей среде WordPress и проводить обновление кода в соответствии с лучшими практиками программирования.

Если у вас остались вопросы или требуется дополнительная помощь в настройках, не стесняйтесь обращаться за поддержкой.

Оцените материал
Добавить комментарий

Капча загружается...