В WordPress по умолчанию сохраняется множество версий постов (ревизий), которые позволяют восстановить предыдущие состояния записи. Несмотря на это, большое количество ревизий может значительно разрастись в базе данных, замедляя работу сайта и увеличивая её размер. В этой статье мы подробно рассмотрим, как удалить уже накопленные версии постов и как ограничить или отключить их создание в будущем с помощью кода и плагинов.
Что такое версии постов (ревизии) и зачем их удалять
Ревизии — это автоматические или ручные сохранённые изменения постов и страниц. Они помогают откатиться к предыдущей версии при ошибках. Однако на крупных сайтах и при частом редактировании количество ревизий может исчисляться тысячами, что нагружает базу данных.
Удаление старых ревизий помогает:
- Сократить размер базы данных.
- Ускорить выполнение запросов к wp_posts и wp_postmeta.
- Облегчить бэкап и восстановление сайта.
При этом важно помнить, что полное отключение ревизий может снизить безопасность редактирования, поэтому рекомендуем ограничивать их количество, а не полностью отключать.
Как удалить уже существующие ревизии с помощью SQL-запроса
Для удаления старых ревизий можно использовать прямой SQL-запрос к базе данных через phpMyAdmin или любой другой инструмент управления базой. Вот простой пример запроса, который удалит все ревизии:
DELETE FROM wp_posts WHERE post_type = 'revision';Если таблица имеет префикс отличный от wp_, замените его в запросе. Этот запрос мгновенно удалит все версии постов. Однако он не тронет связанные метаданные, которые могут храниться в таблице wp_postmeta. Чтобы удалить и их, выполните следующий запрос:
DELETE pm FROM wp_postmeta pm LEFT JOIN wp_posts wp ON pm.post_id = wp.ID WHERE wp.ID IS NULL;Этот запрос удалит все метаданные, не связанные с существующими постами, включая метаданные ревизий, которые были удалены.
Удаление ревизий через WP-CLI
Если у вас есть доступ к командной строке сервера и установлен WP-CLI, удалить ревизии можно быстро и безопасно командой:
wp post delete $(wp post list --post_type='revision' --format=ids) --forceЭта команда сначала получает список всех ревизий по ID, а затем удаляет их. Преимущество WP-CLI — безопасное удаление с учётом всех связанных данных и кэширования.
Как ограничить количество сохраняемых ревизий в WordPress
Для ограничения сохранённых ревизий используйте константу WP_POST_REVISIONS в файле wp-config.php. Добавьте или измените строку:
define('WP_POST_REVISIONS', 5);Здесь число 5 означает, что будет сохраняться максимум 5 последних ревизий для каждого поста. Можно указать любое другое число, например, 3 или 10. Для полного отключения ревизий установите значение в false:
define('WP_POST_REVISIONS', false);Но рекомендуется не отключать ревизии полностью, чтобы не потерять возможность отката.
Программное удаление ревизий с помощью кода в functions.php
Если нужно периодически очищать ревизии, можно добавить в functions.php темы или в плагин следующий код для их удаления.
function wpcourse_delete_post_revisions() {
global $wpdb;
$wpdb->query("DELETE FROM {$wpdb->posts} WHERE post_type = 'revision'");
}
// Запускать функцию вручную или через cron
// add_action('init', 'wpcourse_delete_post_revisions');Обратите внимание, что такой код удалит все ревизии при каждом запуске, что может быть слишком агрессивно. Лучше использовать крон-задачу на сервере для периодической очистки.
Плагины для управления ревизиями и оптимизации базы данных
Если вы предпочитаете готовые решения, обратите внимание на следующие плагины:
- WP-Optimize — популярный плагин для очистки базы данных, в том числе удаления ревизий, с удобным интерфейсом.
- Revision Control — позволяет ограничивать количество ревизий для каждого типа записи.
- Advanced Database Cleaner — расширенные возможности по очистке базы данных и удалению ревизий.
Все эти плагины можно найти на официальном репозитории WordPress или на wpshop.ru с UTM-метками.
Как автоматизировать очистку ревизий с помощью WP-Cron
Чтобы регулярно удалять устаревшие ревизии, можно настроить WP-Cron. Вот пример кода для functions.php:
function wpcourse_schedule_revision_cleanup() {
if (!wp_next_scheduled('wpcourse_revision_cleanup_hook')) {
wp_schedule_event(time(), 'daily', 'wpcourse_revision_cleanup_hook');
}
}
add_action('wp', 'wpcourse_schedule_revision_cleanup');
function wpcourse_revision_cleanup_callback() {
global $wpdb;
$wpdb->query("DELETE FROM {$wpdb->posts} WHERE post_type = 'revision'");
}
add_action('wpcourse_revision_cleanup_hook', 'wpcourse_revision_cleanup_callback');Этот код запустит удаление ревизий ежедневно. Вы можете изменить периодичность на 'weekly' или 'hourly' по необходимости.
Важные рекомендации и предостережения
Перед удалением ревизий обязательно сделайте резервную копию базы данных. Ревизии — важный инструмент восстановления, и их удаление необратимо.
Ограничение ревизий или их отключение подходит не для всех проектов. Если вы часто редактируете контент и хотите иметь историю изменений — ограничьте количество, но не отключайте полностью.
Регулярная оптимизация базы данных с удалением ревизий — хороший способ поддерживать скорость и стабильность WordPress-сайта.