Функция get_transient()
в WordPress используется для получения временных данных, которые были сохранены с помощью функции set_transient()
. Она позволяет кэшировать данные и тем самым сокращать количество запросов к базе данных или API, что может значительно ускорить загрузку страниц. В отличие от get_site_transient()
, get_transient()
работает на уровне одного сайта и подходит для одиночных установок WordPress.
get_transient( string $transient ): mixed
Функция get_transient()
возвращает значение временной опции (транзиента), если оно существует и не истекло. Если транзиент не существует или истек, функция вернет false
. При использовании транзиентов важно учитывать, что они могут быть автоматически удалены WordPress, если на сайте включено объектное кэширование.
Примечание: Если транзиент отсутствует, функция не создает его автоматически — вместо этого она возвращает
false
. Проверка наfalse
должна проводиться с помощью оператора строгого равенства (===
), чтобы избежать ошибок, связанных с пустыми значениями.
Параметры функции
$transient
(string): Название транзиента, значение которого требуется получить. Название не должно быть SQL-экранировано.
Возвращаемое значение
- mixed: Возвращает значение транзиента, если оно существует и не истекло, или
false
, если транзиент отсутствует или просрочен.
Пример 1: Кэширование результатов сложного запроса WP_Query
В этом примере мы используем транзиенты для кэширования результата запроса WP_Query. Такой подход полезен, если на странице используется тяжелый запрос к базе данных, и мы хотим снизить нагрузку.
// Проверяем наличие закэшированного результата
$special_query_results = get_transient( 'special_query_data' );
if ( false === $special_query_results ) {
// Если данных нет в кэше, выполняем запрос и сохраняем результат
$special_query_results = new WP_Query( array(
'category_name' => 'technology',
'posts_per_page' => 5,
'orderby' => 'rand'
) );
// Сохраняем результат запроса на 12 часов
set_transient( 'special_query_data', $special_query_results, 12 * HOUR_IN_SECONDS );
}
// Используем данные, как обычно
if ( $special_query_results->have_posts() ) {
while ( $special_query_results->have_posts() ) {
$special_query_results->the_post();
the_title( '<h2>', '</h2>' );
}
wp_reset_postdata();
}
Пример 2: Кэширование данных из внешнего API
Допустим, мы получаем данные из внешнего API, которые обновляются нечасто. Чтобы минимизировать количество запросов, мы сохраняем результат в транзиент и обновляем его только при истечении срока действия.
$transient_key = 'external_api_data';
$api_data = get_transient( $transient_key );
if ( false === $api_data ) {
// Получаем данные из API
$response = wp_remote_get( 'https://api.example.com/data' );
if ( !is_wp_error( $response ) ) {
$api_data = wp_remote_retrieve_body( $response );
// Сохраняем данные на один день
set_transient( $transient_key, $api_data, DAY_IN_SECONDS );
}
}
// Выводим данные из API
echo $api_data;
Пример 3: Кэширование часто запрашиваемых пользовательских данных
В следующем примере кэшируются данные о популярных продуктах магазина. Это особенно полезно, если у вас есть сложный SQL-запрос или вы обрабатываете большое количество данных.
$popular_products = get_transient( 'top_products_data' );
if ( false === $popular_products ) {
global $wpdb;
// Выполняем сложный SQL-запрос для получения популярных продуктов
$popular_products = $wpdb->get_results( "
SELECT * FROM wp_products
WHERE product_status = 'active'
ORDER BY sales DESC
LIMIT 10
" );
// Кэшируем данные на 6 часов
set_transient( 'top_products_data', $popular_products, 6 * HOUR_IN_SECONDS );
}
// Используем данные для вывода на страницу
foreach ( $popular_products as $product ) {
echo "<p>Продукт: {$product->name}</p>";
}
Важные замечания
- Длина имени транзиента: Имя транзиента должно быть длиной 172 символа или меньше, так как WordPress добавляет префиксы
"_transient_"
и"_transient_timeout_"
, что увеличивает длину строки. Длинные имена могут вызвать ошибки. - Удаление устаревших транзиентов: WordPress автоматически удаляет истекшие транзиенты при их обращении через
get_transient()
, но не делает этого самостоятельно. Используйте функциюdelete_transient()
для явного удаления. - Объектное кэширование: Если включено объектное кэширование, транзиенты будут извлекаться из кэша, а не из базы данных. Это может повлиять на данные, если кэш обновляется вручную или внешними инструментами.
Заключение
Функция get_transient()
— мощный инструмент для кэширования данных в WordPress. Она помогает оптимизировать запросы и ускорить сайт, особенно при использовании на часто посещаемых страницах или в сложных запросах.