В WordPress ревизии постов — это полезный механизм для сохранения истории изменений контента. Однако со временем их может накопиться слишком много, что замедляет работу сайта и увеличивает размер базы данных. В этой статье мы разберём, как автоматизировать удаление старых ревизий с помощью пользовательского кода, без использования тяжёлых плагинов.
Почему важно контролировать количество ревизий в WordPress
Каждый раз, когда вы обновляете запись или страницу, WordPress сохраняет её копию как ревизию. Это удобно для восстановления предыдущих версий, но если ревизий слишком много, база данных разрастается, что негативно влияет на производительность.
Особенно это заметно на сайтах с большим объёмом контента и частыми обновлениями. К тому же, резервное копирование и миграции становятся дольше из-за большого размера таблиц.
Регулярное удаление устаревших ревизий помогает поддерживать базу данных в оптимальном состоянии и снижает нагрузку на сервер.
Как работает механизм ревизий в WordPress
Ревизии хранятся в таблице wp_posts с типом revision. Каждая ревизия связана с оригинальным постом через поле post_parent. При запросах контента WordPress автоматически исключает ревизии, но они всё равно занимают место в базе.
По умолчанию WordPress сохраняет неограниченное количество ревизий, но с версии 3.6 можно ограничить их число через константу WP_POST_REVISIONS. Однако это не удаляет уже накопленные ревизии.
Автоматическое удаление ревизий с помощью пользовательской функции
Для очистки базы от старых ревизий можно написать функцию, которая будет запускаться по расписанию с помощью WP Cron. Ниже пример такого решения.
function wpbox_delete_old_revisions() {
global $wpdb;
// Количество ревизий, которые хотим оставить для каждого поста
$revisions_to_keep = 3;
// Получаем ID постов, у которых есть ревизии
$post_ids = $wpdb->get_col(
"SELECT DISTINCT post_parent FROM {$wpdb->posts} WHERE post_type = 'revision'"
);
foreach ($post_ids as $post_id) {
// Получаем ID ревизий, упорядоченных по дате, начиная с самых старых
$revision_ids = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'revision' AND post_parent = %d ORDER BY post_date DESC",
$post_id
));
// Оставляем последние $revisions_to_keep ревизий
$revisions_to_delete = array_slice($revision_ids, $revisions_to_keep);
if (!empty($revisions_to_delete)) {
foreach ($revisions_to_delete as $revision_id) {
wp_delete_post($revision_id, true);
}
}
}
}
// Планируем задачу раз в сутки
function wpbox_schedule_revision_cleanup() {
if (!wp_next_scheduled('wpbox_revision_cleanup_hook')) {
wp_schedule_event(time(), 'daily', 'wpbox_revision_cleanup_hook');
}
}
add_action('wp', 'wpbox_schedule_revision_cleanup');
add_action('wpbox_revision_cleanup_hook', 'wpbox_delete_old_revisions');
В этом коде мы оставляем по 3 последних ревизии для каждого поста и удаляем остальные. Функция запускается ежедневно через WP Cron.
Как ограничить количество ревизий при сохранении поста
Для предотвращения накопления ревизий можно ограничить их число через файл wp-config.php. Вставьте туда такую строку:
define('WP_POST_REVISIONS', 3);
Это заставит WordPress хранить не более 3 ревизий для каждого поста. Новый код удаления поможет очистить уже накопленные ревизии.
Плагины для управления ревизиями и оптимизацией базы
Если вы предпочитаете готовые решения, обратите внимание на плагины:
- Clearfy Pro — многофункциональный плагин для оптимизации WordPress, включая управление ревизиями.
- WPRemark — плагин с инструментами для очистки базы и удаления ненужных данных.
Использование этих плагинов удобно, если вы не хотите писать код, но они могут быть избыточными для простого удаления ревизий.
Рекомендации по безопасности и тестированию
Перед применением кода на рабочем сайте обязательно сделайте резервную копию базы данных. Также протестируйте функцию на тестовом окружении, чтобы убедиться, что удаляются только ревизии и не затрагиваются другие данные.
Если у вас включено кэширование, очистите кэш после удаления ревизий, чтобы увидеть результат сразу.
Итог
Автоматизация удаления старых ревизий — простой и эффективный способ оптимизировать работу сайта на WordPress. Используя приведённый код, вы контролируете размер базы данных и повышаете производительность без лишних плагинов и сложных настроек.