В крупных проектах на WordPress часто возникает необходимость автоматически удалять устаревший или неактуальный контент. Например, для сайтов с новостями, временными акциями или пользовательскими данными важна регулярная очистка базы от старых записей. В этой статье подробно разберём, как настроить автоматическое удаление старых записей с помощью встроенного планировщика задач WP-Cron, а также рассмотрим примеры кода и полезные плагины.
Что такое WP-Cron и зачем он нужен для автоматизации задач
WP-Cron — это система планировщика задач, встроенная в ядро WordPress. Она позволяет запускать функции с заданным интервалом времени, без необходимости настраивать системные cron-задачи на сервере. Это удобно для хостингов с ограниченным доступом к серверным настройкам.
С помощью WP-Cron можно автоматизировать множество рутинных процессов: отправку писем, обновление данных, очистку базы и многое другое. В нашем случае мы используем WP-Cron, чтобы регулярно удалять записи старше определённой даты.
Важно помнить, что WP-Cron запускается при посещении сайта, поэтому если трафик низкий, задачи могут запускаться с задержкой.
Как добавить задачу WP-Cron для удаления старых записей — пример кода
Рассмотрим пример, как добавить кастомную задачу, которая будет ежедневно удалять записи типа post, старше 30 дней.
Для начала добавим хук активации задачи и функцию для удаления:
function wptest_schedule_old_posts_cleanup() {
if (!wp_next_scheduled('wptest_daily_old_posts_cleanup')) {
wp_schedule_event(time(), 'daily', 'wptest_daily_old_posts_cleanup');
}
}
add_action('wp', 'wptest_schedule_old_posts_cleanup');
// Функция удаления старых записей
function wptest_delete_old_posts() {
global $wpdb;
$days = 30; // количество дней
$date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));
$posts = get_posts([
'post_type' => 'post',
'post_status' => 'publish',
'date_query' => [
[
'before' => $date_threshold,
'inclusive' => true,
],
],
'fields' => 'ids',
'posts_per_page' => -1,
]);
if (!empty($posts)) {
foreach ($posts as $post_id) {
wp_delete_post($post_id, true); // true — без перемещения в корзину
}
}
}
add_action('wptest_daily_old_posts_cleanup', 'wptest_delete_old_posts');
В этом коде мы создаём задачу wptest_daily_old_posts_cleanup, которая запускается ежедневно и вызывает функцию удаления старых постов.
Как удалять записи других типов или с определёнными условиями
Если вы хотите удалять записи другого типа (например, кастомный тип event) или с определённым метаполем, измените параметры в get_posts следующим образом:
$posts = get_posts([
'post_type' => 'event',
'post_status' => 'publish',
'meta_query' => [
[
'key' => 'event_status',
'value' => 'expired',
'compare' => '=',
],
],
'date_query' => [
[
'before' => $date_threshold,
'inclusive' => true,
],
],
'fields' => 'ids',
'posts_per_page' => -1,
]);
Так вы можете гибко настраивать условия для очистки.
Плагины для автоматического удаления старого контента в WordPress
Если вы предпочитаете готовые решения, существуют плагины, которые помогут автоматизировать удаление старых записей без написания кода.
- Auto Delete Posts — позволяет настроить удаление постов по возрасту, статусу и типу записи. Есть гибкие фильтры и возможность удалять записи с определёнными метаполями.
- WP Bulk Delete — мощный инструмент для массового удаления постов, страниц, пользовательских типов записей по различным условиям, включая дату, таксономии и метаполя.
- Clearfy Pro — комплексный плагин оптимизации WordPress, в котором предусмотрена функция очистки базы от ненужных данных, включая автоматическое удаление устаревших черновиков и ревизий.
Эти плагины можно найти и установить через репозиторий WordPress или сайт WPSHOP.ru.
Как контролировать и отлаживать WP-Cron задачи
Поскольку WP-Cron зависит от посещений сайта, иногда задачи могут не запускаться вовремя. Чтобы это контролировать и отлаживать, рекомендуются следующие инструменты:
- WP Crontrol — плагин для просмотра, редактирования и запуска задач WP-Cron вручную. Позволяет убедиться, что задача запланирована корректно.
- Логирование — добавьте в функцию удаления запись в лог файл, чтобы отслеживать, когда и сколько записей удаляется:
function wptest_delete_old_posts() {
// ... код удаления ...
error_log('wptest: удалено ' . count($posts) . ' старых записей.');
}
Так вы сможете проверять логи сервера и видеть работу задачи.
Рекомендации по безопасности и производительности
Перед тем как включать автоматическое удаление записей, важно сделать резервную копию базы. Ошибки в коде или неправильные условия могут привести к потере данных.
Для больших сайтов с тысячами записей лучше выполнять удаление порциями, чтобы не перегружать сервер. Например, добавьте лимит в get_posts и вызывайте функцию несколько раз через WP-Cron.
Также избегайте удаления записей, которые могут быть связаны с другими объектами, например, комментариями или медиафайлами, если это критично для сайта.