Добавить в корзинуПозвонить
Найти в Дзене
Хроники Веба

От 100 запросов к одному: оптимизация выборки постов в WordPress за 3 шага

Бала задача, найти и исправить где и что грузит на одной определенной странице. Задача элементарная: есть массив с ID постов WordPress, нужно вывести их заголовки. Ничего сложного, любой новичок справится. И код, который мне был найден, действительно работал. На первый взгляд, все было нормально. Вот как он выглядел. <?php $post_ids = [1, 5, 12, 24, 35]; // Допустим, это наши ID echo '<ul>'; foreach ($post_ids as $id) {
    // На каждой итерации - новый запрос к БД
    $post_title = get_the_title($id);
    echo '<li>' . $post_title . '</li>'; } echo '</ul>'; ?> Код рабочий. К нему не придраться, если не знать, что происходит "под капотом". А происходит там очень плохая вещь. Функция get_the_title($id) для каждого ID в цикле лезет в базу данных. В нашем примере у нас пять ID, значит, будет пять отдельных запросов к базе. Если их будет сто, то и запросов будет сто. Это классическая проблема. На тестовом сайте это незаметно, но на живом проекте с большой посещаемостью такой подход полож

Бала задача, найти и исправить где и что грузит на одной определенной странице.

Задача элементарная: есть массив с ID постов WordPress, нужно вывести их заголовки. Ничего сложного, любой новичок справится. И код, который мне был найден, действительно работал. На первый взгляд, все было нормально.

Вот как он выглядел.

<?php
$post_ids = [1, 5, 12, 24, 35]; // Допустим, это наши ID
echo '<ul>';
foreach ($post_ids as $id) {
    // На каждой итерации - новый запрос к БД
    $post_title = get_the_title($id);
    echo '<li>' . $post_title . '</li>';
}
echo '</ul>';
?>

Код рабочий. К нему не придраться, если не знать, что происходит "под капотом". А происходит там очень плохая вещь. Функция get_the_title($id) для каждого ID в цикле лезет в базу данных. В нашем примере у нас пять ID, значит, будет пять отдельных запросов к базе. Если их будет сто, то и запросов будет сто. Это классическая проблема. На тестовом сайте это незаметно, но на живом проекте с большой посещаемостью такой подход положит сервер.

Именно этот момент и отличает подход специалиста от новичка. Новичок решает задачу в лоб: нужно получить заголовок для ID? Вот функция, ставим ее в цикл. Задача решена. Опытный разработчик думает о последствиях и нагрузке. Он знает, что лишние запросы к базе данных это зло.

Поэтому правильное решение выглядит иначе. Сначала мы получаем все нужные данные одним махом, а уже потом работаем с ними.

<?php

$post_ids = [1, 5, 12, 24, 35]; // Те же ID

// Один запрос, чтобы получить все посты сразу

$posts = get_posts([
    'post__in' => $post_ids,
    'posts_per_page' => -1 // Убедимся, что получим все посты

]);

echo '<ul>';

foreach ($posts as $post) {
    // Данные уже получены, просто выводим
    echo '<li>' . $post->post_title . '</li>';

}

echo '</ul>';

?>

И даже этот пример можно еще ускорить убрав из выборки пост_мета и таксономии.

Результат на экране будет абсолютно такой же. Но разница в производительности колоссальная. Вместо 100 запросов у нас всего один запрос на получение всех постов. Вся обработка дальше происходит уже без обращения к базе данных.

По факту, вся проблема сводилась к пониманию того, как работают функции WordPress и как устроена работа с базой. Новичок видит набор функций как черный ящик. Специалист понимает, какие из них ресурсоемкие, и старается использовать их с умом. Оптимизация запросов это не какая-то высшая математика, а базовый навык для любого, кто пишет код для реальных проектов.

Просто если пропустить такую мелочь здесь, то завтра она вылезет в другом месте, и в итоге мы получим медленный и нестабильный сайт.