Transient API в WordPress — это мощный инструмент для временного хранения данных с установленным сроком жизни. Оно часто используется для кэширования результатов запросов, данных, полученных из внешних API, и других временных данных. Однако со временем transient-значения могут накапливаться и не удаляться автоматически, если истек срок их действия, что приводит к росту базы данных и замедлению сайта. В этой статье мы разберём, как настроить автоматическое удаление устаревших transient-ключей, рассмотрим примеры кода и полезные плагины.
Что такое transient и почему важно удалять старые значения
Transient — это временные опции с меткой времени, которые хранятся в таблице wp_options. Они позволяют кэшировать данные на ограниченный период, чтобы не выполнять тяжелые операции или запросы слишком часто. Например, можно кэшировать результат внешнего API на 1 час.
Но если transient не очищаются после окончания срока, они остаются в базе данных, занимая место и замедляя запросы. Это особенно критично для больших сайтов, где transient генерируется часто.
WordPress автоматически удаляет expired transient только при обращении к ним (lazy deletion). Если transient не вызываются, они остаются в базе данных. Поэтому нужна дополнительная очистка.
Как вручную удалить устаревшие transientы через WP-CLI и SQL-запросы
Для быстрой очистки transient можно использовать WP-CLI:
wpspuzzle_wpcli_delete_expired_transients() {
wp transient delete --expired
}
Эта команда удалит все просроченные transientы.
Если нет WP-CLI, можно выполнить SQL-запрос напрямую:
DELETE FROM wp_options WHERE option_name LIKE '_transient_%' AND option_name NOT LIKE '_transient_timeout_%' AND option_name IN (
SELECT option_name FROM wp_options WHERE option_name LIKE '_transient_timeout_%' AND option_value < UNIX_TIMESTAMP()
);
Этот запрос удалит все transient, у которых срок действия уже истек.
Автоматизация удаления transient с помощью WP-Cron
Для автоматического удаления можно создать функцию, которая будет запускаться по расписанию с помощью WP-Cron. Вот пример такой функции:
function wppuzzle_delete_expired_transients() {
global $wpdb;
$time = time();
// Получаем все ключи expired transient
$expired = $wpdb->get_col(
"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_key) {
$transient_key = str_replace('_transient_timeout_', '_transient_', $timeout_key);
delete_option($timeout_key);
delete_option($transient_key);
}
}
// Регистрируем событие, если оно не установлено
if (!wp_next_scheduled('wppuzzle_cron_delete_expired_transients')) {
wp_schedule_event(time(), 'hourly', 'wppuzzle_cron_delete_expired_transients');
}
// Хук на кастомное событие
add_action('wppuzzle_cron_delete_expired_transients', 'wppuzzle_delete_expired_transients');
В этом коде:
- Функция
wppuzzle_delete_expired_transientsнаходит все просроченные transient и удаляет их. - Событие WP-Cron
wppuzzle_cron_delete_expired_transientsзапускается каждый час, вызывая функцию.
Это решение позволяет регулярно очищать базу от устаревших transient без участия администратора.
Полезные плагины для управления transient и кэшом
Если вы предпочитаете готовые решения, обратите внимание на следующие плагины:
- Clearfy Pro — оптимизирует работу WordPress, включая управление transient и очистку базы данных. Поддерживает автоматическую очистку устаревших transient. Подробнее: https://wpshop.ru/plugins/clearfy/
- WP Rocket — мощный плагин для кэширования, который умеет очищать transientы как часть оптимизации.
- Transient Cleaner — специализированный плагин для удаления transient, включая массовую и автоматическую очистку.
Используйте плагины с осторожностью, чтобы не удалить нужные transient.
Советы по оптимизации работы с transient в коде
Чтобы минимизировать накопление ненужных transient, придерживайтесь следующих рекомендаций:
- Устанавливайте адекватный срок жизни transient, не слишком большой.
- Используйте уникальные и осмысленные ключи, чтобы избежать коллизий.
- Удаляйте transient вручную при изменении данных, чтобы не ждать их автоматического истечения.
- Проверяйте, что transient реально используется и обновляется, чтобы не создавать лишних записей.
Например, функция для сохранения transient в вашем плагине или теме может выглядеть так:
function wppuzzle_set_custom_transient($key, $data, $expiration = 3600) {
set_transient('wppuzzle_' . $key, $data, $expiration);
}
function wppuzzle_get_custom_transient($key) {
return get_transient('wppuzzle_' . $key);
}
function wppuzzle_delete_custom_transient($key) {
delete_transient('wppuzzle_' . $key);
}
Это упрощает контроль и очистку transient с вашим префиксом.