С ростом базы данных WordPress (более 50 000 записей в таблице wp_posts) стандартный класс WP_Query начинает генерировать тяжелые, неоптимальные SQL-запросы. Особенно критично это проявляется при использовании фильтрации по мета-полям (meta_query) и таксономиям (tax_query), которые вызывают ресурсоемкие операции JOIN на уровне СУБД MySQL. Без грамотной оптимизации время генерации страницы (TTFB) возрастает до нескольких секунд, что негативно сказывается на ранжировании сайта в поисковых системах.
Таблица wp_postmeta по умолчанию не имеет составных индексов для одновременного поиска по колонкам meta_key и meta_value. Каждое условие meta_query с оператором LIKE или сравнением чисел заставляет СУБД выполнять полное сканирование таблицы (Full Table Scan). Для оптимизации структуры необходимо полностью отказаться от тяжелых сравнений строк и использовать точечные выборки.
$args = [
'post_type' => 'product',
'meta_query' => [
[
'key' => '_is_featured',
'value' => '1',
'compare' => '='
]
],
'no_found_rows' => true,
'update_post_meta_cache' => false,
'update_post_term_cache' => false,
];
$query = new WP_Query($args);
По умолчанию WP_Query всегда вычисляет общее количество подходящих записей для построения пагинации, добавляя в SQL-запрос директиву SQL_CALC_FOUND_ROWS. На больших каталогах этот шаг заставляет MySQL сканировать весь индекс целиком, даже если в posts_per_page указано всего 10 товаров. Передача параметра 'no_found_rows' => true полностью отключает эту избыточную операцию, ускоряя выполнение запроса в несколько раз.
Для AJAX-фильтров и динамических блоков на бэкенде результаты тяжелых выборок необходимо сохранять в оперативную память сервера с помощью Persistent Object Cache (Redis или Memcached). Использование функций wp_cache_set() и wp_cache_get() позволяет снизить нагрузку на MySQL до нулевых значений при повторных заходах пользователей.
$cache_key = 'it_gig_featured_products';
$products = wp_cache_get($cache_key, 'products_group');
if (false === $products) {
$query = new WP_Query($args);
$products = $query->posts;
wp_cache_set($cache_key, $products, 'products_group', HOUR_IN_SECONDS);
}
При циклическом переборе постов через кастомные скрипты ядро WordPress непрерывно наполняет внутренний массив кэша мета-данных, что приводит к исчерпанию лимита выделенной памяти (Memory Limit) на сервере. Принудительное подавление кэширования связей с помощью флагов update_post_meta_cache и update_post_term_cache гарантирует стабильное потребление RAM в пределах безопасной нормы.