WordPress автоматически сохраняет версии постов (ревизии), что помогает восстанавливать предыдущие варианты контента. Однако со временем количество ревизий может значительно увеличиться, занимая место в базе данных и замедляя работу сайта. В этой статье расскажем, как программно удалить старые версии постов, сохранив при этом последние, и автоматизировать этот процесс с помощью собственного кода.
Почему важно удалять старые версии постов в WordPress
Каждый раз, когда вы сохраняете пост, WordPress создаёт новую ревизию. Это удобно для отката, но если не контролировать количество ревизий, база данных разрастается, что:
- Увеличивает размер базы данных;
- Замедляет запросы к таблице
wp_posts; - Может влиять на резервное копирование и восстановление;
- Затрудняет управление данными на больших сайтах.
Поэтому периодическая очистка ревизий — хорошая практика оптимизации.
Как удалить старые версии постов вручную через SQL-запрос
Если у вас есть доступ к базе данных (например, через phpMyAdmin), можно удалить все ревизии с помощью SQL:
DELETE FROM wp_posts WHERE post_type = 'revision';Этот запрос удалит все ревизии, что не всегда желательно. Иногда нужно оставить последние 2–3 версии для каждого поста. Для этого потребуется более сложный запрос или программный способ.
Автоматическое удаление старых ревизий с помощью PHP-кода в functions.php
Рассмотрим пример функции, которая удаляет все ревизии, кроме последних двух для каждого поста. Этот подход помогает сохранить резервные копии, но не захламлять базу.
function wpfind_delete_old_revisions() {
global $wpdb;
// Получаем ID постов с ревизиями
$post_ids = $wpdb->get_col("SELECT DISTINCT post_parent FROM {$wpdb->posts} WHERE post_type = 'revision'");
foreach ( $post_ids as $post_id ) {
// Получаем ревизии для поста, сортируем по дате, исключаем 2 последних
$revisions = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'revision' AND post_parent = %d ORDER BY post_date DESC LIMIT 18446744073709551615 OFFSET 2",
$post_id
));
if ( !empty($revisions) ) {
$ids_to_delete = implode(',', array_map('intval', $revisions));
$wpdb->query("DELETE FROM {$wpdb->posts} WHERE ID IN ($ids_to_delete)");
}
}
}
// Хук для запуска очистки по крону или вручную
add_action('wpfind_cleanup_revisions_hook', 'wpfind_delete_old_revisions');Эту функцию можно запускать вручную или по расписанию с помощью WP-Cron. Например, чтобы запускать очистку раз в неделю:
function wpfind_schedule_revision_cleanup() {
if ( !wp_next_scheduled('wpfind_cleanup_revisions_hook') ) {
wp_schedule_event(time(), 'weekly', 'wpfind_cleanup_revisions_hook');
}
}
add_action('wp', 'wpfind_schedule_revision_cleanup');Пример создания плагина для удаления старых ревизий
Если хочется оформить функционал в плагин, то создадим минимальный плагин с админ-панелью, где можно запускать очистку вручную.
<?php
/**
* Plugin Name: WPFind Revision Cleaner
* Description: Удаляет старые ревизии, оставляя последние две.
* Version: 1.0
* Author: WPFind
*/
register_activation_hook(__FILE__, 'wpfind_schedule_revision_cleanup');
register_deactivation_hook(__FILE__, 'wpfind_clear_revision_cleanup_schedule');
function wpfind_delete_old_revisions() {
global $wpdb;
$post_ids = $wpdb->get_col("SELECT DISTINCT post_parent FROM {$wpdb->posts} WHERE post_type = 'revision'");
foreach ($post_ids as $post_id) {
$revisions = $wpdb->get_col($wpdb->prepare(
"SELECT ID FROM {$wpdb->posts} WHERE post_type = 'revision' AND post_parent = %d ORDER BY post_date DESC LIMIT 18446744073709551615 OFFSET 2",
$post_id
));
if (!empty($revisions)) {
$ids_to_delete = implode(',', array_map('intval', $revisions));
$wpdb->query("DELETE FROM {$wpdb->posts} WHERE ID IN ($ids_to_delete)");
}
}
}
function wpfind_schedule_revision_cleanup() {
if (!wp_next_scheduled('wpfind_cleanup_revisions_hook')) {
wp_schedule_event(time(), 'weekly', 'wpfind_cleanup_revisions_hook');
}
}
function wpfind_clear_revision_cleanup_schedule() {
$timestamp = wp_next_scheduled('wpfind_cleanup_revisions_hook');
if ($timestamp) {
wp_unschedule_event($timestamp, 'wpfind_cleanup_revisions_hook');
}
}
add_action('wpfind_cleanup_revisions_hook', 'wpfind_delete_old_revisions');
// Добавляем страницу настроек в админку
add_action('admin_menu', function() {
add_submenu_page('tools.php', 'Очистка ревизий WPFind', 'Очистка ревизий WPFind', 'manage_options', 'wpfind_revision_cleaner', 'wpfind_revision_cleaner_page');
});
function wpfind_revision_cleaner_page() {
if (isset($_POST['wpfind_clean_revisions'])) {
check_admin_referer('wpfind_clean_revisions_action', 'wpfind_clean_revisions_nonce');
wpfind_delete_old_revisions();
echo '<div class="updated notice"><p>Старые ревизии успешно удалены.</p></div>';
}
echo '<div class="wrap"><h1>Очистка старых ревизий WPFind</h1>';
echo '<form method="post">';
wp_nonce_field('wpfind_clean_revisions_action', 'wpfind_clean_revisions_nonce');
echo '<p><input type="submit" name="wpfind_clean_revisions" class="button button-primary" value="Удалить старые ревизии" /></p>';
echo '</form></div>';
}
?>Рекомендации по управлению ревизиями в WordPress
Ограничение количества ревизий
Чтобы в будущем контролировать рост числа ревизий, можно ограничить их количество в файле wp-config.php добавлением:
define('WP_POST_REVISIONS', 3);Это позволит хранить не более 3 ревизий для каждого поста.
Использование плагинов для оптимизации базы
Если не хочется писать код, можно использовать плагины, например:
- Clearfy Pro — плагин для оптимизации и очистки базы данных;
- WP Security Scanner — для анализа и безопасности, в том числе может помочь оптимизировать базу.
Однако программный подход даёт максимальный контроль и возможность гибко настраивать процесс под свои нужды.
Выводы и советы опытному разработчику
Удаление старых ревизий — важная задача для поддержания производительности WordPress сайта. Простое удаление всех ревизий без разбора может привести к потере данных, поэтому лучше сохранять несколько последних версий. Автоматизация с помощью WP-Cron помогает не забывать про этот процесс, а создание собственного плагина облегчает управление и интеграцию с админкой.
Используйте пример кода из статьи как основу для своих решений, адаптируя под проект. Также не забывайте делать резервные копии базы перед массовыми операциями.