В WordPress часто возникает задача автоматически удалять устаревший контент, чтобы поддерживать актуальность сайта и не перегружать базу данных. В этой статье подробно рассмотрим, как настроить автоматическое удаление старых записей с помощью встроенного механизма WP-Cron и собственного плагина или функции в теме.
Что такое WP-Cron и как он работает для автоматизации задач в WordPress
WP-Cron — это виртуальный планировщик задач, встроенный в WordPress. Он запускается при посещении сайта и проверяет, есть ли запланированные задачи, которые нужно выполнить. Это не классический cron на сервере, но для большинства сайтов его возможностей достаточно.
С помощью WP-Cron можно запускать любые задачи по расписанию: очистку базы, отправку писем, обновление контента и многое другое. Для удаления старых записей мы создадим свою функцию, которая будет запускаться регулярно и удалять записи старше определённого срока.
Преимущества использования WP-Cron для удаления старого контента
- Не требует настройки серверного cron — всё работает из коробки.
- Гибкость: можно задать интервал выполнения и логику удаления.
- Можно легко интегрировать в темы и плагины.
Однако есть и недостаток — если на сайт долго не заходят, задачи могут не запускаться вовремя. Для решения этой проблемы можно настроить системный cron или использовать сторонние сервисы.
Создание пользовательской функции для удаления старых записей в WordPress
Начнём с написания функции, которая будет удалять записи, старше определённого количества дней. Для примера будем удалять записи типа post, опубликованные более 30 дней назад.
function wpinfo_delete_old_posts() {
$days_old = 30; // количество дней
$date = date('Y-m-d H:i:s', strtotime('-' . $days_old . ' days'));
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => array(
array(
'before' => $date,
),
),
'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 - удаление без перемещения в корзину
}
}
}
Эта функция получает все опубликованные записи старше 30 дней и удаляет их безвозвратно. Разумеется, $days_old можно изменить под свои задачи.
Объяснение ключевых моментов функции
Мы используем date_query для фильтрации записей по дате публикации — это эффективный метод, который работает на уровне запроса к базе данных. Параметр fields => 'ids' позволяет получить только ID записей, что экономит память.
Функция wp_delete_post() с параметром true удаляет запись сразу, минуя корзину — это важно для автоматического удаления без необходимости ручного подтверждения.
Регистрация задачи WP-Cron для регулярного запуска удаления
Теперь нужно прикрепить нашу функцию к расписанию WP-Cron. Для начала зарегистрируем собственное событие при активации темы или плагина.
function wpinfo_schedule_old_posts_deletion() {
if (!wp_next_scheduled('wpinfo_delete_old_posts_hook')) {
wp_schedule_event(time(), 'daily', 'wpinfo_delete_old_posts_hook');
}
}
add_action('wp', 'wpinfo_schedule_old_posts_deletion');
// Привязываем функцию к хук-событию
add_action('wpinfo_delete_old_posts_hook', 'wpinfo_delete_old_posts');
Здесь мы создаём задачу, которая будет запускаться ежедневно и вызывать нашу функцию удаления. Функция wp_next_scheduled() предотвращает дублирование задач.
Как удалить расписание при деактивации темы или плагина
Чтобы не оставлять мусор в системе, удалим расписание при отключении плагина или смене темы.
function wpinfo_unschedule_old_posts_deletion() {
$timestamp = wp_next_scheduled('wpinfo_delete_old_posts_hook');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpinfo_delete_old_posts_hook');
}
}
// Например, для плагина:
register_deactivation_hook(__FILE__, 'wpinfo_unschedule_old_posts_deletion');
Так мы аккуратно удаляем запланированное событие и не загромождаем систему.
Дополнительные советы и рекомендации
Использование плагинов для управления WP-Cron и удалением старого контента
Если хочется более универсального решения без написания кода, можно использовать плагины. Например:
- WP Crontrol — позволяет управлять WP-Cron задачами и создавать свои события через интерфейс.
- Clearfy Pro — многофункциональный плагин для оптимизации и очистки базы, включая удаление старого контента.
Но если нужны именно настройки под себя — лучше использовать собственный код.
Резервное копирование перед автоматическим удалением
Обязательно настройте регулярное резервное копирование базы данных, особенно если удаление происходит автоматически. Можно использовать плагин Backup от WPSHOP или аналоги.
Тестирование и отладка
Перед тем как запускать задачу на живом сайте, протестируйте функцию на тестовом окружении. Для отладки можно временно изменить интервал запуска на более частый и добавить логирование:
function wpinfo_delete_old_posts() {
// ... код удаления ...
error_log('WPInfo: Удалено ' . count($old_posts) . ' старых записей');
}
Это поможет убедиться, что всё работает корректно.