В больших проектах на WordPress часто возникает необходимость регулярно удалять устаревший контент — например, записи, которые были опубликованы более определённого времени назад. Ручное удаление занимает много времени, а автоматизация этого процесса с помощью WP-Cron позволит полностью автоматизировать задачу и освободить ресурсы сайта.
Что такое WP-Cron и как он работает
WP-Cron — это встроенный механизм планировщика задач в WordPress, который позволяет запускать функции по расписанию. В отличие от системного cron на сервере, WP-Cron срабатывает при посещении сайта, проверяя, не пришло ли время для выполнения запланированных задач.
Для автоматизации удаления старых записей нам нужно создать собственную задачу, которая будет выполняться, например, раз в сутки.
Создание задачи удаления старых записей через WP-Cron
Первое, что нужно сделать — зарегистрировать событие при инициализации WordPress, если оно ещё не создано. Затем написать функцию, которая будет удалять записи старше заданного срока.
Регистрация планировщика задачи
function wpin_register_delete_old_posts_event() {
if (!wp_next_scheduled('wpin_delete_old_posts_hook')) {
wp_schedule_event(time(), 'daily', 'wpin_delete_old_posts_hook');
}
}
add_action('wp', 'wpin_register_delete_old_posts_event');
Здесь мы проверяем, есть ли уже запланированное событие 'wpin_delete_old_posts_hook'. Если нет — создаём новое с интервалом 'daily' (раз в сутки).
Функция удаления старых записей
Теперь создадим функцию, которая будет удалять записи старше 30 дней. В данном примере удаляются записи типа 'post', статус — 'publish'.
function wpin_delete_old_posts() {
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => array(
array(
'column' => 'post_date',
'before' => '30 days ago',
),
),
'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 — без возможности восстановления
}
}
}
add_action('wpin_delete_old_posts_hook', 'wpin_delete_old_posts');
Функция получает ID всех записей старше 30 дней и удаляет их без помещения в корзину.
Расширение функционала: удаление по типам записей и меткам
Если на сайте есть кастомные типы записей, их тоже можно включить в логику удаления. Для этого достаточно изменить параметр post_type в запросе на массив:
'post_type' => array('post', 'custom_type'),
Также можно добавить условия по таксономиям или метаполям — например, удалять только записи с определённой категорией или без определённого метаполя.
Пример удаления старых записей с определённой категорией
$args = array(
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => array(
array('before' => '30 days ago'),
),
'category_name' => 'news',
'fields' => 'ids',
'posts_per_page' => -1,
);
Управление задачей: удаление и запуск вручную
Если нужно удалить задачу из планировщика, используйте функцию:
function wpin_clear_delete_old_posts_event() {
$timestamp = wp_next_scheduled('wpin_delete_old_posts_hook');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpin_delete_old_posts_hook');
}
}
Эта функция отменит запланированное событие. Запускать её стоит, например, при деактивации плагина или темы.
Для ручного запуска удаления можно вызвать функцию напрямую из админки или через WP-CLI:
wp eval 'wpin_delete_old_posts();'
Советы по безопасности и производительности
Удаление большого количества записей может привести к нагрузке на сервер. Чтобы избежать проблем, можно разбивать процесс удаления на партии, например, по 50 записей за раз и запускать несколько событий с интервалом.
Для этого достаточно изменить функцию удаления, добавив параметр posts_per_page и повторный запуск задачи, пока записи не закончатся.
Также стоит учитывать, что WP-Cron зависит от посещаемости сайта. Если трафик низкий, задачи могут запускаться с задержками. В таких случаях рекомендую настроить системный cron для вызова wp-cron.php с нужной периодичностью.
Полезные плагины для управления WP-Cron
Для удобства управления задачами WP-Cron можно использовать плагины, например:
- WP Crontrol — позволяет просматривать, редактировать и удалять задачи WP-Cron из админки.
- Clearfy Pro — плагин для оптимизации WordPress, включающий расширенные возможности для управления WP-Cron.
Итог
Автоматизация удаления старых записей через WP-Cron — эффективный способ поддерживать базу данных WordPress в актуальном состоянии и экономить ресурсы сервера. Подключив простой скрипт с регулярным расписанием, вы избавитесь от необходимости ручной очистки и сможете гибко настраивать условия удаления под свои задачи.