background gradient
s2 - IT photo №27611

Как «post__not_in» замедляет ваш сайт?

Вы используйте аргумент post__not_in для исключения постов? Фатальная ошибка!

Аргумент WP_Query post__not_in кажется полезным, но представьте себе, он может привести к увеличению скорости загрузки вашего блога.

post__not_in используется для исключения записей из результатов запроса. Например, у вас цикл, который показывает 5 свежих записей на странице открытого поста - к примеру как страница которую вы сейчас читаете, то вам не нужно выводить текущий пост в результате похожих постов, поскольку вы уже читает эту статью.

Ваш цикл с post__not_in

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

function the_recent_news($exclude = []) {
  $args = array(
    'category_name' => 'news',
    'post_type' => 'articles',
    'posts_per_page' => 5,
    'post_status' => 'publish',
    'post__not_in' => $exclude
  );
  $result_posts = new WP_Query($args);
  
  echo '<div class="recent-news"><h1>News:</h1>';
    while ($result_posts->have_posts()) {
      $result_posts->the_post();
      the_title('<h2><a href="' . get_permalink() . '">', '</a></h2>');
    }
  echo '</div>';
  wp_reset_postdata();
}
  // Вызов
the_recent_news([get_the_ID()]);

При вызове нашей функции она выведет 5 последних записей без текущего поста. Это легко, но пагубно влияет на скорость.

Почему post__not_in вреден?

Запрос, который раньше использовал встроенный кеш запросов, теперь "Уникален" для каждой страницы, на которой вызывается функция )"]. Благодаря добавлению AND ID not in ( '777' ) в SQL запрос.

Это как подъём гантелей в мире программирования - если не распределить нагрузку, можно получить 'мышечное завтра' для компьютера!

Это связано с тем, что ключ кэша, который представляет собой хеш аргументов, теперь включает список как минимум из одного идентификатора, и он разный для всех страниц.

К примеру так выглядит хеш при выводе постов post_type_article. Он кешируется при первом вызове и в дальнейшем будет показываться из кеша. Но при добавлении post__not_in мы имеем фактор уникальности в виде исключаемого ID поста и хеш на странице "777" будет выглядит так:  post_type_article_not_in_777

Из-за примера выше, вместо того чтобы остальные страницы получали список из кэша объектов, он пропустит кеш, и база данных будет выполнять ту же работу на нескольких страницах.

В результате каждый из этих запросов теперь кэшируется отдельно.

Как исправить плохой цикл?

Для повышения скорости загрузки сайта рекомендую использовать единообразие запроса, post__not_in заменить на проверку в результате цикла.

Используйте в posts_per_page фиксированное число а не переменную, чтобы уменьшить количество вариантов кеша.
Мы увечили posts_per_page до 6, т.к 1 из постов будет убран

Обновленная функция исключает пост в ходе цикла а не исключает его в SQL, пример:

function the_recent_news($exclude = []) {
  $args = array(
    'category_name' => 'news',
    'post_type' => 'articles',
    'posts_per_page' => 6,
    'post_status' => 'publish',
  );
  $result_posts = new WP_Query($args);
  echo '<div class="recent-news"><h1>News:</h1>';
  $i = 0;
  while ( $result_posts->have_posts() and $i < 5 ) { 
    $result_posts->the_post(); 
    $post_id = get_the_ID(); 
    if ( ! in_array( $post_id, $exclude ) ) { 
      the_title( '<h2><a href="' . get_permalink() . '">', '</a></h2>'); 
      $i++; 
    } 
  }
  echo '</div>';
  wp_reset_postdata();
}
// Вызов
the_recent_news([get_the_ID()]);

Не смотря на увеличение количества кода и требование логики PHP, наш метод лучше т.к он использует кеш запросов и позволяет избежать создания множества вариантов кеша, которые могут повлиять на масштабируемость и стабильность сайта.

Часто задаваемые вопросы (FAQ)

Что такое аргумент post__not_in в wp_query?

Аргумент post__not_in в WordPress используется для исключения определенных записей из результатов запроса.

Добавить комментарий

Навигация:

Похожие

21437004-cf3d-4d35-aa13-82183efb2955_11zon - IT photo №28678
8 1
02 Окт 2024

В $_GET отсутствуют utm_source, как получить метки в php

Многие сталкиваются с проблемой, когда UTM-метки не передаются полностью через $_GET или $_SERVER. Почему это происходит? Проблема кроется в особенностях парсинга URL. «Не могу получить все UTM-метки из адреса. utm_source и utm_medium обрезаются.» Решения Проверьте URL. Убедитесь, что все параметры правильно закодированы. Используйте parse_str. Эта функция поможет корректно разобрать строку запроса. Проверьте сервер. Некоторые настройки […]

PHPSEO
1727257446_ms_elementor_pro_1_тыс_изображений_найдено_в_Яндекс_К-min - IT photo №28572
8 1
25 Сент 2024

Как работает хук new_record в плагине Elementor

Разберем action new_record и список всех данных с примерами кода которые можно получить из $record. Хук elementor_pro/forms/new_record вызывается при успешной отправке формы, созданной с помощью Elementor Pro. Он позволяет разработчикам вмешиваться в процесс обработки формы, добавляя пользовательскую логику или изменяя данные, прежде чем они будут сохранены или отправлены по email. Хук передает два параметра: $record […]

Elementor
1725015979_ms_function.php_-_kakdela_-_Visual_Studio_Code_[Админ-min - IT photo №28453
19 3
30 Авг 2024

Самый быстрый поиск по Загловку в WordPress

Функция get_page_by_title() устарела, и WordPress предлагает использовать медленный запрос WP_Query с параметром s. wp_query медленный, ресурсоемкий и может негативно повлиять на работу вашего сайта, особенно если у вас большая база данных из 700.000 постов. Вы можете использовать мою функцию для поиска по заголовку значительно быстрее и эффективнее. При этом код будет защищен от SQL-инъекций и других […]

Wordpress
fatores-de-ranqueamento-seo-2 - IT photo №28386
45 1
14 Апр 2024

PHP регулярка для удаления блока вместе с содержимым

В этой заметке покажу вам PHP код с использованием регулярных выражений для удаления блока вместе с его содержимым. Этот код выполняет следующие действия: preg_replace('/<li class="js-oglav-after js-oglav-psy".*?<\/li>/is', '', $content); — Удаляет все блоки <li> с классом "js-oglav-after js-oglav-psy" вместе со всем их содержимым из переменной $content. preg_replace('/<div style="padding: 30px 0 0 0".*?<\/div>/is', '', $content); — Удаляет […]

PHPSEOWordpress
1713081126_ms_chrome_tKr95u9sMx-min - IT photo №28384
40
14 Апр 2024

Код для удаления emoji в wordpress

WordPress по умолчанию включает поддержку эмодзи, для ускорения сайта их можно удалить. В этой статье мы рассмотрим, как удалить эмодзи в WordPress.   Для удаления эмодзи мы можем использовать несколько хуков и фильтров. Добавьте этот код в файл functions.php вашей темы или в плагина: Что делает код? remove_action('wp_head', 'print_emoji_detection_script', 7); — Удаляет скрипт, который обнаруживает […]

PHPWordpress
1713080563_ms_chrome_pepnRwEuKf-min - IT photo №28380
44
14 Апр 2024

Функция get_gravatar чтобы получить аватарку с gravatar в PHP.

Для вывода картинки с граватара нужно создать функцию, которая будет генерировать URL аватарки на основе email адреса пользователя. Вот пример такой функции: Разберем эту функцию: $email — email адрес пользователя, для которого мы хотим получить аватарку. $size — размер аватарки в пикселях (от 1 до 2048). $default — URL изображения, если не найдена аватарка на […]

PHPWordpress