Как создать настройку автоудаления старых ревизий записей в WordPress

В WordPress с каждой редакцией записи создаются ревизии — это полезно для отката к предыдущим версиям. Однако с течением времени ревизии могут накапливаться и значительно увеличивать размер базы данных, что негативно сказывается на производительности сайта. В этой статье мы рассмотрим, как создать удобную настройку в административной панели WordPress, которая позволит автоматически удалять старые ревизии записей по заданному критерию.

Почему важно удалять старые ревизии записей

Ревизии — это ценный инструмент для восстановления контента, но их чрезмерное накопление приводит к ряду проблем:

  • Рост базы данных: тысячи ревизий могут занимать значительный объем и замедлять работу запросов.
  • Сложность резервного копирования: бэкапы становятся больше и дольше создаются.
  • Повышенная нагрузка на сервер: при выполнении запросов к таблице wp_posts с большим числом ревизий.

Автоматическое управление ревизиями помогает избежать этих проблем без потери функциональности.

Создаем пользовательскую настройку в админке WordPress

Для начала создадим страницу настроек, где администратор сможет задать параметр — количество дней, после которых ревизии будут удаляться автоматически. Это позволит гибко управлять политикой очистки.

Регистрация страницы настроек

Добавим меню в админ-панель с помощью хука admin_menu:

add_action('admin_menu', 'wpaction_add_revision_cleanup_page');
function wpaction_add_revision_cleanup_page() {
    add_options_page(
        'Автоудаление ревизий',
        'Автоудаление ревизий',
        'manage_options',
        'wpaction_revision_cleanup',
        'wpaction_render_revision_cleanup_page'
    );
}

Вывод формы настроек

Создадим функцию для вывода формы и обработки данных:

function wpaction_render_revision_cleanup_page() {
    if (!current_user_can('manage_options')) {
        return;
    }

    if (isset($_POST['wpaction_save_revision_cleanup'])) {
        check_admin_referer('wpaction_revision_cleanup_nonce');
        $days = intval($_POST['wpaction_revision_days']);
        update_option('wpaction_revision_cleanup_days', $days);
        echo '<div class="updated">Настройки сохранены.</div>';
    }

    $days = get_option('wpaction_revision_cleanup_days', 30);
    ?>
    <div class="wrap">
        <h1>Настройка автоудаления ревизий</h1>
        <form method="post" action="">
            <?php wp_nonce_field('wpaction_revision_cleanup_nonce'); ?>
            <table class="form-table">
                <tr valign="top">
                    <th scope="row">Удалять ревизии старше, дней:</th>
                    <td><input type="number" name="wpaction_revision_days" value="<?php echo esc_attr($days); ?>" min="1" /></td>
                </tr>
            </table>
            <input type="submit" name="wpaction_save_revision_cleanup" class="button button-primary" value="Сохранить" />
        </form>
    </div>
    <?php
}

Реализация функции удаления ревизий по расписанию

Для автоматического удаления создадим задачу WP-Cron, которая будет запускаться ежедневно и удалять ревизии, старше указанного количества дней.

Регистрация Cron-задачи

Добавим код для регистрации и запуска задачи:

add_action('wpaction_daily_revision_cleanup', 'wpaction_delete_old_revisions');

function wpaction_schedule_revision_cleanup() {
    if (!wp_next_scheduled('wpaction_daily_revision_cleanup')) {
        wp_schedule_event(time(), 'daily', 'wpaction_daily_revision_cleanup');
    }
}
add_action('wp', 'wpaction_schedule_revision_cleanup');

Функция удаления ревизий

Реализуем саму логику удаления:

function wpaction_delete_old_revisions() {
    global $wpdb;
    $days = get_option('wpaction_revision_cleanup_days', 30);
    $date_threshold = date('Y-m-d H:i:s', strtotime("-{$days} days"));

    // Получаем ID ревизий старше порога
    $revision_ids = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'revision' AND post_modified < %s",
        $date_threshold
    ));

    if (!empty($revision_ids)) {
        foreach ($revision_ids as $revision_id) {
            wp_delete_post($revision_id, true); // Удаляем без возможности восстановления
        }
    }
}

Советы по безопасности и производительности

При работе с удалением данных важно учитывать следующие моменты:

  • Резервное копирование базы данных: перед активацией автоматического удаления создайте резервную копию, чтобы избежать потери важных данных.
  • Отключение WP-Cron на крупных сайтах: если WP-Cron не запускается регулярно, настройте системный cron для запуска wp-cron.php.
  • Проверка настроек: предоставьте администратору возможность отключить или изменить период удаления.

Использование плагинов для управления ревизиями

Если вы предпочитаете готовые решения, есть несколько популярных плагинов, которые позволяют управлять ревизиями:

  • Clearfy Pro — расширенный набор инструментов оптимизации, включая управление ревизиями.
  • WPRemark — плагин для автоматизации задач, который можно настроить для запуска очистки ревизий.

Заключение

Создание пользовательской настройки автоудаления старых ревизий в WordPress позволяет эффективно управлять размером базы данных и поддерживать высокую производительность сайта. Используя простой интерфейс и WP-Cron, вы автоматизируете процесс без ручного вмешательства. Это решение подойдет как новичкам, так и опытным разработчикам, которые хотят контролировать ревизии на своих проектах.

WooCommerce: как автоматически удалять товары из каталога при отсутствии на складе
08.06.2026
Как создать настройки темы в WordPress с примерами кода
18.11.2025
Как использовать фильтры WooCommerce для изменения цены товара на лету
28.04.2026
WooCommerce: как автоматически удалять товар из каталога при отсутствии на складе
17.05.2026
Как отключить REST API в WordPress для защиты сайта
13.02.2026