Диагностика проблемы: зачем и когда удалять старые посты автоматически
В проектах на WordPress часто возникает задача удалить устаревший контент, например, новости старше 1 года или акционные предложения, срок действия которых истёк. Ручное удаление занимает время и может быть забыто. Автоматизация этого процесса с помощью WP-Cron позволяет поддерживать актуальность сайта и снижать нагрузку на базу данных.
Пошаговое решение: настройка WP-Cron для удаления постов по дате
1. Создаём функцию для удаления постов старше заданного срока
В первую очередь нужно написать функцию, которая найдёт посты старше определённого количества дней и удалит их.
function wp3_delete_old_posts() {
$days = 365; // количество дней, старше которых посты удаляются
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$args = [
'date_query' => [
[
'column' => 'post_date',
'before' => $date_threshold,
],
],
'post_type' => 'post',
'post_status' => 'publish',
'fields' => 'ids',
'posts_per_page' => -1,
];
$old_posts = get_posts($args);
if (!empty($old_posts)) {
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true); // true — удаление без перемещения в корзину
}
}
}2. Регистрируем событие WP-Cron
Далее необходимо зарегистрировать событие, которое будет запускать функцию по расписанию. Например, ежедневно.
add_action('wp3_daily_delete_old_posts', 'wp3_delete_old_posts');
if (!wp_next_scheduled('wp3_daily_delete_old_posts')) {
wp_schedule_event(time(), 'daily', 'wp3_daily_delete_old_posts');
}3. Добавляем очистку расписания при деактивации плагина или темы
Чтобы избежать накопления ненужных задач, удалим расписание при деактивации.
function wp3_deactivate_cleanup() {
$timestamp = wp_next_scheduled('wp3_daily_delete_old_posts');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wp3_daily_delete_old_posts');
}
}
register_deactivation_hook(__FILE__, 'wp3_deactivate_cleanup');Проверка результата после внедрения
Для проверки работы решения:
- Вручную вызовите функцию
wp3_delete_old_posts()через консоль WP-CLI или добавьте временный вызов в код, чтобы убедиться, что старые посты удаляются. - Проверьте записи в базе данных — посты старше указанного срока должны отсутствовать.
- Убедитесь, что событие WP-Cron запланировано, выполнив
wp cron event listчерез WP-CLI или установив плагин для мониторинга Cron событий.
Частые ошибки и как их исправить
- WP-Cron не запускается автоматически: По умолчанию WP-Cron запускается при заходе посетителя на сайт. На малопосещаемых ресурсах cron-задачи могут откладываться. Решение — настроить системный cron на сервере для вызова
wp-cron.php. - Удаление не происходит: Проверьте, что функция
wp3_delete_old_posts()подключена и событие действительно запланировано. Включите отладку и посмотрите ошибки PHP. - Удаляются не те посты: Проверьте параметр
$daysи логикуdate_query. Убедитесь, что формат даты корректен. - Накопление запланированных задач: Не забывайте удалять расписание при деактивации, иначе задачи будут повторяться.
Практические советы по безопасности и производительности
- Безопасность: Используйте
wp_delete_post($post_id, true)с осторожностью, так как удаление без перемещения в корзину необратимо. Рекомендуется сначала запускать без удаления (например, только логировать ID), чтобы проверить, какие посты будут удалены. - Производительность: Если у вас большое количество постов, удаляйте их партиями, чтобы не перегружать сервер. Например, добавьте пагинацию в запрос
get_postsсposts_per_pageи запускайте очистку по частям. - Мониторинг: Логируйте результаты работы cron-задачи в файл или через стандартный лог WordPress для отладки и контроля.
Сравнение подходов к автоматическому удалению старого контента
| Метод | Плюсы | Минусы |
|---|---|---|
| WP-Cron + кастомная функция | Гибкость настройки, управление через код, не требует сторонних плагинов | Зависит от посещаемости сайта, требует базовых навыков программирования |
| Плагины очистки контента (например, WP Bulk Delete) | Простой UI, много настроек, подходит новичкам | Дополнительная нагрузка, не всегда возможно тонко настроить логику |
| Внешние скрипты на сервере (cron + wp-cli) | Надёжность, не зависит от посещаемости, можно запускать в любое время | Требует доступа к серверу и знаний Linux, сложнее в настройке |