В некоторых проектах на 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, который содержит модули для оптимизации базы данных и автоматизации удаления устаревших данных.