В крупных проектах на WordPress со временем накапливается много устаревшего контента — старые записи, которые уже не актуальны или не нужны. Ручное удаление таких записей — трудоемкий процесс, особенно если их сотни или тысячи. К счастью, WordPress предоставляет встроенный механизм планировщика задач — WP-Cron, с помощью которого можно автоматизировать удаление старых записей по расписанию.
Что такое WP-Cron и почему он подходит для автоматического удаления записей
WP-Cron — это имитация системного cron в WordPress, которая запускается при каждом заходе на сайт и проверяет, есть ли задачи для выполнения. Она позволяет программно ставить задачи на выполнение в будущем — например, раз в день или раз в час.
В отличие от классического cron из Linux, WP-Cron не запускается по системному расписанию, а зависит от посещаемости сайта. Тем не менее, для большинства сайтов это вполне приемлемый вариант для регулярного обслуживания.
Автоматизация удаления старых записей через WP-Cron позволяет:
- Поддерживать базу данных в чистоте;
- Уменьшать размер базы и повышать производительность;
- Избегать ручной работы и ошибок при удалении;
- Настраивать удаление по разным критериям — дате, категории, статусу и др.
Как создать функцию для удаления старых записей в WordPress
Для начала напишем функцию, которая будет искать записи старше определенного количества дней и удалять их. В примере ниже удаляются записи типа post старше 180 дней.
function wpmonitor_delete_old_posts() {
$days = 180; // Срок хранения записей
$date = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
// Получаем ID записей для удаления
$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);
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true); // true — удаление без перемещения в корзину
}
}
Эта функция получает все опубликованные записи старше 180 дней и удаляет их безвозвратно. При необходимости можно модифицировать post_type (например, для кастомных типов записей), добавить фильтрацию по категориям, меткам и другим параметрам.
Как зарегистрировать и запустить задачу WP-Cron для регулярного удаления
Теперь нужно, чтобы функция запускалась автоматически. Для этого регистрируем новое событие в WP-Cron и связываем его с нашей функцией.
function wpmonitor_schedule_old_posts_deletion() {
if (!wp_next_scheduled('wpmonitor_delete_old_posts_hook')) {
wp_schedule_event(time(), 'daily', 'wpmonitor_delete_old_posts_hook');
}
}
add_action('wp', 'wpmonitor_schedule_old_posts_deletion');
add_action('wpmonitor_delete_old_posts_hook', 'wpmonitor_delete_old_posts');
Объяснение кода:
wp_next_scheduledпроверяет, не запланировано ли уже событие с таким хуком;- Если нет — ставим задачу на ежедневный запуск через
wp_schedule_event; - При срабатывании события вызывается функция
wpmonitor_delete_old_posts.
Этот код можно добавить в файл functions.php вашей темы или в отдельный плагин. Рекомендуется создавать небольшой плагин для таких задач — так проще управлять функционалом.
Как протестировать и отладить автоматическое удаление
Поскольку WP-Cron запускается при заходе пользователя, для отладки можно:
- Вручную вызвать функцию
wpmonitor_delete_old_posts()через консоль WP-CLI или временно добавить вызов вfunctions.php; - Использовать плагин WP Crontrol (https://wordpress.org/plugins/wp-crontrol/) для просмотра и ручного запуска задач WP-Cron;
- Добавить логирование в функцию для записи удаляемых ID в файл или базу данных.
Пример простого логирования:
function wpmonitor_delete_old_posts() {
$days = 180;
$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)),
'fields' => 'ids',
'posts_per_page' => -1,
);
$old_posts = get_posts($args);
$log = '';
foreach ($old_posts as $post_id) {
wp_delete_post($post_id, true);
$log .= "Deleted post ID: $post_id\n";
}
if ($log) {
file_put_contents(__DIR__ . '/wpmonitor_deletion.log', $log, FILE_APPEND);
}
}
Дополнительные варианты и плагины для управления автоматическим удалением
Если хочется более гибкого решения без программирования, можно использовать плагины с похожим функционалом, например:
- Auto Delete Posts — плагин для автоматического удаления записей по разным условиям;
- Trash Empty Cron — регулярная очистка корзины;
- Плагин Clearfy — содержит множество инструментов оптимизации базы, возможно, поможет с автоматизацией удаления мета-данных и устаревших записей.
Однако, написание собственного кода с помощью WP-Cron дает максимальный контроль и позволяет легко адаптировать функционал под свои задачи.
Подводим итоги: что нужно помнить при автоматическом удалении
Автоматизация удаления старых записей с помощью WP-Cron — отличный способ поддерживать базу в порядке и экономить ресурсы без лишних усилий. При реализации стоит учесть:
- Тщательно тестировать функцию удаления, чтобы не потерять важный контент;
- Добавлять логирование удаления для контроля;
- Настраивать правильный интервал и критерии удаления, подходящие под ваш проект;
- Понимать особенности работы WP-Cron и при необходимости настраивать системный cron для надежности.
Такой подход позволит сделать работу сайта более стабильной и эффективной, избавит от рутинных задач и снизит нагрузку на базу данных.