wpcache.ru wordpress WPCache.ru

Кэширование REST API WooCommerce с использованием Transients API

Проблема: Медленная загрузка REST API WooCommerce из-за большого объема данных

REST API WooCommerce активно используется для получения данных товаров, заказов и пользователей. При большом количестве запросов и объемных ответах нагрузка на сервер сильно возрастает, что приводит к задержкам и замедлению работы сайта. Встроенного кэширования в WooCommerce REST API нет, поэтому необходима реализация кастомного кэширования.

Диагностика проблемы

Чтобы убедиться, что именно REST API WooCommerce замедляет сайт, выполните следующие действия:

  • Сделайте запрос к API, например, GET /wp-json/wc/v3/products, и замерьте время отклика (например, инструментом Postman или curl).
  • Отключите плагины кэширования и проверьте время ответа снова — если API работает медленно, проблема именно в серверной части.
  • Проверьте нагрузку на базу данных при выполнении запросов: в MySQL можно использовать SHOW PROCESSLIST; и мониторить медленные запросы.

Решение: Кэширование ответов REST API с помощью Transients API

Transients API позволяет сохранять данные в базе или в объектном кэше с заданным временем жизни. Используем его для кэширования результатов запросов к REST API WooCommerce.

1. Создание собственного эндпоинта с кэшированием

Пример кода для регистрации REST маршрута с кэшированием списка товаров:

add_action('rest_api_init', function () {
    register_rest_route('custom/v1', '/cached-products', array(
        'methods' => 'GET',
        'callback' => 'custom_cached_products',
        'permission_callback' => '__return_true',
    ));
});

function custom_cached_products(WP_REST_Request $request) {
    $cache_key = 'custom_cached_products';
    $cached = get_transient($cache_key);
    if ($cached !== false) {
        return rest_ensure_response(json_decode($cached, true));
    }

    $args = array(
        'limit' => 20,
        'status' => 'publish',
    );

    $products = wc_get_products($args);
    $data = [];
    foreach ($products as $product) {
        $data[] = [
            'id' => $product->get_id(),
            'name' => $product->get_name(),
            'price' => $product->get_price(),
        ];
    }

    set_transient($cache_key, wp_json_encode($data), HOUR_IN_SECONDS);

    return rest_ensure_response($data);
}

2. Очистка кэша при изменении товаров

Чтобы кэш не устаревал, нужно сбрасывать transient при обновлении или удалении товара:

add_action('save_post_product', function ($post_id) {
    delete_transient('custom_cached_products');
});

add_action('trashed_post', function ($post_id) {
    $post_type = get_post_type($post_id);
    if ($post_type === 'product') {
        delete_transient('custom_cached_products');
    }
});

Проверка результата после внедрения

  • Сделайте запрос к новому эндпоинту /wp-json/custom/v1/cached-products и замерьте время отклика — первое обращение будет сгенерировано, последующие — из кэша.
  • Измените товар, например, обновите описание, и снова сделайте запрос — убедитесь, что данные обновились и кэш сбросился.
  • Проверьте нагрузку на базу данных и время ответа API — они должны снизиться.

Частые ошибки и как исправить

  • Кэш не сбрасывается при обновлении товара: Проверьте, что хук save_post_product срабатывает, и нет ошибок в функции сброса transient.
  • Кэш хранит слишком устаревшие данные: Установите разумное время жизни cache (например, 1 час). Для часто меняющихся данных используйте более короткий TTL или отключайте кэш.
  • Проблемы с форматом данных: Всегда используйте wp_json_encode и json_decode с проверкой, чтобы избежать ошибок сериализации.
  • Плохая производительность из-за большого объема данных: Ограничьте количество товаров в кэше, используйте пагинацию или фильтры.

Практические советы по безопасности и производительности

  • Используйте permission_callback для ограничения доступа к кэшированному эндпоинту, если данные не должны быть публичными.
  • При наличии Redis или Memcached настройте объектный кэш для хранения transient, это существенно повысит производительность.
  • Для больших сайтов с высокой нагрузкой рассмотрите кэширование на уровне сервера (например, Varnish, NGINX FastCGI Cache) в дополнение к Transients API.
  • Используйте WP CLI команды для управления transient, например, wp transient delete custom_cached_products для ручной очистки.

Сравнение методов кэширования REST API WooCommerce

МетодПреимуществаНедостаткиПример кода
Transients API Простота реализации, встроенная поддержка WP Зависит от настроек объектного кэша, хранение в базе может замедлять БД Пример выше
Кэширование на уровне сервера (NGINX, Varnish) Высокая производительность, не нагружает PHP и БД Сложнее настройка, нет гибкости на уровне WP Конфигурация сервера
Плагины кэширования API (WP Rocket, Cache Enabler) Автоматизация, интеграция с WP Может конфликтовать с динамическими данными WooCommerce Стандартная настройка плагина
×

AI-плагин

WPGPT
Сам создает статьи для вашего сайта WordPress

SEO и мета-теги

Парсинг конкурентов

Изображения

Комментарии

Подробнее