Как удалить устаревшие записи и метаданные в WordPress по расписанию

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

Почему важно регулярно очищать базу данных WordPress

С каждым обновлением записей и страниц WordPress создает ревизии, а также сохраняет автосохранения. Помимо этого, в базе накапливаются транзиенты, метаданные, связанные с удаленными постами, и другие данные, которые уже не нужны.

Без регулярной очистки база разрастается, что замедляет запросы, увеличивает нагрузку на сервер и может привести к ошибкам при резервном копировании или восстановлении. Особенно это критично для крупных проектов с большим количеством контента.

Удаление устаревших элементов вручную занимает время и требует знаний SQL. Автоматизация позволяет поддерживать базу в оптимальном состоянии без лишних усилий.

Основные объекты для удаления и оптимизации

  • Ревизии постов — старые версии записей, которые не нужны после публикации.
  • Автосохранения — временные черновики, которые уже устарели.
  • Удалённые записи и метаданные — данные, связанные с удаленными постами, страницами и комментариями.
  • Транзиенты — временные кэшированные данные, которые иногда остаются в базе дольше необходимого.

Все эти элементы занимают место и требуют периодической очистки.

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

Давайте напишем функцию wpall_delete_old_revisions(), которая удалит все ревизии и связанные метаданные, а также автосохранения старше 30 дней.

function wpall_delete_old_revisions() {
    global $wpdb;
    $days = 30; // Возраст в днях
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    // Удаляем ревизии старше указанного срока
    $revisions = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'revision' AND post_modified < %s",
        $date_threshold
    ));

    if (!empty($revisions)) {
        foreach ($revisions as $revision_id) {
            wp_delete_post($revision_id, true);
        }
    }

    // Удаляем автосохранения старше срока
    $autosaves = $wpdb->get_col($wpdb->prepare(
        "SELECT ID FROM {$wpdb->posts} WHERE post_type = 'autosave' AND post_modified < %s",
        $date_threshold
    ));

    if (!empty($autosaves)) {
        foreach ($autosaves as $autosave_id) {
            wp_delete_post($autosave_id, true);
        }
    }

    // Оптимизируем таблицу после удаления
    $wpdb->query("OPTIMIZE TABLE {$wpdb->posts}");
    $wpdb->query("OPTIMIZE TABLE {$wpdb->postmeta}");
}

Эта функция удалит ревизии и автосохранения старше 30 дней с полной очисткой записей и метаданных. Оптимизация таблиц поможет уменьшить фрагментацию.

Настройка автоматического запуска функции через WP-Cron

Для автоматизации добавим событие в WP-Cron, которое будет запускать функцию раз в неделю.

function wpall_schedule_revision_cleanup() {
    if (!wp_next_scheduled('wpall_weekly_revision_cleanup')) {
        wp_schedule_event(time(), 'weekly', 'wpall_weekly_revision_cleanup');
    }
}
add_action('wp', 'wpall_schedule_revision_cleanup');

add_action('wpall_weekly_revision_cleanup', 'wpall_delete_old_revisions');

Эти хуки создадут задачу, которая будет запускать очистку каждую неделю. Если хотите изменить интервал, можно добавить кастомный расписание с помощью фильтра cron_schedules.

Удаление устаревших транзиентов

Транзиенты — это временные данные, которые иногда не удаляются автоматически. Для их очистки используйте функцию:

function wpall_delete_expired_transients() {
    global $wpdb;
    $time = current_time('mysql');
    $transients = $wpdb->get_col("SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE '_transient_%' AND option_name NOT LIKE '_transient_timeout_%'");

    foreach ($transients as $transient) {
        $key = str_replace('_transient_', '', $transient);
        if (get_transient($key) === false) {
            delete_option($transient);
            delete_option('_transient_timeout_' . $key);
        }
    }
}

Добавьте вызов этой функции в вашу задачу WP-Cron или запустите вручную для очистки базы от устаревших кэшированных данных.

Использование готовых плагинов для автоматической очистки базы

Если не хотите писать код, можно использовать плагины с похожей функциональностью:

  • Clearfy Pro — мощный инструмент для оптимизации и очистки базы данных с автоматическим расписанием.
  • WPRemark — содержит функции очистки базы и управления ревизиями.

Эти плагины имеют удобный интерфейс и дополнительные возможности для оптимизации сайта.

Советы по безопасной очистке базы данных

Перед автоматической очисткой всегда делайте резервные копии базы данных. Некорректное удаление может привести к потере важных данных. Тестируйте функции на локальной копии сайта.

Не удаляйте ревизии слишком часто, они могут пригодиться для восстановления контента. Обычно достаточно хранить их 30-60 дней.

Используйте wp_delete_post() с параметром true для полного удаления записи и связанных метаданных.

Как проверить работу очистки и отладить

Для отладки можно добавить логирование в функцию очистки:

function wpall_delete_old_revisions() {
    global $wpdb;
    $days = 30;
    $date_threshold = date('Y-m-d H:i:s', strtotime('-' . $days . ' days'));

    error_log('WPAll: Запуск очистки ревизий и автосохранений');

    $revisions = $wpdb->get_col($wpdb->prepare("SELECT ID FROM {$wpdb->posts} WHERE post_type = 'revision' AND post_modified < %s", $date_threshold));

    foreach ($revisions as $revision_id) {
        wp_delete_post($revision_id, true);
        error_log("WPAll: Удалена ревизия ID $revision_id");
    }

    // Аналогично для автосохранений и оптимизации
}

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

Используя описанные методы, вы сможете поддерживать вашу базу WordPress в чистоте и порядке, что повысит производительность сайта и упростит дальнейшее сопровождение.

Авторизация через социальные сети в WordPress — настройка и примеры кода
07.12.2025
Как удалить старые изображения в WordPress: практическое руководство
20.02.2026
Оптимизация загрузки картинок в WordPress для ускорения сайта
03.12.2025
Авторизация по одноразовому паролю (OTP) в WordPress с практическими решениями
16.01.2026
Как создать автоматический экспорт постов в WordPress с примерами кода и плагинами
05.03.2026