Повышение производительности запросов в 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;
}
// здесь сама логика;
}
Я делал так для пагинации, поэтому еще дополнительно вычислял
offset
. Да, метод хорошПрирост очень сильно заметен на высоконагруженных страницах — прям сильно заметен!
А как правильно сделать с таким кодом по Вашему примеру
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() ) :
posts_per_page = 6
(на одну больше, чем требуется)и в цикле
if ( $post->ID === get_the_ID() ) { continue; }
Ну и еще потребуется дополнительная проверка: если нам в наборе попался наш текущий ID, то использовать шестой элемент, если нет, то шестой не использовать.
Игорь, спасибо за дополнение!