Как добавить автоматическое удаление старых transient в WordPress

Что такое transient в WordPress и зачем их удалять

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

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

Как в WordPress хранятся transient и какие проблемы возникают

Transient хранятся в таблице wp_options с префиксом _transient_ для самого значения и _transient_timeout_ для времени истечения. Если transient не удаляются после истечения срока, они остаются в базе данных, занимая место и замедляя запросы.

Проблемы возникают, когда:

  • Transient создаются, но не удаляются после истечения времени.
  • Плагин или тема некорректно работают с транзиентами.
  • База данных не оптимизирована, и накопилось много устаревших transient.

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

Автоматическое удаление старых transient с помощью кода

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

Ниже пример такой функции с префиксом wplog для названия функций:

function wplog_delete_expired_transients() {
    global $wpdb;
    // Удаляем значения транзиентов, у которых истекло время
    $wpdb->query(
        "DELETE FROM {$wpdb->options}
        WHERE option_name LIKE '\\_transient\_%'
        AND option_name NOT LIKE '\\_transient\_timeout\_%'
        AND EXISTS (
            SELECT 1 FROM {$wpdb->options} o2
            WHERE o2.option_name = CONCAT('_transient_timeout_', SUBSTRING(option_name, 12))
            AND o2.option_value < UNIX_TIMESTAMP()
        )"
    );
    // Удаляем записи с тайм-аутами, которые уже истекли
    $wpdb->query(
        "DELETE FROM {$wpdb->options}
        WHERE option_name LIKE '\\_transient\_timeout\_%'
        AND option_value < UNIX_TIMESTAMP()"
    );
}

// Регистрируем событие на запуск каждые 12 часов
if ( ! wp_next_scheduled( 'wplog_cron_delete_expired_transients' ) ) {
    wp_schedule_event( time(), 'twicedaily', 'wplog_cron_delete_expired_transients' );
}

// Хук для запуска функции
add_action( 'wplog_cron_delete_expired_transients', 'wplog_delete_expired_transients' );

Эта функция выполняет два SQL-запроса: удаляет устаревшие transient и их тайм-ауты. Запуск по крону каждые 12 часов помогает поддерживать базу данных в чистоте без вмешательства пользователя.

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

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

  • Transient Cleaner — простой плагин для удаления всех transient за несколько кликов.
  • WP Rocket — популярный кеш-плагин, который автоматически очищает устаревшие transient как часть оптимизации.
  • Clearfy Pro — плагин оптимизации, который помимо прочего помогает управлять transient и другими данными в базе данных. Подробнее смотрите на wpshop.ru.

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

Оптимизация работы с transient: рекомендации

Чтобы избежать проблем с transient, следуйте простым рекомендациям:

  • Используйте transient только для данных, которые действительно нужно кэшировать временно.
  • Устанавливайте разумное время истечения, например, от 10 минут до нескольких часов, в зависимости от данных.
  • Проверяйте плагины и темы на предмет правильного использования transient, чтобы они удалялись после истечения.
  • Регулярно очищайте базу данных от устаревших transient, используя автоматизацию или плагины.

Например, можно добавить в код проверку и удаление transient старше определенного времени или с определенным префиксом, если у вас много transient разного типа.

Пример расширения функции удаления для выборочного очистки transient

Если нужно удалить transient с определенным префиксом, можно расширить функцию так:

function wplog_delete_transients_by_prefix( $prefix = '' ) {
    global $wpdb;
    $prefix = esc_sql( $prefix );
    $wpdb->query(
        "DELETE FROM {$wpdb->options}
        WHERE option_name LIKE '_transient_{$prefix}%'
        OR option_name LIKE '_transient_timeout_{$prefix}%'");
}

// Пример вызова для удаления transient с префиксом 'myprefix_'
wplog_delete_transients_by_prefix('myprefix_');

Такой подход полезен, если вы знаете, что создаете transient с уникальным префиксом и хотите чистить только их.

Заключение по теме удаления старых transient

Поддержание базы данных WordPress в чистоте — залог стабильной и быстрой работы сайта. Автоматическое удаление старых transient — важная часть этой задачи. Используйте приведенный код для самостоятельной реализации или выбирайте проверенные плагины. Совмещайте эти методы с регулярной оптимизацией и проверкой кода плагинов и тем для корректного использования transient.

Как создать адаптивный блок с картинкой и текстом в WordPress
27.12.2025
Как сделать уникальный список постов с заказанным порядком в WordPress
01.02.2026
Автоматическое отключение комментариев на старых публикациях WordPress
14.02.2026
Внутренняя переадресация в WordPress: как сделать без плагинов
03.12.2025
Как создать автоматический список постов с уникальным порядком в WordPress
04.03.2026