В WordPress по умолчанию сохраняется множество ревизий записей, что со временем может приводить к значительному разрастанию базы данных. Особенно это заметно на сайтах с большим количеством публикаций и частыми изменениями контента. Чтобы избежать избыточного веса базы данных и повысить производительность, полезно периодически удалять старые ревизии записей.
Почему важно удалять старые ревизии записей в WordPress
Ревизии записей — это автоматические сохранения предыдущих версий вашего контента. Они нужны для восстановления при ошибках или откате изменений. Но WordPress по умолчанию не ограничивает количество ревизий, поэтому база данных может сильно разрастись. Это приводит к:
- Увеличению размера базы данных — что сказывается на скорости резервного копирования и общем быстродействии.
- Замедлению запросов к таблице
wp_posts, где хранятся ревизии. - Увеличению нагрузки сервера при бэкапах и оптимизации базы.
Ручное удаление ревизий возможно через SQL-запросы, но это неудобно и рискованно. Гораздо лучше автоматизировать процесс с помощью WP-Cron и собственного PHP кода.
Настройка автоматического удаления ревизий с помощью WP-Cron
WP-Cron — встроенный планировщик задач в WordPress, который выполняет функции по расписанию. Мы создадим функцию, которая будет удалять ревизии старше определённого срока, и зарегистрируем её в WP-Cron.
Для начала добавим в файл functions.php вашей темы или в собственный плагин следующий код:
function wpfix_delete_old_revisions() {
global $wpdb;
// Определяем возраст ревизий в днях для удаления
$days = 30;
$date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));
// Получаем ID ревизий старше пороговой даты
$old_revisions = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'revision' AND post_modified < %s",
$date_threshold
));
if (!empty($old_revisions)) {
foreach ($old_revisions as $revision_id) {
wp_delete_post($revision_id, true); // Полное удаление
}
}
}
// Регистрируем событие, если оно ещё не существует
if (!wp_next_scheduled('wpfix_cron_delete_old_revisions')) {
wp_schedule_event(time(), 'daily', 'wpfix_cron_delete_old_revisions');
}
// Хук для выполнения функции
add_action('wpfix_cron_delete_old_revisions', 'wpfix_delete_old_revisions');
Этот код делает следующее:
- Определяет ревизии старше 30 дней.
- Удаляет их с помощью
wp_delete_postс параметромtrueдля полного удаления из базы. - Регистрирует ежедневное событие WP-Cron для запуска этой функции.
Как проверить и отладить работу WP-Cron
WP-Cron запускается при посещении сайта, поэтому если трафик низкий, задачи могут не выполняться вовремя. Для проверки и управления задачами можно использовать плагин WP Crontrol.
- Установите и активируйте плагин WP Crontrol.
- Перейдите в меню Инструменты > Cron Events.
- Найдите событие
wpfix_cron_delete_old_revisionsи проверьте дату его следующего запуска. - Можно запустить событие вручную для теста.
Если сайт малопосещаемый, для надежности можно настроить системный cron сервера, вызывающий wp-cron.php по расписанию.
Дополнительные советы по управлению ревизиями в WordPress
Ограничение количества ревизий в wp-config.php
Чтобы не накапливать слишком много ревизий, можно ограничить их количество с помощью константы в wp-config.php:
define('WP_POST_REVISIONS', 5); // Хранить не более 5 ревизий для каждой записи
Это уменьшит количество ревизий, создаваемых в будущем, но не удалит уже существующие.
Плагины для управления ревизиями
Если не хотите самостоятельно писать код, можно использовать плагины:
- WP-Sweep — позволяет очищать ревизии, авточерновики, спам-комментарии и оптимизировать базу.
- Optimize Database after Deleting Revisions — автоматизирует удаление ревизий и оптимизацию таблиц.
Однако для тонкой настройки и контроля лучше использовать собственные скрипты.
Резюме
Автоматическое удаление старых ревизий через WP-Cron — это эффективный способ поддерживать базу данных WordPress в оптимальном состоянии. Пишем простую функцию, регистрируем крон-событие, и база данных не будет раздуваться бесконтрольно. Это особенно актуально для сайтов с активным редактированием контента. К тому же, такой подход легко адаптировать под свои нужды — изменить период удаления, добавить логирование и уведомления.