排除wordpress循环中的某个或某几个文章,主要根据
post__not_in
这个参数在主循环里排除不想加入的文章ID:例如不想要ID为178的文章:
<?php $args=array( 'post__not_in'=> array(170), 'post_type' => 'post', 'post_status' => 'publish', 'posts_per_page' => -1, 'caller_get_posts'=> 1 ); $my_query = null; $my_query = new WP_Query($args); if( $my_query->have_posts() ) { echo 'List of Posts'; while ($my_query->have_posts()) : $my_query->the_post(); ?> <p><a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title_attribute(); ?>"><?php the_title(); ?></a></p> <?php endwhile; } wp_reset_query(); // Restore global post data stomped by the_post(). ?>
注意点1:参数是post__not_in,这个post后面跟的是两个下划线。。。我这里没注意,想了好久都没办法。。。提醒大家注意。
注意点2:如果要排除置顶的文章,
'caller_get_posts'=> 1
这个参数不能少。
注意点3:也是最重要的,那个post__not_in必须对应一个数组,哪怕你就是排除一篇文章,也得写出array。也可以传递变量,比如'post__not_in' => $id,这个$id是个数组,我就是用这个变量记录排除的文章的。
顺便给大家一个测试query的方法,就在主循环the_post()后面加上:
<?php echo "<p>REQUEST:$wp_query->request</p>";?>
可以输出wordpress当前的query内容:
例如输出的结果
REQUEST: SELECT SQL_CALC_FOUND_ROWS wp_16_posts.* FROM wp_16_posts WHERE 1=1 AND wp_16_posts.ID NOT IN (261,209) AND wp_16_posts.ID NOT IN ( SELECT tr.object_id FROM wp_16_term_relationships AS tr INNER JOIN wp_16_term_taxonomy AS tt ON tr.term_taxonomy_id = tt.term_taxonomy_id WHERE tt.taxonomy = 'category' AND tt.term_id IN ('4', '0', '0') ) AND wp_16_posts.post_type = 'post' AND (wp_16_posts.post_status = 'publish') ORDER BY wp_16_posts.post_date DESC LIMIT 0, 8
这样的结果很方便复杂查询的排错。