Что такое transient в WordPress и зачем их удалять
Transient API в WordPress — это механизм временного кэширования данных, который позволяет сохранять результаты запросов или вычислений на ограниченное время. Это ускоряет загрузку страниц и снижает нагрузку на базу данных. Однако, с течением времени накопленные transient, особенно устаревшие или неиспользуемые, могут засорять базу данных и замедлять работу сайта.
Автоматическое удаление старых transient помогает поддерживать базу данных в оптимальном состоянии, предотвращает избыточное потребление ресурсов и улучшает производительность сайта. В этой статье мы рассмотрим, как реализовать такое удаление с помощью кода и плагинов.
Как в WordPress хранятся transient и какие проблемы возникают
Transient хранятся в таблице wp_options с префиксом _transient_ для самого значения и _transient_timeout_ для времени истечения. Если transient не удаляются после истечения срока, они остаются в базе данных, занимая место и замедляя запросы.
Проблемы возникают, когда:
- Transient создаются, но не удаляются после истечения времени.
- Плагин или тема некорректно работают с транзиентами.
- База данных не оптимизирована, и накопилось много устаревших transient.
Ручное удаление может быть трудоемким, поэтому автоматизация процесса — лучший вариант.
Автоматическое удаление старых transient с помощью кода
Для автоматического удаления старых transient можно написать функцию, которая будет запускаться по крону (WP-Cron) и удалять все просроченные transient из базы данных.
Ниже пример такой функции с префиксом wplog для названия функций:
function wplog_delete_expired_transients() {
global $wpdb;
// Удаляем значения транзиентов, у которых истекло время
$wpdb->query(
"DELETE FROM {$wpdb->options}
WHERE option_name LIKE '\\_transient\_%'
AND option_name NOT LIKE '\\_transient\_timeout\_%'
AND EXISTS (
SELECT 1 FROM {$wpdb->options} o2
WHERE o2.option_name = CONCAT('_transient_timeout_', SUBSTRING(option_name, 12))
AND o2.option_value < UNIX_TIMESTAMP()
)"
);
// Удаляем записи с тайм-аутами, которые уже истекли
$wpdb->query(
"DELETE FROM {$wpdb->options}
WHERE option_name LIKE '\\_transient\_timeout\_%'
AND option_value < UNIX_TIMESTAMP()"
);
}
// Регистрируем событие на запуск каждые 12 часов
if ( ! wp_next_scheduled( 'wplog_cron_delete_expired_transients' ) ) {
wp_schedule_event( time(), 'twicedaily', 'wplog_cron_delete_expired_transients' );
}
// Хук для запуска функции
add_action( 'wplog_cron_delete_expired_transients', 'wplog_delete_expired_transients' );Эта функция выполняет два SQL-запроса: удаляет устаревшие transient и их тайм-ауты. Запуск по крону каждые 12 часов помогает поддерживать базу данных в чистоте без вмешательства пользователя.
Использование плагинов для управления transient
Если вы предпочитаете готовые решения, обратите внимание на плагины, которые помогают управлять transient:
- Transient Cleaner — простой плагин для удаления всех transient за несколько кликов.
- WP Rocket — популярный кеш-плагин, который автоматически очищает устаревшие transient как часть оптимизации.
- Clearfy Pro — плагин оптимизации, который помимо прочего помогает управлять transient и другими данными в базе данных. Подробнее смотрите на wpshop.ru.
Рассмотрите интеграцию таких плагинов в зависимости от задач сайта. Однако, если хотите точечное решение, код выше будет оптимальным.
Оптимизация работы с transient: рекомендации
Чтобы избежать проблем с transient, следуйте простым рекомендациям:
- Используйте transient только для данных, которые действительно нужно кэшировать временно.
- Устанавливайте разумное время истечения, например, от 10 минут до нескольких часов, в зависимости от данных.
- Проверяйте плагины и темы на предмет правильного использования transient, чтобы они удалялись после истечения.
- Регулярно очищайте базу данных от устаревших transient, используя автоматизацию или плагины.
Например, можно добавить в код проверку и удаление transient старше определенного времени или с определенным префиксом, если у вас много transient разного типа.
Пример расширения функции удаления для выборочного очистки transient
Если нужно удалить transient с определенным префиксом, можно расширить функцию так:
function wplog_delete_transients_by_prefix( $prefix = '' ) {
global $wpdb;
$prefix = esc_sql( $prefix );
$wpdb->query(
"DELETE FROM {$wpdb->options}
WHERE option_name LIKE '_transient_{$prefix}%'
OR option_name LIKE '_transient_timeout_{$prefix}%'");
}
// Пример вызова для удаления transient с префиксом 'myprefix_'
wplog_delete_transients_by_prefix('myprefix_');Такой подход полезен, если вы знаете, что создаете transient с уникальным префиксом и хотите чистить только их.
Заключение по теме удаления старых transient
Поддержание базы данных WordPress в чистоте — залог стабильной и быстрой работы сайта. Автоматическое удаление старых transient — важная часть этой задачи. Используйте приведенный код для самостоятельной реализации или выбирайте проверенные плагины. Совмещайте эти методы с регулярной оптимизацией и проверкой кода плагинов и тем для корректного использования transient.