Верх страницы
Обложка к записи Повышение производительности запросов в WordPress путем удаления post__not_in
Время для прочтения: 0 мин. 33 сек.

Повышение производительности запросов в WordPress путем удаления post__not_in

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

Вместо такого кода, например:

$array_of_post_ids_to_skip = array(
    1,
    7,
    29,
);

$limit = 16;

$other_posts_in_tag = get_posts( array(
    'tag_id'           => $tag_id,
    'posts_per_page'   => $limit,
    'post__not_in'     => $array_of_post_ids_to_skip,
    'suppress_filters' => false,
));
 
foreach ( $other_posts_in_tag as $post ){
    // здесь сама логика;
}

Можно сделать такой хак — взять постов больше на размер массива $array_of_post_ids_to_skip и потом уже в цикле на PHP отбросить исключаемые посты:

$array_of_post_ids_to_skip = array(
    1,
    7,
    29,
);

$limit = 16;

$other_posts_in_tag = get_posts( array(
    'tag_id'           =>  $tag_id,
    'posts_per_page'   => $limit + count( $array_of_post_ids_to_skip ),
    'suppress_filters' => false,
));
 
foreach ( $other_posts_in_tag as $post ){
    if ( in_array( $post, $array_of_post_ids_to_skip ) ){
        continue;
    }
    // здесь сама логика;
}

Ссылки

ВКонтакте
Одноклассники
Linkedin
Telegram
WhatsApp

Комментарии
Подписаться
Уведомить о
guest
6 комментариев
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии
Игорь Тронь
2 лет назад

Я делал так для пагинации, поэтому еще дополнительно вычислял offset. Да, метод хорош

Admirus
Admirus
2 лет назад

А как правильно сделать с таким кодом по Вашему примеру

global $wp_query;

   $svifi = get_the_title();

   $pag = (isset($_GET[‘pages’])) ? $_GET[‘pages’] : 1;

   $args = ( array(

   ‘s’ => $svifi,

   ‘sentence’ => true,

   ‘posts_per_page’ => 5, // сколько похожих постов нужно вывести,

   ‘post_type’ => ‘post’,

   ‘paged’ => $pag,

   ‘post__not_in’ => array($post->ID), //Не выводить текущую запись

   ‘orderby’=>date, // Условие сортировки рандом

) );

$my_query = new WP_Query( $args );

if( $my_query->have_posts() ) :

phpinfo()
Игорь Тронь
2 лет назад
Ответить на  Admirus

Ну и еще потребуется дополнительная проверка: если нам в наборе попался наш текущий ID, то использовать шестой элемент, если нет, то шестой не использовать.