一、我的错误写法:
<?php query_posts( array( 'posts_per_pages' =>16,'paged' => $paged) ); ?>
'posts_per_pages' 应该为 'posts_per_page' (没有s的);这个属性可用来替代 'showposts',官方网站好象也赞成用 'posts_per_page' 来代替 'showposts',参看出处。
没有指定分类,默认就是查询所有分类的文章,不过设置成隐秘的文章还是不会查询到的,不用担心。
用了query_posts 的Loop 后面,应该加上wp_reset_query();,让查询的对象参数重置,以免影响后面的query_posts。但 wp_reset_query(); 放的位置也是有讲究的,网上的例子一般是这样的 (放在循环结束以后):
<?php // The Query query_posts( $args ); // The Loop while ( have_posts() ) : the_post(); echo '<li>'; the_title(); echo '</li>'; endwhile; // Reset Query wp_reset_query(); ?>
上面虽然没错,但如果Loop后面有wp_pagenavi分页代码,就会造成分页的不准确。估计 wp_pagenavi 是按当前的 query 来分的,如果在它前面重设了query,它就按WP后台默认的来分页了,而不是根据你新建的Query来分页。我是把 wp_reset_query(); 放在 wp_pagenavi(); 模块的后面,类似这样子(就正常了):
<?php $paged = (get_query_var('paged')) ? get_query_var('paged') : 1; ?> <?php query_posts( array('category__in' => array(5),'paged' => $paged,'posts_per_page' => 16)); ?> <?php if (have_posts()) : while (have_posts()) : the_post(); ?> <div class="pagenavi"> <?php if (function_exists('wp_pagenavi')) wp_pagenavi(); else { ?> <div class="nextprev left"> <?php previous_posts_link('« Newer Entries ') ?> </div> <div class="nextprev right"> <?php next_posts_link(' Older Entries »') ?> </div> <div class="clear"></div> <?php } ?> </div> <!--end: pagenavi--> <?php else : ?> <?php endif; ?> <?php wp_reset_query(); ?>
二、get_posts(),WP_Query()和query_posts() 的区别
WP_Query()是个类,以"$the_query = new WP_Query( $args );"的形式开始新的查询Loop, query_posts()输出是个对象,query_posts()实质是调用 WP_Query()来匹配文章的查询,二者的使用参数是完全一致的,query_posts()使用更简单点,但可能影响后面的Loop,引起一些不良后果,这时侯就用WP_Query,进程比较独立,不会影响后面的Loop。
get_posts ($args )也是调用 WP_Query()来匹配文章的查询,调用的参数及方式与前二者基本相同,get_posts 是直接输出数组形式的结果。一般用法:"<?php get_posts( $args ); ?>",
<?php $args = array( 'numberposts' => 5, 'offset' => 0, 'category' => , 'orderby' => 'post_date', 'order' => 'DESC', 'include' => , 'exclude' => , 'meta_key' => , 'meta_value' => , 'post_type' => 'post', 'post_mime_type' => , 'post_parent' => , 'post_status' => 'publish' ); ?>
查询的功能相应比query_posts()少一些,不过可用 setup_postdata() 函数来获取更多的内容,参看官方网站,如果不是很变态的查询,用get_posts()简单实用。
numberposts 意思是提取的文章数(每页的文章显示数),对应的 WP_Query()和query_posts() 的参数是 'posts_per_pages' 和 'showposts'(不推荐使用)。
offset 是位移,比如从第2篇的后面5个文章: "$query = new WP_Query( array( 'posts_per_page' => 5, 'offset' => 1 ) ); "。
include/exclude (后接文章ID),意为包含文章/排除文章,而不是包含/排除分类。
有时让我郁闷的是,get_posts(),WP_Query()和query_posts() 这三者对参数要求好象并不严厉,就算我写错了参数,都能输出结果,也不提示出错信息,只是输出的结果并非所愿。
重要提示:query_posts函数仅用于修改主页循环(Loop),而不是一种在页面上生成次级循环的手段。如果你希望在主循环外另外生成循环,应该新建独立的WP_Query对象,用这些对象生成循环。在主循环外的循环上使用query_posts会导致主循环运行偏差,并可能在页面上显示出你不希望看到的内容。
query_posts函数会改写并取代页面的主查询。为谨慎起见,请不要将query_posts用作其它用途。
虽然有时不太理解上面的提示,但确实我碰到了好几例 query_posts 的输出结果不如人意,特别是同一页面如果有好几处 query_posts 时,在每一次调用 query_posts 结尾,要记得加上“wp_reset_query(); ”,重设 query 查询,免得输出结果相互影响。