Установите срок действия поста и удалите пост по истечении срока.

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

Я пытаюсь создать функцию, которая позволит мне удалить статью, когда дата дня равна или больше даты, указанной в пользовательском поле ACF.

Я написал функцию ниже, которую поместил в свой single.php, чтобы протестировать ее. Она работает, за исключением того, что необходимо читать статью, чтобы эта функция сработала (на самом деле довольно логично).

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

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

Вот функция:

/**
 * Черновик после истечения срока
 */

function draft_the_post(){
    $expire_date = get_field( "field_5cef86384e5f2" );
    $actual_date = date("d-m-Y");
    $postid = $post->ID;

    if ($expire_date <= $actual_date) {
        wp_update_post(array(
            'ID'    =>  $postid,
            'post_status'   =>  'draft'
        ));
    } else {
        echo "Дата не совпадает или меньше сегодняшней";
    };
}

О, и извините за мой английский, я француз 🙂

Заранее спасибо,
willwoody.

Правильный способ — использовать WordPress Cron и запланировать ваше событие. Также следует рассмотреть возможность добавления реальной задачи cron, как указано здесь для большей точности.

1.) Я изменил вашу функцию draft_the_post, чтобы она поддерживала параметр. Теперь мы можем указать, какая статья, и я также обновил часть, которая проверяет время.

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

3.) dg_delete_posts_handler — это то место, где обрабатывается удаление. Оно проходит через все статьи и вызывает функцию maybe_draft_the_post для каждой. Примечание: это запрашивает все статьи, поэтому в зависимости от того, насколько велика ваша база данных, это может вызвать проблемы с производительностью. Я предлагаю реализовать некий тип очереди, но это должно быть хорошей отправной точкой.

/**
 * Функция, которая будет черновиком конкретной статьи при определенных условиях
 *
 * @param \WP_Post $_post
 */
function maybe_draft_the_post( $_post ) {
    $expire_date = get_field( "your_field_name" );
    // Выход, если дата истечения не установлена.
    if ( ! $expire_date ) {
        return;
    }
    $expire_date = strtotime( $expire_date );
    $actual_date = time();
    if ( $expire_date <= $actual_date ) {
        wp_update_post( array(
            'ID'          => $_post->ID,
            'post_status' => 'draft'
        ) );
    }
}

/**
 * Регистрация события cron в действии инициализации
 */
function dg_cron_schedule_delete_posts() {
    $timestamp = wp_next_scheduled( 'dg_delete_posts' );
    if ( $timestamp == false ) {
        wp_schedule_event( time(), 'hourly', 'dg_delete_posts' );
    }
}
add_action( 'init', 'dg_cron_schedule_delete_posts' );

/**
 * Обработка удаления статей периодически.
 * - Проходить через статьи и вызывать функцию draft_the_post.
 */
function dg_delete_posts_handler() {
    $posts = get_posts( array(
        'posts_per_page' => - 1,
        'post_type'      => 'post',
        'post_status'    => 'publish',
    ) );
    foreach ( $posts as $_post ) {
        maybe_draft_the_post( $_post );
    }
}
add_action( 'dg_delete_posts', 'dg_delete_posts_handler' );

Добавьте следующий код в ваш файл functions.php темы

Проверяет, имеет ли статья дату истечения, и если да, то планирует событие для удаления статьи после указанной даты истечения.

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

// Запланировать событие при публикации или обновлении статьи
function schedule_post_expiration_event($ID, $post) {
    $expiration_date = get_post_meta($ID, 'expiration_date', true);

    // Проверка, имеет ли статья дату истечения
    if ($expiration_date) {
        // Конвертировать дату истечения в метку времени
        $timestamp = strtotime($expiration_date);

        // Запланировать событие для удаления статьи после даты истечения
        wp_schedule_single_event($timestamp, 'delete_expired_post_event', array($ID));
    }
}

add_action('publish_post', 'schedule_post_expiration_event', 10, 2);
add_action('save_post', 'schedule_post_expiration_event', 10, 2);

// Удалить статью, когда запланированное событие сработает
function delete_expired_post($post_id) {
    wp_delete_post($post_id, true);
}

add_action('delete_expired_post_event', 'delete_expired_post');

Ответ или решение

Установка срока действия поста и удаление поста по истечении срока

Вопрос о том, как автоматизировать процесс удаления постов на WordPress по истечении установленного срока, является актуальным для многих разработчиков и владельцев сайтов. В данной статье мы рассматриваем методы, позволяющие добиться желаемого результата, используя WordPress Cron и встроенные функциональные возможности системы.

Шаг 1: Определение и добавление поля с датой истечения

Первым шагом является создание пользовательского поля, где будет храниться дата истечения поста. Вы можете использовать плагин Advanced Custom Fields (ACF) для этого. Для примера, используем поле с именем expiration_date.

Шаг 2: Настройка функции для разметки постов

Создадим функцию, которая будет проверять статус и дату истечения постов. Пример кода, который вы можете добавить в файл functions.php вашей темы:

/**
 * Функция для проверки и изменения статуса поста
 *
 * @param \WP_Post $_post
 */
function maybe_draft_the_post($_post) {
    $expiration_date = get_post_meta($_post->ID, 'expiration_date', true); // Получаем дату истечения
    if (!$expiration_date) {
        return; // Если дата отсутствует, выходим из функции
    }
    $expiration_timestamp = strtotime($expiration_date);
    $current_timestamp = time();

    if ($expiration_timestamp <= $current_timestamp) {
        // Изменяем статус поста на 'draft', если истек срок
        wp_update_post(array(
            'ID' => $_post->ID,
            'post_status' => 'draft'
        ));
    }
}

Шаг 3: Регистрация Крон-задачи

Теперь создадим расписание для работы вышеуказанной функции. Это можно сделать с помощью функции, которая будет запускаться регулярно (например, раз в час):

/**
 * Регистрация Крон-задачи
 */
function dg_cron_schedule_delete_posts() {
    if (!wp_next_scheduled('dg_delete_posts')) {
        wp_schedule_event(time(), 'hourly', 'dg_delete_posts'); // Устанавливаем расписание
    }
}
add_action('init', 'dg_cron_schedule_delete_posts');

/**
 * Обработка удаления постов
 */
function dg_delete_posts_handler() {
    $posts = get_posts(array(
        'posts_per_page' => -1,
        'post_type' => 'post',
        'post_status' => 'publish'
    ));
    foreach ($posts as $_post) {
        maybe_draft_the_post($_post);
    }
}
add_action('dg_delete_posts', 'dg_delete_posts_handler');

Шаг 4: Оптимизация для производительности

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

Шаг 5: Тестирование и отладка

Не забудьте протестировать ваше решение в безопасной среде перед развертыванием на живом сайте. Проверьте, что посты действительно переходят в статус draft после истечения срока действия и что механизм Крон работает корректно.

Заключение

Использование WordPress Cron в сочетании с пользовательскими полями дает гибкость для управления сроками действия постов. Следуйте приведенным шагам, и вы сможете реализовать автоматическое обновление статуса ваших постов без необходимости вмешательства. Это улучшит управление контентом на вашем сайте и повысит эффективность работы административной панели.

Эти рекомендации помогли вам разобраться, как можно автоматизировать процесс удаления устаревшего контента. Продолжайте изучение возможностей WordPress и развивайте свои навыки!

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

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