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

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

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

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

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

WordPress автоматически удаляет expired transient только при обращении к ним (lazy deletion). Если transient не вызываются, они остаются в базе данных. Поэтому нужна дополнительная очистка.

Как вручную удалить устаревшие transientы через WP-CLI и SQL-запросы

Для быстрой очистки transient можно использовать WP-CLI:

wpspuzzle_wpcli_delete_expired_transients() {
  wp transient delete --expired
}

Эта команда удалит все просроченные transientы.

Если нет WP-CLI, можно выполнить SQL-запрос напрямую:

DELETE FROM wp_options WHERE option_name LIKE '_transient_%' AND option_name NOT LIKE '_transient_timeout_%' AND option_name IN (
  SELECT option_name FROM wp_options WHERE option_name LIKE '_transient_timeout_%' AND option_value < UNIX_TIMESTAMP()
);

Этот запрос удалит все transient, у которых срок действия уже истек.

Автоматизация удаления transient с помощью WP-Cron

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

function wppuzzle_delete_expired_transients() {
  global $wpdb;
  $time = time();
  // Получаем все ключи expired transient
  $expired = $wpdb->get_col(
    "SELECT option_name FROM {$wpdb->options} 
     WHERE option_name LIKE '_transient_timeout_%' AND option_value < %d",
    $time
  );

  if (empty($expired)) {
    return;
  }

  foreach ($expired as $timeout_key) {
    $transient_key = str_replace('_transient_timeout_', '_transient_', $timeout_key);
    delete_option($timeout_key);
    delete_option($transient_key);
  }
}

// Регистрируем событие, если оно не установлено
if (!wp_next_scheduled('wppuzzle_cron_delete_expired_transients')) {
  wp_schedule_event(time(), 'hourly', 'wppuzzle_cron_delete_expired_transients');
}

// Хук на кастомное событие
add_action('wppuzzle_cron_delete_expired_transients', 'wppuzzle_delete_expired_transients');

В этом коде:

  • Функция wppuzzle_delete_expired_transients находит все просроченные transient и удаляет их.
  • Событие WP-Cron wppuzzle_cron_delete_expired_transients запускается каждый час, вызывая функцию.

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

Полезные плагины для управления transient и кэшом

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

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

Используйте плагины с осторожностью, чтобы не удалить нужные transient.

Советы по оптимизации работы с transient в коде

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

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

Например, функция для сохранения transient в вашем плагине или теме может выглядеть так:

function wppuzzle_set_custom_transient($key, $data, $expiration = 3600) {
  set_transient('wppuzzle_' . $key, $data, $expiration);
}

function wppuzzle_get_custom_transient($key) {
  return get_transient('wppuzzle_' . $key);
}

function wppuzzle_delete_custom_transient($key) {
  delete_transient('wppuzzle_' . $key);
}

Это упрощает контроль и очистку transient с вашим префиксом.

Как создать автоматический попап в WordPress на основе успешного действия пользователя
13.12.2025
Как удалить неиспользуемые метаданные в WordPress
07.12.2025
Как запретить роботам индексировать категории WordPress
05.02.2026
Как решить проблему нерабочих вариантов атрибута в WooCommerce
24.04.2026
Как отключить автоматические обновления плагинов WordPress
12.03.2026