В крупных или активно развиваемых WordPress-сайтах часто возникает задача регулярного удаления устаревшего контента — старых постов, ревизий, черновиков или кастомных записей. Это помогает поддерживать базу данных в порядке, улучшать производительность и экономить место на сервере. В этой статье мы подробно разберем, как настроить автоматическое удаление старых записей с помощью WP-Cron, а также приведем практические примеры кода с объяснениями.
Что такое WP-Cron и почему использовать его для удаления записей
WP-Cron — это встроенная в WordPress система планировщика задач, которая имитирует работу системного cron, но запускается при посещении сайта. Это удобный инструмент для автоматизации рутинных задач без доступа к серверному cron.
Удалять записи вручную через админку — долго и неудобно, особенно если их много. Автоматизация позволяет настроить регулярный запуск кода, который будет удалять записи старше заданного срока.
Однако, WP-Cron имеет свои ограничения: задачи запускаются только при посещении сайта, поэтому на сайтах с низкой посещаемостью задача может сработать с задержкой. Если нужна точность, лучше настроить системный cron на сервере и вызывать WP-Cron вручную.
Как настроить автоматическое удаление старых записей в WordPress
Создаем функцию удаления старых записей
Для начала напишем функцию, которая будет искать и удалять записи старше определенного количества дней. В этом примере удалим посты стандартного типа 'post', опубликованные более 30 дней назад.
function wproot_delete_old_posts() {
$days = 30; // количество дней
$date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => array(
array(
'before' => $date,
'inclusive' => true,
),
),
'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 — для безвозвратного удаления
}
}
}Эта функция извлекает ID постов, опубликованных более 30 дней назад, и удаляет их без возможности восстановления (обход корзины).
Регистрируем Cron-задачу для регулярного запуска
Теперь нужно создать задачу, которая будет запускаться, например, ежедневно. Для этого добавим событие в WordPress Cron и привяжем к нему нашу функцию.
function wproot_schedule_delete_old_posts() {
if (!wp_next_scheduled('wproot_daily_delete_old_posts')) {
wp_schedule_event(time(), 'daily', 'wproot_daily_delete_old_posts');
}
}
add_action('wp', 'wproot_schedule_delete_old_posts');
add_action('wproot_daily_delete_old_posts', 'wproot_delete_old_posts');Здесь мы проверяем, запланировано ли уже событие 'wproot_daily_delete_old_posts'. Если нет — создаем ежедневный запуск. Затем привязываем этот хук к функции удаления.
Отмена Cron-задачи
Если нужно отменить задачу, используйте следующий код:
function wproot_unschedule_delete_old_posts() {
$timestamp = wp_next_scheduled('wproot_daily_delete_old_posts');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wproot_daily_delete_old_posts');
}
}Удаление кастомных типов записей и дополнительные фильтры
Если у вас есть кастомные типы записей, например 'product' или 'event', и их тоже нужно удалять по возрасту, просто замените параметр 'post_type' в функции на нужный тип.
Например, удалим кастомные записи 'event' старше 60 дней:
function wproot_delete_old_events() {
$days = 60;
$date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$args = array(
'post_type' => 'event',
'post_status' => 'publish',
'date_query' => array(
array('before' => $date, 'inclusive' => true),
),
'fields' => 'ids',
'posts_per_page' => -1,
);
$old_events = get_posts($args);
foreach ($old_events as $post_id) {
wp_delete_post($post_id, true);
}
}Для запуска этой функции через WP-Cron достаточно добавить аналогичное расписание, как в предыдущем примере.
Можно добавить дополнительные фильтры, например, удалять только записи с определенной категорией или меткой, используя параметры 'category_name' или 'tax_query' в WP_Query.
Полезные плагины для управления WP-Cron и удалением записей
Если вы не хотите писать код самостоятельно, можно использовать плагины, которые помогут управлять Cron-задачами и фильтровать контент для удаления:
- WP Crontrol — позволяет просматривать, редактировать и создавать Cron-задачи через админку.
- Clearfy Pro — расширенный инструмент для оптимизации и очистки WordPress, включая управление ревизиями и устаревшими записями.
Эти решения помогут визуально контролировать Cron-задачи и автоматизировать очистку без глубоких знаний кода.
Рекомендации по безопасности и производительности
При автоматическом удалении записей всегда делайте резервные копии базы данных, чтобы избежать потери важных данных.
Для сайтов с большой базой данных и большим количеством записей рекомендуем использовать постраничный подход к удалению — удалять записи партиями по 50-100 штук, чтобы не перегружать сервер.
function wproot_delete_old_posts_batch() {
$days = 30;
$date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => array(
array('before' => $date, 'inclusive' => true),
),
'fields' => 'ids',
'posts_per_page' => 50,
);
$old_posts = get_posts($args);
if (empty($old_posts)) {
return;
}
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true);
}
}Вызов такой функции из Cron позволяет постепенно очищать базу без резких нагрузок.