В современном развитии WordPress REST API является мощным инструментом для взаимодействия с сайтом из внешних приложений и фронтенда на JavaScript. Однако при большом количестве запросов к REST API может значительно увеличиваться нагрузка на сервер, что замедляет работу сайта и ухудшает пользовательский опыт. В этой статье мы подробно разберем, как создать автоматический кеш для REST API в WordPress, чтобы ускорить работу и снизить нагрузку.
Почему кеширование REST API важно для производительности
REST API предоставляет данные в формате JSON, которые часто используются в динамичных интерфейсах и мобильных приложениях. Каждый запрос к API — это нагрузка на сервер и базу данных. При отсутствии кеширования каждый вызов обрабатывается «с нуля», что может быть ресурсоемко. Особенно это важно при пиковых нагрузках или когда API вызывается часто.
Автоматический кеш позволяет хранить уже сформированные ответы на определённое время, возвращая их из кеша вместо повторного выполнения тяжелых запросов. Это снижает время отклика, уменьшает нагрузку на сервер и улучшает масштабируемость.
WordPress не предоставляет кеширование REST API «из коробки», поэтому его нужно реализовывать самостоятельно, используя возможности транзиентов, объектного кеша или внешних систем кеширования.
Создаем базовую систему кеширования REST API с помощью транзиентов
Транзиенты в WordPress — это удобный способ временного хранения данных с определенным сроком жизни. Рассмотрим, как применить транзиенты для кеширования ответа вашего REST API эндпоинта.
Допустим, у нас есть кастомный REST API маршрут /wp-json/wpdevelop/v1/products, который возвращает список товаров. Мы хотим кешировать результат на 10 минут.
Регистрация REST API с кешированием через транзиенты
add_action('rest_api_init', function() {
register_rest_route('wpdevelop/v1', '/products', [
'methods' => 'GET',
'callback' => 'wpdevelop_get_products_cached',
]);
});
function wpdevelop_get_products_cached() {
$cache_key = 'wpdevelop_products_cache';
$cached = get_transient($cache_key);
if ($cached !== false) {
return rest_ensure_response(json_decode($cached));
}
// Получаем данные из базы
$args = [
'post_type' => 'product',
'posts_per_page' => 10,
'post_status' => 'publish',
];
$query = new WP_Query($args);
$products = [];
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$products[] = [
'id' => get_the_ID(),
'title' => get_the_title(),
'link' => get_permalink(),
];
}
wp_reset_postdata();
}
$response = wp_json_encode($products);
// Сохраняем кеш на 10 минут
set_transient($cache_key, $response, 10 * MINUTE_IN_SECONDS);
return rest_ensure_response($products);
}В этом примере:
- Сначала мы пытаемся получить данные из транзиента
wpdevelop_products_cache. - Если кеш есть, сразу возвращаем его, декодировав из JSON.
- Если кеша нет, выполняем запрос к базе, формируем массив товаров, кодируем в JSON и сохраняем в кеш.
- Кеш хранится 10 минут, после чего автоматически обновляется при следующем запросе.
Преимущества такого подхода
Использование транзиентов просто в реализации и не требует внешних библиотек. При активном объектном кеше WordPress транзиенты работают быстро. Для сайтов с умеренной нагрузкой это отличный способ снизить нагрузку на сервер.
Кеширование с учетом параметров запроса и сброс кеша
В реальных случаях REST API часто принимает параметры (например, фильтры, пагинацию). Нужно учитывать эти параметры, чтобы кешировать уникальные запросы отдельно.
Например, если у нас есть параметр category, который фильтрует товары по категории, кеш ключ должен учитывать его:
function wpdevelop_get_products_cached(WP_REST_Request $request) {
$category = $request->get_param('category');
$cache_key = 'wpdevelop_products_cache_' . md5($category);
// далее по аналогии
}Также важно предусмотреть механизм сброса кеша при изменении данных — при обновлении товара, удалении или добавлении. Это можно делать через хуки WordPress, например:
function wpdevelop_clear_products_cache() {
global $wpdb;
// Удаляем все транзиенты, начинающиеся с wpdevelop_products_cache_
$sql = "DELETE FROM {$wpdb->options} WHERE option_name LIKE '_transient_wpdevelop_products_cache_%'";
$wpdb->query($sql);
}
add_action('save_post_product', 'wpdevelop_clear_products_cache');
add_action('delete_post', 'wpdevelop_clear_products_cache');Такой подход гарантирует, что кеш всегда содержит актуальные данные.
Использование плагинов для кеширования REST API
Если вы не хотите писать собственный кеш, можно использовать готовые решения. Например, плагин REST API Cache автоматически кеширует ответы API, поддерживая разные методы кеширования, включая объектный кеш, файловый кеш и кеш в базе данных.
Еще один вариант — использовать универсальные кеширующие плагины, такие как Clearfy Pro (подробнее на WPSHOP), которые имеют дополнительные настройки оптимизации и могут кешировать API-запросы.
Преимущество плагинов — простота настройки и готовые интерфейсы для управления кешем и сроками жизни.
Кеширование REST API с использованием внешнего кеша Redis или Memcached
Для крупных проектов и высоконагруженных сайтов рекомендуют использовать внешние кеш-системы, такие как Redis или Memcached. Они обеспечивают быструю работу кеша в памяти и позволяют масштабировать нагрузку.
WordPress поддерживает интеграцию с Redis через плагин Redis Object Cache. Для кеширования REST API можно использовать объектный кеш, если он настроен на Redis.
Пример кеширования с использованием объектного кеша:
function wpdevelop_get_products_cached_objcache(WP_REST_Request $request) {
$category = $request->get_param('category');
$cache_key = 'wpdevelop_products_cache_' . md5($category);
$cached = wp_cache_get($cache_key, 'wpdevelop');
if ($cached !== false) {
return rest_ensure_response($cached);
}
// Запрос данных
$args = [
'post_type' => 'product',
'posts_per_page' => 10,
'post_status' => 'publish',
];
if ($category) {
$args['tax_query'] = [[
'taxonomy' => 'product_cat',
'field' => 'slug',
'terms' => $category,
]];
}
$query = new WP_Query($args);
$products = [];
if ($query->have_posts()) {
while ($query->have_posts()) {
$query->the_post();
$products[] = [
'id' => get_the_ID(),
'title' => get_the_title(),
'link' => get_permalink(),
];
}
wp_reset_postdata();
}
// Сохраняем в объектном кеше на 10 минут
wp_cache_set($cache_key, $products, 'wpdevelop', 10 * MINUTE_IN_SECONDS);
return rest_ensure_response($products);
}При использовании Redis или Memcached кеш работает быстрее, чем транзиенты, и подходит для больших проектов.
Заключение по теме кеширования REST API
Кеширование REST API — обязательный этап при разработке быстрых и масштабируемых приложений на WordPress. В статье показаны разные подходы: от простых транзиентов до интеграции с Redis. Выбор зависит от нагрузки и требований проекта.
Если хотите начать быстро, используйте транзиенты с правильным сбросом кеша. Для более серьезных проектов — настройте внешний кеш и применяйте объектный кеш.
Для удобства управления кешем можно использовать плагины, такие как Clearfy Pro (подробнее на WPSHOP), которые значительно упрощают оптимизацию и кеширование.