Transient API WordPress позволяет временно сохранять данные в базе для ускорения работы сайта. Однако с течением времени старые или устаревшие transient данные могут накапливаться и занимать ненужное место, замедляя работу базы данных. В этой статье подробно расскажем, как найти и эффективно удалить старые transient данные без использования плагинов, а также приведём примеры кода для автоматизации процесса.
Что такое transient данные и почему важно их удалять
Transient — это временные данные, которые хранятся в базе данных WordPress с определённым сроком жизни (expiration time). Они часто используются для кэширования результатов запросов, снижения нагрузки на сервер и повышения скорости загрузки страниц.
Но иногда transient не удаляются автоматически, например, если срок жизни истёк, но процесс очистки не сработал или плагин, создавший transient, перестал поддерживаться. В итоге в таблице wp_options накапливаются «мусорные» записи с префиксом _transient_ и _transient_timeout_.
Это приводит к:
- увеличению размера базы данных;
- замедлению запросов к базе;
- возможным ошибкам в отображении кэшированных данных.
Регулярное удаление старых transient помогает поддерживать базу данных в порядке и улучшает производительность сайта.
Как вручную найти и удалить устаревшие transient данные
Все transient данные хранятся в таблице wp_options (префикс таблицы может отличаться, например, wp24_options). В ней есть ключи с названиями:
_transient_ключ— сами данные;_transient_timeout_ключ— время истечения в UNIX-формате.
Чтобы найти устаревшие transient, нужно сравнить текущее время с timestamp в _transient_timeout_.
Пример SQL-запроса для поиска просроченных transient:
SELECT option_name FROM wp_options WHERE option_name LIKE '_transient_timeout_%' AND option_value < UNIX_TIMESTAMP();Этот запрос выведет все ключи timeout, время которых меньше текущего — то есть просроченные.
Удаление просроченных transient
Чтобы удалить эти записи, можно использовать следующий SQL-запрос:
DELETE FROM wp_options WHERE option_name LIKE '_transient_timeout_%' AND option_value < UNIX_TIMESTAMP();Но нужно удалить не только timeout, но и сами transient данные.
Для удаления всех пар ключей (данных и timeout) просроченных transient можно применить такой подход:
DELETE options_data, options_timeout FROM wp_options AS options_data INNER JOIN wp_options AS options_timeout ON options_timeout.option_name = CONCAT('_transient_timeout_', SUBSTRING(options_data.option_name, 11)) WHERE options_data.option_name LIKE '_transient_%' AND options_timeout.option_value < UNIX_TIMESTAMP();<Этот запрос удалит одновременно и данные, и связанные с ними timeout.
Автоматизация удаления старых transient через PHP код
Если не хочется каждый раз запускать SQL вручную, можно добавить функцию в файл functions.php вашей темы или создать небольшой плагин.
Ниже пример функции wp24_delete_expired_transients, которая удаляет просроченные transient:
function wp24_delete_expired_transients() {
global $wpdb;
$time = time();
// Получаем все ключи просроченных transient timeout
$expired = $wpdb->get_col(
$wpdb->prepare(
"SELECT option_name FROM {$wpdb->options} WHERE option_name LIKE %s AND option_value < %d",
'_transient_timeout_%',
$time
)
);
if (empty($expired)) {
return;
}
foreach ($expired as $timeout_key) {
// Получаем имя transient без префикса
$transient_key = str_replace('_transient_timeout_', '', $timeout_key);
// Удаляем transient данные и timeout
delete_transient($transient_key);
}
}
// Запускаем функцию, например, при инициализации админки
add_action('admin_init', 'wp24_delete_expired_transients');Этот код использует стандартную функцию delete_transient для корректного удаления transient из базы и кэшей.
Используем WP-Cron для регулярной очистки transient
Для автоматической очистки старых transient можно настроить задачу WP-Cron, чтобы функция запускалась, например, ежедневно.
function wp24_setup_transient_cleanup_cron() {
if (!wp_next_scheduled('wp24_daily_transient_cleanup')) {
wp_schedule_event(time(), 'daily', 'wp24_daily_transient_cleanup');
}
}
add_action('wp', 'wp24_setup_transient_cleanup_cron');
add_action('wp24_daily_transient_cleanup', 'wp24_delete_expired_transients');Этот код создаст ежедневное событие, которое будет запускать функцию удаления просроченных transient.
Полезные плагины для работы с transient
Если вы хотите более гибко управлять transient, можно обратить внимание на плагины, которые упрощают очистку и мониторинг кэша, например:
- Clearfy Pro — оптимизация и очистка базы, в том числе transient;
- WPRemark — для управления кэшом и оптимизации запросов.
Однако если хотите минимизировать количество плагинов, приведённый выше код отлично справится с задачей самостоятельно.
Рекомендации по работе с transient в WordPress
Чтобы избежать накопления мусора и проблем с производительностью, придерживайтесь следующих советов:
- Всегда задавайте разумное время жизни transient (expiration). Не делайте его слишком длинным без необходимости.
- Регулярно проверяйте базу данных на наличие устаревших transient и удаляйте их.
- Используйте WP-Cron или системные cron задачи для автоматической очистки.
- Если transient создаются сторонними плагинами, убедитесь, что они корректно их удаляют.
- Для сложных сайтов рассмотрите внедрение внешнего кэша (Redis, Memcached) вместо transient в базе.