Transient API в WordPress — это мощный инструмент для временного кэширования данных с указанием срока действия. Однако часто на сайтах накапливаются просроченные transient, которые не удаляются автоматически, что может привести к росту базы данных и замедлению работы сайта. В этой статье мы разберём, как автоматизировать удаление старых transient в WordPress, используя WP-Cron и собственные функции, а также рассмотрим полезные плагины для контроля transient.
Что такое transient в WordPress и почему важно их удалять
Transient — это временные данные, которые сохраняются в базе данных или в объектном кеше с ограниченным временем жизни. Они позволяют снизить нагрузку на сервер, кэшируя результаты дорогих запросов или вычислений.
Но если transient не удаляются после истечения срока или их становится слишком много, база данных загромождается, что замедляет сайт. Поэтому важно регулярно удалять просроченные transient.
WordPress автоматически удаляет expired transient при их запросе, но если транзиенты не запрашиваются, они остаются в базе. Автоматизация очистки поможет избежать накопления мусора.
Автоматизация удаления старого transient с помощью WP-Cron
Чтобы регулярно очищать базу от просроченных transient, можно создать собственное задание WP-Cron. Ниже пример функции и регистрации cron-задачи, которая будет запускаться ежедневно и удалять все просроченные transient.
Пример кода автоматического удаления transient
function wpdetect_delete_expired_transients() {
global $wpdb;
// Удаляем все expired transient из базы данных
$time = current_time('timestamp');
$transient_name_like = '_transient_timeout_%';
// Получаем все ключи с таймаутами
$expired_transients = $wpdb->get_col( $wpdb->prepare(
"SELECT option_name FROM $wpdb->options WHERE option_name LIKE %s AND option_value < %d",
$transient_name_like,
$time
) );
if ( ! empty( $expired_transients ) ) {
foreach ( $expired_transients as $transient_timeout_key ) {
// Получаем имя transient без префикса '_transient_timeout_'
$transient_key = str_replace('_transient_timeout_', '', $transient_timeout_key);
// Удаляем transient и его таймаут
delete_transient( $transient_key );
}
}
}
// Регистрация события WP-Cron
function wpdetect_schedule_transient_cleanup() {
if ( ! wp_next_scheduled( 'wpdetect_daily_transient_cleanup' ) ) {
wp_schedule_event( time(), 'daily', 'wpdetect_daily_transient_cleanup' );
}
}
add_action( 'wp', 'wpdetect_schedule_transient_cleanup' );
// Хук для запуска очистки
add_action( 'wpdetect_daily_transient_cleanup', 'wpdetect_delete_expired_transients' );
Этот код создаёт ежедневное событие, которое запускает функцию удаления всех просроченных transient из базы данных. Таким образом, база будет очищаться регулярно без участия администратора.
Полезные плагины для управления transient в WordPress
Помимо собственного кода, есть плагины, которые позволяют визуально контролировать и удалять transient, а также оптимизировать работу с кэшем.
1. Transients Manager
Простой и бесплатный плагин, который позволяет просматривать, удалять и очищать transient через админ-панель WordPress. Очень полезен для диагностики и ручного управления.
2. Clearfy Pro
Плагин оптимизации сайта, который включает инструменты для управления transient и кешем, а также оптимизацию базы данных. Можно настроить автоматическую очистку transient и многое другое. Подробнее: Clearfy Pro на WPSHOP.
Оптимизация работы с transient: рекомендации и лучшие практики
Чтобы transient не становились проблемой, следуйте простым советам:
- Указывайте разумное время жизни transient. Не ставьте слишком большой срок, если данные меняются часто.
- Используйте префиксы для transient. Это поможет избежать конфликтов и упростит поиск нужных ключей.
- Регулярно очищайте просроченные transient. Для этого используйте автоматизацию через WP-Cron, как в примере выше.
- Мониторьте transient через плагины или собственные инструменты. Это поможет вовремя обнаружить накопление мусора.
Расширенный пример: удаление старых transient с фильтрацией по префиксу
Если на сайте много transient с разными префиксами, можно очищать только те, которые относятся к вашему плагину или теме, чтобы не трогать чужие данные.
function wpdetect_delete_expired_transients_by_prefix( $prefix = '' ) {
global $wpdb;
$time = current_time('timestamp');
$like = '_transient_timeout_' . $prefix . '%';
$expired_transients = $wpdb->get_col( $wpdb->prepare(
"SELECT option_name FROM $wpdb->options WHERE option_name LIKE %s AND option_value < %d",
$like,
$time
) );
if ( ! empty( $expired_transients ) ) {
foreach ( $expired_transients as $timeout_key ) {
$transient_key = str_replace( '_transient_timeout_', '', $timeout_key );
delete_transient( $transient_key );
}
}
}
// Пример использования: удаляем только transient с префиксом 'wpdetect_'
wpdetect_delete_expired_transients_by_prefix( 'wpdetect_' );
Такой подход позволяет контролировать удаление transient с высокой точностью и не затрагивать данные других плагинов.