Transient API в WordPress — мощный инструмент для временного кеширования данных с заданным временем жизни. Однако со временем накапливаются устаревшие transient, которые не удаляются автоматически и могут грузить базу данных, замедляя сайт. В этой статье подробно разберём, как автоматизировать удаление неиспользуемых transient, улучшая производительность и сокращая размер базы данных.
Что такое transient и зачем их удалять автоматизированно
Transient — это временные данные, хранящиеся в таблице wp_options с префиксом _transient_. Они используются для кеширования результатов запросов, API ответов, сложных вычислений и т.п. Каждый transient имеет время жизни (expiration). После его истечения transient считается устаревшим, но не удаляется автоматически, а только помечается.
Если не удалять такие данные, таблица wp_options будет разрастаться, что увеличит время отклика базы данных и замедлит работу сайта. Особенно заметно это на крупных проектах с множеством transient.
Автоматизация удаления устаревших transient помогает поддерживать базу данных в чистоте и ускоряет работу сайта.
Особенности хранения transient в базе данных
Transient хранятся в двух опциях: сама опция с данными и опция с временем окончания жизни, например:
_transient_example_key— данные transient_transient_timeout_example_key— время истечения transient
Чтобы удалить устаревший transient, нужно проверить время в timeout-опции и удалить обе записи.
Ручное удаление устаревших transient через код
Для автоматизации удаления transient можно использовать WP Cron и написать функцию, которая будет регулярно проверять и удалять устаревшие transient.
Пример функции для удаления устаревших transient:
function wpguest_delete_expired_transients() {
global $wpdb;
$time = time();
// Получаем опции с timeout, у которых время меньше текущего
$expired = $wpdb->get_col(
$wpdb->prepare(
"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_option_name ) {
// Извлекаем ключ transient
$transient_key = str_replace('_transient_timeout_', '', $timeout_option_name);
// Удаляем данные transient и timeout
delete_option( '_transient_' . $transient_key );
delete_option( $timeout_option_name );
}
}
// Добавим задачу в WP Cron, если еще не добавлена
function wpguest_schedule_transient_cleanup() {
if ( ! wp_next_scheduled( 'wpguest_cleanup_expired_transients' ) ) {
wp_schedule_event( time(), 'daily', 'wpguest_cleanup_expired_transients' );
}
}
add_action( 'wp', 'wpguest_schedule_transient_cleanup' );
// Обработчик события
add_action( 'wpguest_cleanup_expired_transients', 'wpguest_delete_expired_transients' );Этот код добавляет ежедневное задание, которое удаляет все устаревшие transient из базы данных.
Как запустить очистку вручную для отладки
Для проверки можно вызвать функцию напрямую в теме или плагине:
wpguest_delete_expired_transients();Это удобно для тестирования перед автоматизацией.
Использование плагинов для автоматизации очистки transient
Если не хочется писать код, можно использовать готовые плагины. Например:
- Clearfy Pro — содержит функцию автоматической очистки transient и других неиспользуемых данных базы. Подробнее — на wpshop.ru.
- Transient Cleaner — бесплатный плагин с возможностью ручного и автоматического удаления устаревших transient.
Плагины удобно использовать, если на сайте нет собственной системы автоматизации с WP Cron.
Советы по оптимизации работы с transient
Чтобы transient не создавали проблем, следуйте рекомендациям:
- Устанавливайте разумные сроки жизни transient. Не ставьте слишком большие значения, чтобы кеш не устаревал.
- Регулярно очищайте базу от устаревших transient — автоматизируйте процесс, как показано выше.
- Используйте object-cache (Redis, Memcached) для transient, чтобы снизить нагрузку на базу данных.
- Проверяйте плагины и темы на предмет правильного использования transient, чтобы избежать накопления мусора.
Пример использования transient с правильным удалением
Пример функции с использованием transient и удалением при необходимости:
function wpguest_get_external_api_data() {
$cache_key = 'wpguest_external_api_data';
$data = get_transient( $cache_key );
if ( false === $data ) {
// Данные не в кеше, получаем от API
$response = wp_remote_get( 'https://api.example.com/data' );
if ( is_wp_error( $response ) ) {
return false;
}
$body = wp_remote_retrieve_body( $response );
$data = json_decode( $body, true );
if ( ! empty( $data ) ) {
set_transient( $cache_key, $data, HOUR_IN_SECONDS );
}
}
return $data;
}Такой подход позволяет хранить данные временно и не создавать постоянного мусора в базе.
Заключение
Автоматизация удаления устаревших transient — важный шаг для поддержания скорости и стабильности WordPress сайта. Используя приведённый код и рекомендации, вы сможете эффективно очищать базу данных и избежать замедления из-за накопления временных данных. Если хотите более простой вариант, рекомендуем обратить внимание на Clearfy Pro, который содержит готовые инструменты для этой задачи.