wpcontent.ru wordpress wpcontent.ru

Как автоматически удалить посты из категории в WordPress по расписанию

В некоторых проектах на WordPress возникает задача автоматически удалять записи, которые долгое время находятся в определённой категории. Например, новости старше 30 дней, акции или объявления, которые потеряли актуальность. В этой статье мы подробно разберём, как реализовать автоматическое удаление постов из категории по расписанию с помощью встроенного планировщика задач WP-Cron и кастомного PHP-кода.

Почему важно автоматизировать удаление записей из категории

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

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

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

Настройка WP-Cron для автоматического удаления постов

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

Вот пример функции, удаляющей записи из категории с ID = 5, если они старше 30 дней:

function wpcontent_remove_old_posts_from_category() {
    $category_id = 5; // ID категории, из которой удаляем
    $days_old = 30; // возраст поста в днях

    $args = [
        'category' => $category_id,
        'date_query' => [
            [
                'column' => 'post_date',
                'before' => $days_old . ' days ago',
            ],
        ],
        'post_type' => 'post',
        'post_status' => 'publish',
        'fields' => 'ids',
        'nopaging' => true,
    ];

    $old_posts = get_posts($args);

    if (!empty($old_posts)) {
        foreach ($old_posts as $post_id) {
            wp_delete_post($post_id, true); // true — удаление без перемещения в корзину
        }
    }
}

Теперь нужно зарегистрировать задачу, которая будет запускать эту функцию, например, один раз в день.

Добавляем событие в расписание WP-Cron

Для этого используем хуки wpcontent_activate_cron и wpcontent_deactivate_cron для подключения и отключения задачи при активации/деактивации плагина или темы:

function wpcontent_schedule_cron_event() {
    if (!wp_next_scheduled('wpcontent_daily_post_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wpcontent_daily_post_cleanup');
    }
}
add_action('wp', 'wpcontent_schedule_cron_event');

function wpcontent_cron_deactivation() {
    $timestamp = wp_next_scheduled('wpcontent_daily_post_cleanup');
    if ($timestamp) {
        wp_unschedule_event($timestamp, 'wpcontent_daily_post_cleanup');
    }
}
register_deactivation_hook(__FILE__, 'wpcontent_cron_deactivation');

Обработчик события WP-Cron

Привязываем нашу функцию к событию:

add_action('wpcontent_daily_post_cleanup', 'wpcontent_remove_old_posts_from_category');

Как проверить работу автоматического удаления

Для диагностики можно временно изменить интервал запуска на более частый, например, раз в час, или запускать функцию вручную в админке, добавив кнопку или вызвав функцию через wp shell. Также полезно логировать удалённые посты для контроля:

function wpcontent_remove_old_posts_from_category() {
    $category_id = 5;
    $days_old = 30;

    $args = [
        'category' => $category_id,
        'date_query' => [
            [
                'column' => 'post_date',
                'before' => $days_old . ' days ago',
            ],
        ],
        'post_type' => 'post',
        'post_status' => 'publish',
        'fields' => 'ids',
        'nopaging' => true,
    ];

    $old_posts = get_posts($args);

    if (!empty($old_posts)) {
        foreach ($old_posts as $post_id) {
            wp_delete_post($post_id, true);
            error_log('WPContent: Deleted post ID ' . $post_id);
        }
    }
}

Использование плагина для автоматического удаления по категории

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

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

Как расширить функциональность: удаление по нескольким категориям и типам постов

Чтобы удалять посты из нескольких категорий, достаточно изменить параметр 'category' на 'category__in' => [5, 7, 9]. Для поддержки кастомных типов постов замените 'post_type' => 'post' на нужные типы или массив.

Пример расширенного запроса:

$args = [
    'category__in' => [5, 7],
    'post_type' => ['post', 'custom_type'],
    'date_query' => [
        [
            'column' => 'post_date',
            'before' => '15 days ago',
        ],
    ],
    'post_status' => 'publish',
    'fields' => 'ids',
    'nopaging' => true,
];

Заключение

Автоматическое удаление постов из категории помогает поддерживать сайт в актуальном и оптимизированном состоянии. Использование WP-Cron и кастомных функций — надёжный и гибкий способ решения задачи. При необходимости можно комбинировать код с готовыми плагинами, такими как Post Expirator, для удобства управления.

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

×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее