В крупных или активно обновляемых сайтах на WordPress часто накапливаются устаревшие записи, ревизии, автосохранения и временные данные (транзиенты), которые занимают место в базе данных и могут замедлять работу сайта. В этой статье мы разберём, как настроить автоматическое удаление таких данных с помощью CRON задач в WordPress, что позволит поддерживать базу данных в чистоте и оптимизировать производительность без ручного вмешательства.
Что такое CRON задачи в WordPress и зачем их использовать для очистки базы данных
CRON — это планировщик задач, который позволяет запускать определённые функции по расписанию. WordPress имеет собственный имитационный CRON (wp-cron), который срабатывает при заходе пользователя на сайт и запускает запланированные задачи. Использование CRON помогает автоматизировать рутинные операции, в том числе и очистку базы данных от ненужных данных.
Регулярное удаление старых ревизий, автосохранений и транзиентов помогает:
- Снизить размер базы данных;
- Ускорить работу запросов к базе;
- Избежать возможных ошибок из-за переполнения данных;
- Поддерживать порядок и удобство администрирования.
Для автоматизации можно использовать как плагины, так и собственные функции с привязкой к CRON.
Основные типы данных для автоматического удаления
Перед тем, как писать код, важно понимать, какие именно данные мы хотим удалять:
- Ревизии записей — сохраняют предыдущие версии постов. Полезны, но их может быть очень много.
- Автосохранения — временные сохранения, которые остаются в базе после завершения редактирования.
- Транзиенты — временные кэшированные данные с ограниченным сроком хранения, иногда не удаляются корректно.
- Старые черновики — записи со статусом draft, не обновляемые долгое время.
- Комментарии со статусом spam или trash — мусор, который лучше удалять периодически.
На практике автоматизируют очистку этих данных, чтобы база не раздувалась.
Пример функции для удаления ревизий и автосохранений (wptricks_delete_old_revisions)
Создадим функцию, которая удалит все ревизии и автосохранения старше 30 дней.
function wptricks_delete_old_revisions() {
global $wpdb;
$days = 30;
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
// Удаляем ревизии
$wpdb->query(
$wpdb->prepare(
"DELETE FROM {$wpdb->posts} WHERE post_type = 'revision' AND post_modified < %s",
$date_threshold
)
);
// Удаляем автосохранения
$wpdb->query(
$wpdb->prepare(
"DELETE FROM {$wpdb->posts} WHERE post_type = 'autosave' AND post_modified < %s",
$date_threshold
)
);
}
Эта функция напрямую удаляет устаревшие ревизии и автосохранения из таблицы wp_posts по дате изменения. Можно запускать её вручную или привязать к CRON.
Как зарегистрировать CRON задачу для автоматической очистки (wptricks_register_cron_event)
Добавим регистрацию еженедельного события для вызова нашей функции.
function wptricks_register_cron_event() {
if (! wp_next_scheduled('wptricks_cron_cleanup_hook')) {
wp_schedule_event(time(), 'weekly', 'wptricks_cron_cleanup_hook');
}
}
add_action('wp', 'wptricks_register_cron_event');
add_action('wptricks_cron_cleanup_hook', 'wptricks_delete_old_revisions');
Так CRON задача будет запускаться раз в неделю и очищать ревизии и автосохранения.
Автоматическое удаление транзиентов (wptricks_delete_expired_transients)
Транзиенты иногда остаются в базе и не удаляются вовремя, что нагружает таблицу wp_options. Вот функция для их очистки:
function wptricks_delete_expired_transients() {
global $wpdb;
$time = time();
$transients = $wpdb->get_col(
"SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE '_transient_%'"
);
foreach ($transients as $transient) {
if (preg_match('/_transient_timeout_(.+)/', $transient, $matches)) {
$timeout_option = $transient;
$transient_name = $matches[1];
$timeout = (int) get_option($timeout_option);
if ($timeout && $timeout < $time) {
delete_option($transient_name);
delete_option($timeout_option);
}
}
}
}
Эту функцию также можно привязать к CRON, чтобы регулярно очищать просроченные транзиенты.
Другие полезные автоматизации очистки: удаление старых черновиков и спам-комментариев
Для полной автоматизации рекомендуем также удалять:
- Черновики старше 60 дней — чтобы убрать неактуальные материалы.
- Комментарии в статусах spam и trash старше 30 дней — чтобы не засорять базу.
Пример функции удаления старых черновиков:
function wptricks_delete_old_drafts() {
global $wpdb;
$days = 60;
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$wpdb->query(
$wpdb->prepare(
"DELETE FROM {$wpdb->posts} WHERE post_status = 'draft' AND post_modified < %s",
$date_threshold
)
);
}
Удаление старых спам и мусорных комментариев:
function wptricks_delete_old_spam_comments() {
global $wpdb;
$days = 30;
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
$wpdb->query(
$wpdb->prepare(
"DELETE FROM {$wpdb->comments} WHERE comment_approved IN ('spam', 'trash') AND comment_date < %s",
$date_threshold
)
);
}
Готовое решение: объединение функций в единый CRON-хук
Чтобы не плодить много отдельных задач, можно создать функцию, которая вызывает все очистки сразу:
function wptricks_cron_cleanup_all() {
wptricks_delete_old_revisions();
wptricks_delete_expired_transients();
wptricks_delete_old_drafts();
wptricks_delete_old_spam_comments();
}
add_action('wptricks_cron_cleanup_hook', 'wptricks_cron_cleanup_all');
И зарегистрировать эту задачу, как показано ранее. Таким образом, раз в неделю вы будете автоматически очищать базу от устаревших данных.
Плагины для автоматизации очистки базы данных в WordPress
Если не хотите писать код, можно использовать проверенные плагины, которые автоматизируют очистку базы:
- WP-Optimize — комплексное решение для оптимизации базы с возможностью удаления ревизий и мусорных данных.
- Advanced Database Cleaner — позволяет планировать очистку ревизий, транзиентов, черновиков, спама и мусора.
- Clearfy Pro — плагин с расширенными функциями оптимизации и очистки базы, поддерживает автоматизацию и множество настроек.
Использование плагинов удобно, если вы не хотите заниматься кодом, но для особо тонкой настройки лучше собственные CRON задачи.
Важные советы и предостережения
Перед тем, как запускать автоматическую очистку, обязательно сделайте резервную копию базы данных. Неправильные запросы могут привести к потере нужных данных.
Тестируйте функции на тестовом сайте или локальной копии перед внедрением на живом ресурсе.
Регулярность запуска CRON задач можно настроить под нагрузку сайта, чаще — для очень активных проектов, реже — для менее динамичных.
Если на сайте много пользователей, помните, что wp-cron зависит от посещаемости. Для более точного расписания можно настроить системный CRON на сервере для вызова wp-cron.php.