WordPress: Exclude post by ID from main loop

Рубрика: Development | 13 December 2008, 23:33 | Vadim Voituk

Очень часто в wordpress, при получении списка заметок посредством создания WP_Query, нужно исключить одну или несколько, с определенными “магическими” ID.

Документация на codex.wordpress.org по этому поводу молчит. Взамен предлагается исключать только заметки из определенной категории.

Как вариант предлагается выполнять фитльтрацию внутри цикла:

$query = new WP_Query(...)
while ($query->have_posts()): $query->the_post();
    if (get_the_ID() == '231231') continue;
    ...
endwhile;

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

Немного поковырявшись в исходном коде класса WP_Query обнаружилось, что возможность исключить определенные post_ID на этапе запроса все-таки есть:

$query = new WP_Query("post__not_in[]=231231&post__not_in[]=231232&..")

Особенность недокументированного параметра “post__not_in” в том, что его значение обязательно должно быть arrray-ем (оттуда и символы “[" и "]“). Иначе получим warning и неверный результат.

Для “кодирования” списка ID в строку, можно воспользоваться функцией http_build_query().

Комментариев: 7

7 Responses to “WordPress: Exclude post by ID from main loop”

Комментарии:

  1. Evgenij Nerush

    Довольно интересные сведения о недокументированных параметрах WP_Query.
    А как на счёт
    $query = new WP_Query(“post__not_contain[]=’можно воспользоваться воспользоваться функцией html_build_query()’&…”) ;) ?

  2. Vadim Voituk

    Евгений, не понял вопроса.

  3. Evgenij Nerush

    Смысл вопроса кроется в последнем предложении Вашего поста

  4. Vadim Voituk

    А теперь без загадок?

  5. Evgenij Nerush

    Вадим, я без задних мыслей хотел намекнуть на то, чтобы из последнего предложения
    “Для “кодирования” списка ID в строку, можно воспользоваться воспользоваться функцией html_build_query().”
    исключить слово “воспользоваться”, сори за каламбур :), просто настроение хорошее, не смотря на понедельник :)

  6. Vadim Voituk

    О! Теперь понял. Спасибо – поправил. :)

  7. Vladimir

    Я делал так:

    $posts = &get_posts(array(‘category__not_in’ => array(65, 4, 37, 125, 173, 126, 47, 49, 179, 171, 21), ‘numberposts’ => 10000, ‘post_status’ => ‘publish’));

    Тоже работает :-)

Leave a Reply