Зачем нужно автоматическое удаление старых записей в WordPress
Со временем в базе данных WordPress накапливается множество устаревших записей — это могут быть старые посты, черновики, ревизии или записи пользовательских типов (custom post types). Если не очищать подобные данные, база разрастается, что негативно влияет на скорость сайта и нагрузку на сервер.
Автоматическое удаление устаревших записей позволяет поддерживать базу в оптимальном состоянии без постоянного ручного вмешательства. Особенно это актуально для сайтов с большим количеством контента или тех, где старые записи теряют актуальность, например, на сайтах с акциями, новостями или событиями.
В этой статье мы рассмотрим, как создать собственный механизм удаления старых записей через код, используя Action Scheduler или WP-Cron, а также приведём примеры для разных типов записей.
Основы создания функции удаления старых записей
Главная задача — написать функцию, которая будет искать записи старше определённого срока и удалять их из базы.
Для этого используем WP_Query с параметром date_query и функцию wp_delete_post(). Важно: в отличие от перемещения в корзину, функция с параметром $force_delete = true удалит пост полностью.
Вот пример базовой функции для удаления записей старше 30 дней из стандартного типа post:
function wpmoney_delete_old_posts() {
$args = [
'post_type' => 'post',
'date_query' => [
[
'column' => 'post_date',
'before' => '30 days ago',
],
],
'posts_per_page' => -1,
'fields' => 'ids',
'post_status' => 'any',
];
$query = new WP_Query($args);
if ($query->have_posts()) {
foreach ($query->posts as $post_id) {
wp_delete_post($post_id, true); // принудительное удаление
}
}
}Эта функция удалит все посты старше 30 дней без возможности восстановления из корзины.
Автоматизация удаления через WP-Cron
Чтобы запускать удаление регулярно, используем WP-Cron — встроенный планировщик заданий WordPress.
Добавим планировщик и хук для запуска функции каждое утро:
function wpmoney_schedule_old_post_deletion() {
if (!wp_next_scheduled('wpmoney_delete_old_posts_hook')) {
wp_schedule_event(strtotime('03:00:00'), 'daily', 'wpmoney_delete_old_posts_hook');
}
}
add_action('wp', 'wpmoney_schedule_old_post_deletion');
add_action('wpmoney_delete_old_posts_hook', 'wpmoney_delete_old_posts');Таким образом, функция wpmoney_delete_old_posts() будет вызываться ежедневно в 3 часа ночи.
Важно: WP-Cron запускается при посещении сайта, если трафика нет — задачи не сработают. Для более надёжного запуска можно настроить системный cron на сервере, вызывающий wp-cron.php.
Удаление старых записей пользовательских типов (custom post types)
Если у вас есть кастомные типы записей, например, event или promo, для них можно создать похожие функции с изменением параметра post_type.
Пример удаления записей типа promo старше 60 дней:
function wpmoney_delete_old_promos() {
$args = [
'post_type' => 'promo',
'date_query' => [
[
'column' => 'post_date',
'before' => '60 days ago',
],
],
'posts_per_page' => -1,
'fields' => 'ids',
'post_status' => 'any',
];
$query = new WP_Query($args);
if ($query->have_posts()) {
foreach ($query->posts as $post_id) {
wp_delete_post($post_id, true);
}
}
}
add_action('wpmoney_delete_old_promos_hook', 'wpmoney_delete_old_promos');
// Запускать вместе с основным удалением
add_action('wpmoney_delete_old_posts_hook', 'wpmoney_delete_old_promos');Так вы объедините удаление для нескольких типов записей в одном запуске.
Улучшение производительности при большом объёме данных
Если записей очень много, удалять их все одним запросом неэффективно и может привести к тайм-аутам. Разбейте удаление на чанки, например, по 20 записей за раз.
function wpmoney_delete_old_posts_chunked() {
$args = [
'post_type' => 'post',
'date_query' => [
[
'column' => 'post_date',
'before' => '30 days ago',
],
],
'posts_per_page' => 20,
'fields' => 'ids',
'post_status' => 'any',
];
$query = new WP_Query($args);
if ($query->have_posts()) {
foreach ($query->posts as $post_id) {
wp_delete_post($post_id, true);
}
// Перезапускаем задачу для следующей партии
wp_schedule_single_event(time() + 10, 'wpmoney_delete_old_posts_hook');
}
}Этот приём поможет избежать перегрузки сервера и даст возможность плавно очистить базу со временем.
Использование плагинов для автоматизации удаления
Если вы хотите более гибкое управление без написания кода, можете рассмотреть плагины, например, Clearfy Pro, где есть функции для очистки базы и удаления устаревших данных. Подробнее на wpshop.ru.
Но если нужна кастомизация под свои типы записей и логику — лучше использовать собственный код, который легко адаптировать.
Безопасность и бэкапы перед удалением
Перед внедрением автоматического удаления настоятельно рекомендуем делать резервные копии базы. Ошибки в коде или неправильные условия удаления могут привести к потере важных данных.
Для этого можно использовать стандартные плагины резервного копирования или написать автоматические бэкапы с помощью WP-Cron, например, используя плагин Expert Review для контроля состояния сайта.
Также в коде можно добавить логи выполнения и уведомления администратора по email, чтобы отслеживать процесс удаления.