Исключить ID записи из wp_query

14 сент. 2012 г., 16:08:54
Просмотры: 197K
Голосов: 46

Как я могу исключить одну конкретную запись из запроса WP_Query? (Например, показать все записи, кроме записи с ID 278)

Я пробовал использовать аргумент post__not_in, но он просто удаляет все записи..

Буду благодарен за любую помощь.

Вот мой текущий запрос

<?php
    // Сохраняем текущий запрос во временную переменную
    $temp = $wp_query;
    $wp_query= null;
    $wp_query = new WP_Query(array(
        'post_type' => 'case-study',
        'paged' => $paged,
    ));
    while ($wp_query->have_posts()) : $wp_query->the_post();
?>

Спасибо

0
Все ответы на вопрос 4
4
92

Параметр, который вам нужен, это post__not_in (у kaiser в ответе опечатка). Код может выглядеть так:

<?php
$my_query = new WP_Query(array(
    'post__not_in' => array(278),
    'post_type' => 'case-study',
    'paged' => $paged,
));
while ($my_query->have_posts()) : $my_query->the_post(); endwhile;

Документация по post__not_in в WP_Query

10 мая 2013 г. 12:01:08
Комментарии

Знаешь, есть [редактирование] для исправления опечаток :)

kaiser kaiser
12 окт. 2014 г. 16:25:23

@Ziki запятая в массиве — это не опечатка, а валидный синтаксис PHP, если ты об этом.

Leo Leo
21 июн. 2017 г. 21:17:14

@leonziyo - нет, изначально у него было "posts__not_in" вместо "post__not_in", смотри историю его ответа. Запятая в порядке

Jan Zikmund Jan Zikmund
23 июн. 2017 г. 00:15:40

@Ziki Не уверен, что оценил бы кому :D

kaiser kaiser
5 окт. 2020 г. 01:38:49
0
20

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

<?php
$query = new WP_Query( array(
    'post_type'    => 'case-study',
    'paged'        => $paged,
    'post__not_in' => array( 1, ),
) );
if ( $query->have_posts() ) {
while ( $query->have_posts() ) {
    $query->the_post();

    // выполнить действия

} // endwhile;
} // endif;
?>
14 сент. 2012 г. 16:55:50
2
18

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

<?php
$args1 = array('category_name' => 'test-cat-1', 'order' => 'ASC');
$q1 = new WP_query($args);
if($q1->have_posts()) :
$firstPosts = array();
    while($q1->have_posts()) : $q1->the_post();
        $firstPosts[] = $post->ID; // добавляем ID записи в массив
        echo '<div class="item">';
        echo "<h2>" . get_the_title() . "</h2>";
        echo "</div>";
    endwhile;
endif;
/****************************************************************************/
// массив ID записей, собранных в первом цикле, теперь может быть использован как значение параметра 'post__not_in' в запросе второго цикла
$args2 = array('post__not_in' => $firstPosts, 'order' => 'ASC' );
$q2 = new WP_query($args2);
if($q2->have_posts()) :
    while($q2->have_posts()) : $q2->the_post();
        echo '<div class="item">';
        echo "<h2>" . get_the_title() . "</h2>";
        echo "</div>";
    endwhile;
endif;
?>

Первый цикл выводит все записи из категории и собирает их ID в массив.

Второй цикл выводит все записи, исключая те, которые были в первом цикле.

14 сент. 2012 г. 21:20:26
Комментарии

Кстати, есть ли способ добавить wp-pagenavi ко второму запросу?

Dean Elliott Dean Elliott
16 сент. 2012 г. 01:21:19

Если вы когда-нибудь вернётесь к своему ответу: пожалуйста, исправьте разметку/отступы в коде. Спасибо.

kaiser kaiser
12 окт. 2014 г. 16:27:18
0

Альтернативные коды:

Исключить записи категории

<?php
add_action('pre_get_posts', 'exclude_category_posts');
function exclude_category_posts( $query ) {
    if($query->is_main_query() && $query->is_home()) {
        $query->set('cat', array( -22, -27 ));
    }
}

Удалить записи с главной страницы

<?php
add_action('pre_get_posts', 'wpsites_remove_posts_from_home_page');
function wpsites_remove_posts_from_home_page( $query ) {
    if($query->is_main_query() && $query->is_home()) {
        $query->set('category__not_in', array(-1, -11));
    }
}
22 мар. 2019 г. 13:05:21