query_posts, get_posts, WP_Query 让我焦头烂额

一、我的错误写法:

<?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('&laquo; Newer Entries ') ?>
        </div>
        <div class="nextprev right">
            <?php next_posts_link(' Older Entries &raquo;') ?>
        </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 查询,免得输出结果相互影响。

你可能感兴趣的:(query_posts, get_posts, WP_Query 让我焦头烂额)