Если сайт на WordPress стал заметно медленнее, а в профилировщике видно много одинаковых запросов к базе, проблема часто не в «тяжёлом хостинге», а в дублирующейся логике темы или плагинов. Типичный сценарий: один и тот же список записей, меню, мета-данные или настройки вытягиваются по нескольку раз в рамках одного запроса страницы.
Ниже разберём, как быстро подтвердить, что у вас именно дубли запросов, где искать источник и что можно исправить без переписывания всего проекта.
Как понять, что проблема именно в дублях запросов
Симптомы обычно не выглядят как явная ошибка. Сайт просто начинает дольше собирать страницу, а в админке или на фронтенде появляются лишние задержки. Особенно это заметно на страницах с большим количеством блоков, виджетов, связанных записей и кастомных полей.
Что проверить в первую очередь
- время генерации страницы растёт, хотя трафик не изменился;
- одна и та же страница в кэше и без кэша ведёт себя по-разному;
- в логах профилировщика видно повторяющиеся SQL-запросы с одинаковыми параметрами;
- после отключения одного плагина число запросов резко падает;
- в шаблоне есть несколько вызовов
WP_Queryилиget_posts()с одинаковыми аргументами.
Если у вас установлен Query Monitor, он быстро покажет повторяющиеся запросы и место, откуда они пришли. Это самый удобный способ не гадать, а смотреть на конкретный источник.
Диагностика: где искать дубли запросов
Начинать лучше не с кода, а с наблюдения. Сначала нужно понять, повторяется ли сам SQL, или повторяется вызов функции, которая каждый раз собирает один и тот же результат.
Проверка через Query Monitor
Откройте проблемную страницу, затем в панели Query Monitor посмотрите разделы с запросами к базе. Ищите одинаковые SQL-строки, которые выполняются много раз в одном запросе страницы. Если рядом указан один и тот же файл темы или плагина, источник уже почти найден.
Полезно смотреть не только на количество запросов, но и на контекст: это может быть запрос к wp_postmeta, повторный запрос меню, повторная загрузка настроек плагина или одинаковый WP_Query в нескольких шаблонах.
Быстрая проверка в коде темы
Если профилировщика нет, можно временно включить логирование запросов через SAVEQUERIES. Это не решение для продакшена, а диагностический инструмент. После проверки его нужно отключить, потому что он сам добавляет нагрузку.
// wp-config.php — только для диагностики на тестовой копии сайта
define( 'SAVEQUERIES', true );После этого можно вывести массив запросов и посмотреть повторы, но на практике удобнее использовать Query Monitor. Он сразу показывает, какие запросы повторяются и откуда они пришли.
Пошаговое решение: как убрать дубли запросов
Универсального «одной кнопкой» решения нет. Обычно приходится исправлять один из трёх сценариев: повторный вызов одного и того же WP_Query, отсутствие кэширования результата, либо лишние обращения к метаданным и опциям в цикле.
1. Не создавайте одинаковый WP_Query несколько раз
Если один и тот же список постов нужен в двух местах шаблона, не собирайте его заново. Сохраните результат в переменную и переиспользуйте его. Это простой способ убрать повторные запросы в рамках одной страницы.
$args = array(
'post_type' => 'post',
'posts_per_page' => 5,
'no_found_rows' => true,
);
$featured_posts = new WP_Query( $args );
if ( $featured_posts->have_posts() ) {
while ( $featured_posts->have_posts() ) {
$featured_posts->the_post();
// вывод карточки
}
wp_reset_postdata();
}
// Если тот же набор нужен ниже по шаблону — используйте тот же объект, а не создавайте новый.Обратите внимание на no_found_rows => true. Если вам не нужна пагинация, WordPress не должен считать общее число записей. Это не убирает дубли само по себе, но уменьшает лишнюю работу.
2. Кэшируйте тяжёлые выборки через transients
Если запрос дорогой и результат меняется не каждую секунду, имеет смысл сохранить его во временный кэш. Это особенно полезно для списков популярных записей, связанных материалов, сложных выборок по метаполям и таксономиям.
$cache_key = 'home_featured_posts_v1';
$posts = get_transient( $cache_key );
if ( false === $posts ) {
$posts = get_posts( array(
'post_type' => 'post',
'posts_per_page' => 5,
'no_found_rows' => true,
'fields' => 'ids',
) );
set_transient( $cache_key, $posts, HOUR_IN_SECONDS );
}
foreach ( $posts as $post_id ) {
echo esc_html( get_the_title( $post_id ) );
}Если данные зависят от публикаций, кэш нужно сбрасывать при сохранении поста, а не ждать истечения срока. Иначе вы получите не дубли запросов, а устаревший контент.
3. Не тяните одни и те же мета-данные в цикле без необходимости
Частая ошибка — внутри цикла по записям несколько раз вызывать get_post_meta() для одного и того же поста. WordPress кэширует мета-данные, но если логика размазана по шаблону, вы всё равно создаёте лишние обращения и усложняете отладку.
Лучше один раз собрать нужные значения и передать их в шаблонную часть. Если мета-данные нужны в нескольких местах, вынесите их в массив до вывода HTML.
4. Уберите повторные запросы из хуков и шаблонных частей
Иногда дубли появляются не в основном шаблоне, а в functions.php, виджетах, блоках или хуках вроде wp_head и the_content. Например, функция, которая должна один раз получить настройки, вызывается на каждом рендере блока.
Если функция возвращает один и тот же результат, добавьте статическую переменную внутри функции или вынесите результат в объектный кэш. Это особенно актуально для настроек темы и плагинов.
function wpeasy_get_theme_settings() {
static $settings = null;
if ( null === $settings ) {
$settings = get_option( 'my_theme_settings', array() );
}
return $settings;
}Сравнение подходов: что выбрать в реальном проекте
| Подход | Когда подходит | Минус |
|---|---|---|
| Исправить код темы | Одинаковый запрос вызывается в шаблоне несколько раз | Нужно править PHP и тестировать шаблоны |
| Кэш через transient | Дорогие выборки, которые меняются нечасто | Нужно продумать сброс кэша |
| Плагин оптимизации | Нужно быстро убрать часть дублей и мусора без разработки | Не решает архитектурные ошибки в теме |
Если проблема в системных дублях и чистке сайта, иногда проще использовать профильный инструмент вроде Clearfy Pro: https://wpshop.ru/plugins/clearfy. Но даже в этом случае сначала стоит понять, где именно рождаются лишние запросы, иначе вы просто замаскируете симптом.
Проверка результата после внедрения
После правок не ограничивайтесь ощущением «стало быстрее». Нужно проверить, что количество запросов действительно снизилось и что страница не потеряла функциональность.
Что смотреть после изменений
- число SQL-запросов на проблемной странице;
- повторяющиеся запросы в Query Monitor;
- время генерации страницы до и после;
- корректность вывода карточек, мета-данных и связанных материалов;
- не сломалась ли пагинация, если вы меняли
WP_Query.
Проверяйте не только главную страницу, но и те шаблоны, где раньше была проблема: архивы, одиночные записи, страницы с блоками и виджетами. Иногда дубли исчезают на главной, но остаются в сайдбаре или в шапке.
Частые ошибки и как их исправить
Отключили кэш и получили ложные выводы
Если тестируете на сервере без объектного кэша и без page cache, картина может отличаться от продакшена. Сначала фиксируйте проблему в одинаковых условиях, иначе легко сделать неверный вывод о причине дублей.
Слишком рано включили SAVEQUERIES на боевом сайте
Этот режим нужен для диагностики, а не для постоянной работы. На нагруженном сайте он сам увеличивает расход памяти и может исказить результаты. Используйте его на staging-копии или включайте кратковременно.
Кэшировали всё подряд без стратегии сброса
Transient без очистки при обновлении контента приводит к устаревшему выводу. Если кэш зависит от записей, сбрасывайте его через save_post или другой понятный триггер.
Искали проблему только в плагинах
Нередко источник дублей — тема, особенно если в ней несколько одинаковых шаблонных частей. Проверяйте не только активные плагины, но и дочернюю тему, кастомные блоки и код в functions.php.
Чек-лист перед выкладкой на продакшен
- сравнили количество запросов до и после правок;
- проверили проблемные шаблоны в Query Monitor;
- убрали повторные
WP_Queryи одинаковые выборки; - добавили кэш там, где данные не должны пересчитываться на каждом хите;
- отключили диагностические инструменты вроде
SAVEQUERIES; - протестировали пагинацию, фильтры и вывод мета-данных;
- очистили page cache и object cache, если они используются.
Когда стоит подключать плагин, а когда править код
Если дубли вызваны общей перегрузкой сайта, мусорными опциями, лишними скриптами и неаккуратной настройкой, плагин оптимизации может помочь быстро навести порядок. Но если запросы дублируются из-за архитектуры темы, никакой плагин не заменит правку шаблонов и хуков.
Практический критерий простой: если один и тот же SQL повторяется из одного и того же файла, сначала чините код. Если проблема размазана по нескольким плагинам и настройкам, начинайте с аудита и точечной оптимизации.