Функции wp_cache_* WordPress предоставляют уровень кэширования, который находится между вашим кодом и базой данных. По умолчанию WordPress использует кэш в памяти на каждый запрос (очищается в конце каждого запроса). С помощью постоянного бэкенда объектного кэша, такого как Redis или Memcached, кэш сохраняется между запросами — последующие просмотры страниц обращаются к кэшу вместо базы данных.
На сайте с высокой посещаемостью с Redis:
Для рабочих нагрузок с высокой нагрузкой на чтение это улучшение производительности в 10–100 раз.
Каждое значение поля, читаемое в Field Forge, проходит через объектный кэш:
«`php // Внутри реализации get_field() Field Forge (упрощенно) $cached = wp_cache_get($cache_key, ‘fieldforge’); if ($cached !== false) { return $cached; }
$value = $this->fetch_from_database($post_id, $field_name); wp_cache_set($cache_key, $value, ‘fieldforge’, 3600); return $value; «`
fieldforge:{post_id}:{field_name}fieldforge (отдельно от других плагинов)Когда значение поля обновляется или удаляется, Field Forge автоматически аннулирует соответствующие записи кэша:
«php // Внутри update_field() (упрощенно) $this->save_to_database($post_id, $field_name, $value); wp_cache_delete("fieldforge:{$post_id}:{$field_name}", 'fieldforge'); «
Аннулирование:
fieldforge/cache/invalidateField Forge работает с любым бэкендом объектного кэша WordPress:
Наиболее распространен для управляемого хостинга WordPress. Бесплатные плагины: «Redis Object Cache» или «W3 Total Cache» с включенным Redis. Обеспечивает постоянное кэширование между запросами.
Старый, но все еще поддерживаемый. Плагины: «Memcached» или «W3 Total Cache.»
Кэширование на одном сервере, которое быстрее, чем Redis/Memcached для сайтов с низким трафиком (без сетевых задержек). Плагины: «APCu Object Cache.»
Если постоянный бэкенд объектного кэша не установлен, Field Forge возвращается к стандартному кэшу WordPress на запрос. Кэширование все еще происходит в пределах одного просмотра страницы, но не между запросами. Работает везде, ноль конфигурации.
Для архивных страниц и списков, где вы отображаете много постов одновременно, Field Forge предоставляет API batch_load(), который извлекает пользовательские поля для нескольких постов в одном SQL-запросе:
«`php $post_ids = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]; FieldForge::batch_load($post_ids);
// Все последующие вызовы get_field() для этих идентификаторов постов обращаются к кэшу foreach ($post_ids as $id) { $hero_title = get_field(‘hero_title’, $id); // Попадание в кэш $hero_image = get_field(‘hero_image’, $id); // Попадание в кэш } «`
Без batch_load() вышеуказанное вызвало бы 20 отдельных SQL-запросов (10 постов × 2 поля каждый). С пакетной загрузкой это 1 запрос.
Field Forge подключается к фильтру WordPress the_posts, чтобы автоматически выполнять пакетную загрузку для любого запроса, который возвращает несколько постов:
«php // Внутренний хук Field Forge add_filter('the_posts', function($posts) { if (!empty($posts)) { $post_ids = wp_list_pluck($posts, 'ID'); FieldForge::batch_load($post_ids); } return $posts; }); «
Архивные страницы, результаты поиска, списки категорий и конечные точки списка REST API автоматически получают выгоду. Изменения в коде в вашей теме не требуются.
Для вызовов WP_Query в пользовательских шаблонах вы можете явно выполнить пакетную загрузку после запроса:
«`php $query = new WP_Query([ ‘post_type’ => ‘product’, ‘posts_per_page’ => 30, ‘category_name’ => ‘featured’, ]);
// Пакетная загрузка пользовательских полей для всех 30 продуктов в одном запросе if ($query->have_posts()) { $post_ids = wp_list_pluck($query->posts, ‘ID’); FieldForge::batch_load($post_ids); }
// Теперь рендеринг цикла — только попадание в кэш while ($query->have_posts()) : $query->the_post(); $price = get_field(‘price’); // Попадание в кэш $sku = get_field(‘sku’); // Попадание в кэш $features = get_field(‘features’); // Попадание в кэш endwhile; «`
На тестовом сайте с 10,000 постами, 15 пользовательскими полями на пост:
| Действие | Время |
|---|---|
| Просмотр страницы одного поста | 45ms запросов пользовательских полей |
| Архив (20 постов) | 840ms запросов пользовательских полей (N+1) |
| Категория WooCommerce (30 продуктов) | 1,260ms |
| Действие | Время |
|---|---|
| Просмотр страницы одного поста | 3ms (попадания в кэш) |
| Архив (20 постов) | 12ms (попадания в кэш) |
| Категория WooCommerce (30 продуктов) | 18ms |
| Действие | Время |
|---|---|
| Просмотр страницы одного поста | 12ms (1 запрос + заполнение кэша) |
| Архив (20 постов) | 95ms (1 пакетный запрос + заполнение кэша) |
| Категория WooCommerce (30 продуктов) | 142ms (1 пакетный запрос + заполнение кэша) |
Сочетание объектного кэша и пакетной загрузки имеет драматический эффект на сайтах с высокой посещаемостью.
Field Forge предоставляет команды WP-CLI для мониторинга производительности кэша:
«`bash
wp fieldforge cache stats
«`
Для сайтов, где уровень попадания в кэш низкий (ниже 80%), исследуйте:
«php add_filter('fieldforge/cache/expiration', function($seconds) { return DAY_IN_SECONDS; // Кэш на 24 часа }); «
«php add_filter('fieldforge/cache/should_cache', function($should_cache, $field_group) { if ($field_group === 'frequently-changing-group') { return false; } return $should_cache; }, 10, 2); «
«php add_action('fieldforge/cache/invalidate', function($post_id, $field_name) { // Также аннулировать связанные данные wp_cache_delete("my_custom_cache:{$post_id}", 'my_plugin'); }, 10, 2); «
Получите Field Forge — от $35/год →
Интеграция объектного кэша и пакетная загрузка доступны в каждой версии Field Forge, включая бесплатную.