В WordPress часто возникает задача временного сохранения данных, чтобы снизить нагрузку на базу данных и ускорить загрузку страниц. Для этого идеально подходит Transients API — встроенный механизм кэширования с автоматическим сроком хранения. В этой статье подробно разберём, как правильно использовать транзиенты в WordPress, рассмотрим примеры кода и лучшие практики.
Что такое Transients в WordPress и зачем они нужны
Transients — это временные опции с ограниченным сроком жизни. Они позволяют сохранять данные в базе данных или объектном кэше на заданное время. Это удобно, когда нужно кешировать результаты сложных запросов, данные из внешних API или любые другие тяжёлые для получения значения. После истечения срока хранения транзиент автоматически удаляется.
Основные преимущества использования транзиентов:
- Снижение количества запросов к базе данных;
- Ускорение загрузки страниц;
- Автоматическое удаление устаревших данных;
- Простота использования благодаря встроенным функциям WordPress.
Основные функции Transients API в WordPress
Для работы с транзиентами используются три основные функции:
wproot_set_transient($transient, $value, $expiration)— сохраняет транзиент с именем$transient, значением$valueи временем жизни$expirationв секундах.wproot_get_transient($transient)— получает значение транзиента илиfalse, если срок истёк или транзиент не найден.wproot_delete_transient($transient)— удаляет транзиент по имени.
Приведём пример реализации этих функций с префиксом wproot_ для избежания конфликтов:
function wproot_set_transient($transient, $value, $expiration) {
return set_transient($transient, $value, $expiration);
}
function wproot_get_transient($transient) {
return get_transient($transient);
}
function wproot_delete_transient($transient) {
return delete_transient($transient);
}Пример использования транзиентов для кэширования результатов WP_Query
Предположим, нам нужно вывести последние 5 публикаций определённой категории, но мы не хотим каждый раз выполнять тяжелый запрос к базе. Используем транзиенты для кэширования результата на 1 час.
function wproot_get_cached_posts() {
$cache_key = 'wproot_latest_posts_cat5';
$posts = wproot_get_transient($cache_key);
if ($posts === false) {
$query = new WP_Query([
'posts_per_page' => 5,
'category_name' => 'news',
'post_status' => 'publish',
]);
if ($query->have_posts()) {
$posts = $query->posts;
wproot_set_transient($cache_key, $posts, HOUR_IN_SECONDS);
} else {
$posts = [];
}
}
return $posts;
}Теперь при вызове wproot_get_cached_posts() запрос к базе будет выполняться не чаще одного раза в час.
Выводим кэшированные посты в шаблоне
Чтобы вывести заголовки постов, можно использовать следующий код:
$posts = wproot_get_cached_posts();
if (!empty($posts)) {
echo '<ul>';
foreach ($posts as $post) {
echo '<li>' . esc_html(get_the_title($post)) . '</li>';
}
echo '</ul>';
} else {
echo 'Публикаций не найдено.';
}Кэширование данных из внешних API с помощью транзиентов
Частая задача — получить данные из стороннего API и не перегружать сайт частыми запросами. Транзиенты отлично подходят для этой цели.
Рассмотрим пример получения курса валют с сайта fixer.io, кэшируя результат на 12 часов:
function wproot_get_exchange_rates() {
$cache_key = 'wproot_exchange_rates';
$rates = wproot_get_transient($cache_key);
if ($rates === false) {
$response = wp_remote_get('https://api.fixer.io/latest?base=USD');
if (is_wp_error($response)) {
return false;
}
$data = json_decode(wp_remote_retrieve_body($response), true);
if (isset($data['rates'])) {
$rates = $data['rates'];
wproot_set_transient($cache_key, $rates, 12 * HOUR_IN_SECONDS);
} else {
$rates = false;
}
}
return $rates;
}Такой подход позволяет существенно снизить количество внешних запросов и повысить стабильность работы сайта.
Особенности и подводные камни при работе с транзиентами
Несмотря на удобство, есть нюансы, которые следует учитывать:
- Автоматическое удаление: транзиенты автоматически удаляются по истечении времени, но если кэш не используется, могут остаться в базе.
- Объём данных: не стоит хранить слишком большие данные, чтобы не перегружать базу.
- Объектный кэш: если на сервере настроен объектный кэш (например, Redis или Memcached), транзиенты работают быстрее и не записываются в базу.
- Безопасность: при сохранении данных учитывайте, что транзиенты доступны глобально, поэтому не храните конфиденциальную информацию.
Удаление транзиентов вручную
Для удаления транзиентов можно использовать функцию wproot_delete_transient($transient). Это полезно, если нужно сбросить кэш после обновления данных.
// Сброс кэша при сохранении поста
add_action('save_post', function($post_id) {
wproot_delete_transient('wproot_latest_posts_cat5');
});Рекомендации по использованию транзиентов
Чтобы транзиенты приносили максимальную пользу, придерживайтесь следующих советов:
- Используйте уникальные и осмысленные имена с префиксом для избежания конфликтов.
- Ставьте адекватное время жизни в зависимости от частоты обновления данных.
- Не храните в транзиентах объекты WP_Query или WP_Post, лучше сохраняйте массивы или простые данные.
- При необходимости очищайте кэш вручную после изменений.
- Проверяйте наличие объектного кэша на сервере для повышения производительности.
Если вы хотите расширить функционал своего сайта, обратите внимание на плагин Clearfy Pro, который оптимизирует работу WordPress, в том числе помогает управлять кэшированием и ускорять загрузку страниц.