首页 » 建站学习 » query_posts, get_posts, WP_Query 让我焦头烂额

6

一、我的错误写法:

<?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 查询,免得输出结果相互影响。

标签:,

wp_insert_post 很厉害
wp_insert_post 很厉害

把 wp-thumbnail 插件产生的缩略图转换成特色图像
把 wp-thumbnail 插件产生的缩略图转换成特色图像

试用 GD Custom Posts And Taxonomies Tools
试用 GD Custom Posts And Taxonomies Tools

初用 Yet Another Related Posts Plugin 插件
初用 Yet Another Related Posts Plugin 插件

6 Comments

  1. Cialis bestellen 说道:

    Interesting site. Great post, keep up all the work.

  2. wbang.t 说道:

    补充一下,get_posts()方法:注意global $post;不要改名,另外wp_reset_query();
    5, ‘offset’ => 0, ‘category’ => 8, ‘orderby’ => ‘post_date’, ‘order’ => ‘ASC’);
    $myposts = get_posts($defaults);
    foreach ($myposts as $post) :
    setup_postdata($post);
    echo ” “;
    the_title();
    echo “
    “;
    the_time(get_option(‘date_format’));
    echo “”;
    endforeach;
    wp_reset_query();
    ?>

    • wbang.t 说道:

      5, ‘offset’ => 0, ‘category’ => 8, ‘orderby’ => ‘post_date’, ‘order’ => ‘ASC’);
      $myposts = get_posts($defaults);
      foreach ($myposts as $post) :
      setup_postdata($post);
      echo ” “;
      the_title();
      echo “
      “;
      the_time(get_option(‘date_format’));
      echo “”;
      endforeach;
      wp_reset_query();
      ?>

    • wbang.t 说道:

      global $post;
      $defaults = array(‘numberposts’ => 5, ‘offset’ => 0, ‘category’ => 8, ‘orderby’ => ‘post_date’, ‘order’ => ‘ASC’);
      $myposts = get_posts($defaults);
      —–接上——
      呵呵,怎么发不上呢,

  3. xdraw 说道:

    学习了。
    做伪CMS主题的时候,经常用到这个,但是又不是很理解官方文档那段说明。
    真不知道,什么情况下用那种才对呢。

发表评论