Исключить ID сообщения из wp_query
4 ответ
- голосов
-
- 2012-09-14
Я полагаю,это было тяжело,но чтобы ответить на ваш исходный вопрос,я собрал все идентификаторы сообщений в массиве в первом цикле и исключил эти сообщения из второго цикла,используя 'post__not_in' ,который ожидает массив идентификаторов сообщений
<?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; // add post id to array echo '<div class="item">'; echo "<h2>" . get_the_title() . "</h2>"; echo "</div>"; endwhile; endif; /****************************************************************************/ // array of post id's collected in first loop, can now be used as value for the 'post__not_in' parameter in second loops query $args $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; ?>
Первый цикл отображает все сообщения в категории и собирает идентификаторы сообщений в массив.
Во втором цикле отображаются все сообщения,за исключением сообщений первого цикла.
I suppose this was heavy, but to answer your original question, I've collected all of the posts id's in an array in the first loop, and excluded those posts from the second loop using 'post__not_in' which expects an array of post id's
<?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; // add post id to array echo '<div class="item">'; echo "<h2>" . get_the_title() . "</h2>"; echo "</div>"; endwhile; endif; /****************************************************************************/ // array of post id's collected in first loop, can now be used as value for the 'post__not_in' parameter in second loops query $args $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; ?>
The first loop displays all posts in a category, and collects the post id's into an array.
The second loop displays all posts, excluding posts from the first loop.
-
С другой стороны,есть ли способ добавить wp-pagenavi во второй запрос?On another note, Is there a way to add wp-pagenavi to the 2nd query?
- 0
- 2012-09-15
- Dean Elliott
-
На случай,если вы когда-нибудь вернетесь к своему ответу: исправьте разметку/намерение кода.Благодарю.In case you ever revisit your answer: Please fix your code markup/intending. Thanks.
- 1
- 2014-10-12
- kaiser
-
- 2013-05-10
Требуемый параметр -
post__not_in
(в ответе кайзера есть опечатка).Таким образом,код может быть таким:<?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;
The parameter you are looking for is
post__not_in
(kaiser has a typo in his answer). So the code could be like:<?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;
-
Знаете,есть [edit] s для исправления опечаток :)You know, there are [edit]s for correcting typos :)
- 3
- 2014-10-12
- kaiser
-
@Ziki запятая в массиве - это не опечатка,это допустимый синтаксис PHP,если вы это имеете в виду.@Ziki the comma in the array is not a typo it is valid PHP syntax, if thats what you mean.
- 0
- 2017-06-21
- Leo
-
@leonziyo - нет,изначально у него там было "posts__not_in" вместо "post__not_in",см. историю его ответа.Кома в порядке@leonziyo - no, he originally had there "posts__not_in" instead of "post__not_in", see history of his answer. Coma is fine
- 1
- 2017-06-22
- Ziki
-
- 2012-09-14
Вы должны определить аргумент
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(); // do stuff } // endwhile; } // endif; ?>
You have to define the
post__not_in
arg as array. Even for a single value. And please don't overwrite global core variables with temporary stuff.<?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(); // do stuff } // endwhile; } // endif; ?>
-
- 2019-03-22
Альтернативные коды;
Исключить сообщения категории
<?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)); } }
Alternative codes;
Exclude category posts
<?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 )); } }
Remove posts from homepage page
<?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)); } }
Как я могу исключить одно конкретное сообщение из запроса WP_Query?(Например,показать все сообщения,кроме сообщения с идентификатором 278)
Я пробовал использовать аргументpost__not_in,но он просто удаляет все сообщения.
Любая помощь была бы замечательной.
Вот мой текущий запрос
Спасибо