В WordPress активно используются transient API — временные пакеты данных, которые позволяют кэшировать результаты запросов и улучшать производительность сайта. Однако при длительной работе сайта накопление устаревших и просроченных transient пакетов может негативно сказаться на скорости и размере базы данных. В этой статье мы подробно разберём, как автоматизировать удаление таких старых transient, чтобы поддерживать базу данных в оптимальном состоянии.
Что такое transient в WordPress и зачем их удалять
Transient API в WordPress — это способ хранения временных данных с указанием времени жизни. Они хранятся в таблице wp_options и позволяют уменьшить количество тяжелых запросов к базе данных или внешним сервисам. Например, transient может кэшировать результаты API-запроса или результаты сложных SQL-запросов.
Однако, transient имеют срок жизни, после которого данные считаются устаревшими. Если transient не удалять, они будут оставаться в базе данных, занимая место и потенциально замедляя запросы.
Автоматическое удаление просроченных transient помогает поддерживать скорость сайта и облегчает обслуживание базы данных.
Как WordPress обрабатывает удаление transient по умолчанию
По умолчанию WordPress не удаляет устаревшие transient сразу после их срока жизни. Вместо этого удаление происходит при вызове функции wp_cache_get() или при очистке опций в ходе cron-заданий. Но если transient не запрашиваются, они могут оставаться в базе данных неопределенно долго.
Для автоматизации удаления можно настроить собственные задачи cron, которые будут периодически чистить базу.
Реализация автоматического удаления устаревших transient через WP-Cron
Чтобы регулярно удалять просроченные transient, создадим пользовательскую функцию и зарегистрируем её в WP-Cron.
function wpcourse_cleanup_expired_transients() {
global $wpdb;
$time = time();
// transient хранится в wp_options с префиксом _transient_ и _transient_timeout_
$expired = $wpdb->get_col( "
SELECT option_name FROM $wpdb->options
WHERE option_name LIKE '_transient_timeout_%'
AND option_value < $time
" );
if ( empty( $expired ) ) {
return;
}
foreach ( $expired as $timeout_name ) {
$transient_name = str_replace( '_transient_timeout_', '', $timeout_name );
delete_transient( $transient_name );
}
}
// Планируем событие при активации темы или плагина
if ( ! wp_next_scheduled( 'wpcourse_cleanup_expired_transients_hook' ) ) {
wp_schedule_event( time(), 'hourly', 'wpcourse_cleanup_expired_transients_hook' );
}
// Привязываем функцию к событию
add_action( 'wpcourse_cleanup_expired_transients_hook', 'wpcourse_cleanup_expired_transients' );
Этот код создаёт задачу, которая будет запускаться каждый час и удалять все просроченные transient из базы. Таким образом, база данных будет очищаться от старых временных данных автоматически.
Как добавить и удалить задачу cron вручную
Для тестирования или удаления задачи используйте следующие функции:
// Удалить задачу
wp_clear_scheduled_hook( 'wpcourse_cleanup_expired_transients_hook' );
// Запустить задачу вручную
do_action( 'wpcourse_cleanup_expired_transients_hook' );
Использование плагинов для автоматической очистки transient
Если не хочется писать код, можно использовать готовые плагины для очистки transient и оптимизации базы данных. Вот несколько проверенных вариантов:
- Clearfy Pro — мощный плагин оптимизации, который позволяет автоматизировать очистку transient и других временных данных WordPress. Подробнее на официальной странице Clearfy Pro.
- WP-Optimize — бесплатный и популярный плагин для очистки базы данных, включая transient и ревизии.
- Advanced Database Cleaner — плагин с расширенными возможностями очистки, включая планировщик задач.
Использование плагинов удобно, если вы не хотите вникать в технические детали и хотите получить готовое решение с интерфейсом и дополнительными настройками.
Как проверять количество transient в базе и мониторить очистку
Для диагностики и мониторинга transient можно использовать SQL-запрос:
SELECT option_name FROM wp_options WHERE option_name LIKE '_transient_%';
Для более удобного мониторинга можно использовать плагин Query Monitor, который покажет нагрузку базы и количество transient в режиме реального времени.
Пример функции для вывода количества transient
function wpcourse_count_transients() {
global $wpdb;
$count = $wpdb->get_var( "SELECT COUNT(*) FROM $wpdb->options WHERE option_name LIKE '_transient_%'" );
return intval( $count );
}
// Используйте в шаблоне или в админке
echo 'Всего transient в базе: ' . wpcourse_count_transients();
Рекомендации по работе с transient для разработчиков
Если вы создаёте плагины или темы с использованием transient, учитывайте следующие рекомендации:
- Всегда задавайте разумное время жизни transient (TTL), чтобы данные не хранились дольше необходимого.
- Используйте
set_transient()иget_transient()для работы с временными данными, а не напрямую опции. - Добавьте возможность сброса transient вручную через настройки или хуки.
- Проверяйте существование transient перед выполнением тяжелых запросов.
Правильное управление transient повышает производительность сайта, снижая время загрузки и нагрузку на сервер.