• 注册
  • 个人说明:TA有点懒了,什么都没有写。
    关注 1 粉丝 0 喜欢 0 内容 256
    河南省·郑州市
    聊天 送礼

    新版界面开发进度

    14%
    其实就是啥也没写,只有想法,哈哈
    • 回帖总排行
    • 采纳总排行

    分享精彩给好友

    全部文章 关注:0 内容:1074

    WordPress查询函数query_posts用法详解【转】

  • 查看作者
  • 打赏作者
  • 拉黑名单
    • query_posts基本用法

      首先介绍一下如何使用query_posts函数。在主题目录下找到存档页面文件,存档页面包括index.php、archive.php等,一般分类页、标签页、日期页和作者页等都是用archive.php。

      确定了你要控制哪个页面的文章列表,那么我们就可以开始了,比如你想让首页的文章按评论数排序,那么index.php中的代码基本框架就是这样的:

      <?php   
          // query_posts函数
          query_posts('orderby=comment_count');
          // 主循环
          if ( have_posts() ) : while ( have_posts() ) : the_post();
           ..
          endwhile; else:
           ..
          endif;
          // 重置query
          wp_reset_query();
          ?>

      其实你要做的就是在index.php中查找if (have_posts())或while (have_posts()),在前面添加query_posts函数即可。不过以上方式可能会导致首页无法分页,那你可以将query_posts函数改成这样的行式:

        // 下面这一行代码是必须的,不然你的首页不能分页
          $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
          $args = array(
              // 这里以下面的方式添加query_posts参数,具体参数可以参加官方文档
              'orderby'   => comment_count,
              'paged' => $paged
          );
          query_posts($args);

      下面是一些常见的query_posts函数用法,你可以直接用到你的主题中。

      一、只显示含有某个自定义字段的文章

      如果你想只显示添加了某个自定义字段的文章,并按照这个字段的值来对文章排序,那么你可以看看下面的例子:

      1、打开WordPress当前主题目录,打开index.php,搜索代码:

       while (have_posts())

      将其替换成:

        /**
      
           * 名称:WordPress手动修改文章排列顺序
      
           */
          $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
      
          $args=array(
      
              'meta_key' => 'sort',
      
              'orderby'   => 'meta_value_num',  // 须 WordPress 2.8 及以上版本
      
              'paged' => $paged,
      
              'order' => DESC
          );
          query_posts($args);
          while (have_posts())

      接着搜索:

      endwhile;

      将其改成:

      endwhile;wp_reset_query();
      

      2、给之前发表的所有文章添加自定义字段(或者称作自定义栏目,在文章编辑页底部可以看到),名称为 sort ,值填数字。这样在首页,文章的排列顺序就按照sort字段的值,从大到小排列了。通过修改sort字段的值,可以达到自定义文章排列顺序的目的。

      3、需要注意的是,通过以上修改后,你必须给所有文章添加自定义字段sort,否则没有添加sort字段的文章将无法在首页显示。这也许就是手动排序需要付出的代价吧,要不然何谓手动?

      4、如果你同时想手动修改标签页、分类页等存档页面的文章排列顺序,同样可以按照第一步介绍的方法来操作,修改主题目录下的archive.php等。

      其实这种方式你可以看成怎样只显示我推荐的文章,那么含有这个自定义字段的文章就是推荐文章。

      二、怎样让某分类的文章不显示/显示

      如果你不想让某分类的文章出现在主循环中,那么你可以使用query_posts添加参数category__not_in即可:

       $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
          $args = array(
              // 2, 6就是你不想显示的分类ID,多个用半角逗号隔开
              'category__not_in'   => array(2, 6),
              'paged' => $paged
          );
          query_posts($args);
      

      如果只想让显示某个分类的文章,可以将category__not_in改成category__in。同理,如果不显示某标签下的文章,可以将category__not_in改成:tag__not_in,或者只想让显示某个标签下的文章,可以将category__not_in改成tag__in,后面跟着标签的ID即可。

      三、如何对文章进行排序

      $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
          $args = array(
              // 以下代码中的title就是orderby的值,按标题排序
              'orderby'   => title,
              'paged' => $paged
          );
          query_posts($args);

      根据orderby的值不同,可以让文章按照很多种方式进行排序,下面是列举几个常见的值及其对应的排序方式:title:按标题;date:按发布日期;modified:按修改时间;ID:按文章ID;rand:随机排序;comment_count:按评论数

      四、只显示相应ID的文章

      如我只想显示ID为2,4,6的文章,可以使用以下代码:

       $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
          $args = array(
              // 以下代码中的2,4,6就是文章的ID
              'post__in'   => array(2,4,6),
              'paged' => $paged
          );
          query_posts($args);

      五、让置顶文章不置顶

      如果你不想让置顶文章显示在顶部,而是让它们安装正常的顺序排列,那么可以使用以下代码:

      $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
          $args=array(
              'paged' => $paged,
              'caller_get_posts' => 1
          );
          query_posts($args);

      六、列出所有状态的文章

      WordPress的文章状态有很多种,包括已发布、草稿、已删除、私人的、定时发布的等等,如果你想将这些文章都统统显示出来,那么可以这样:

       $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
      
          $args = array(
      
              'post_status' => array('publish', 'pending', 'draft', 'future', 'private', 'trash'),
      
              'paged' => $paged
      
          );
      
          query_posts($args);

      post_status参数可以控制具体的文章状态,值包括pending(待审)、publish(已发布)、draft(草稿), future(定时), private(私有), trash(已删除)。

      七、控制文章的数量

      如果你想控制要显示的文章数量,可以使用showposts参数:

       $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
      
          $args = array(
      
              // 控制只显示10篇文章,如果将10改成-1将显示所有文章
      
              'showposts' => 10,
      
              'paged' => $paged
      
          );
      
          query_posts($args);

      如果你只是想控制首页、分类页等每各分页显示的文章数量,可以在WordPress管理后台 – 设置 – 阅读那里设置博客页面至多显示多少篇文章。

      从博客主页上排除某些分类目录

      将以下代码添加到index.php文件中,使主页显示的文章可以来自除分类3以外的任何分类。

      <?php  
            if (is_home()) {  
              query_posts("cat=-3");  
            }  
          ?>

      你也可以多排除几个分类。

      <?php  
            if (is_home()) {  
              query_posts("cat=-1,-2,-3");  
            }  
          ?>

      查询指定文章

      用以下语句检索某篇指定文章:

       <?php  
      
          //获取ID值为5的文章  
      
          query_posts('p=5');  
      
          ?>

      如果你希望在查询语句中使用Read More功能,请将全局变量$more设为0。

      <?php  
      
          //获取ID值为5的页面  
      
          query_posts('p=5');  
      
            
      
          global $more;  
      
          //初始化$more  
      
          $more = 0;  
      
            
      
          //循环查询到的结果  
      
          while (have_posts()) : the_post();  
      
          the_content('Read the full post ?');  
      
          endwhile;  
      
          ?>

      检索指定页面

      用以下语句检索某篇指定页面:

      <?php  
      
          query_posts('page_id=7'); //获取页面ID为7的页面  
      
          ?>

      或者

      <?php  
      
          query_posts('pagename=about');  
      
          ?>

      检索子页面时,需要提供子页面及其父页面的别名,用斜线隔开两者。例如:

       <?php  
      
          query_posts('pagename=parent/child');  
      
          ?>

      上面都是采取 query_posts($query_string) 的形式来调用该函数,下面介绍另一种方法,用数组传递参数变量。

      query_posts(array(  
      
            'cat' => 22,  
      
            'year' => $current_year,  
      
            'monthnum' => $current_month,  
      
            'order' => 'ASC',  
      
          ));

      相比字符串方式,数组形式更加形象直观,不容易出错。

      下面整理一些经常要用到的参数,有些是我用过的,有些则没有,算作归纳吧。

      分类参数

      只显示特定分类下的文章。

      cat —— 必须使用分类ID

      category_name

      category_and —— 必须使用分类ID

      category_in —— 必须使用分类ID

      category_not_in —— 必须使用分类ID

      根据ID显示单个分类

      只显示来自某一个分类目录ID(以及该分类目录下的子分类目录)的文章:

      query_posts('cat=4');

      根据分类名称显示单个分类

      只显示来自某一个分类名称下的文章:

       query_posts('category_name=Staff Home');

      根据ID显示多个分类

      显示来自若干指定分类目录ID下的文章:

      query_posts('cat=2,6,17,38');

      排除某一分类中的文章

      显示除某一分类文章外的所有文章,被排除的分类ID以减号(’-‘)作为前缀。

      query_posts('cat=-3');

      以上代码删除ID为3的分类中的文章。

      处理多个分类

      显示隶属于多个分类的文章。下面的代码可展示同时属于分类2和分类6的文章:

      query_posts(array('category__and' => array(2,6)));

      如果希望显示分类2或分类6中的文章,可以使用上面介绍的cat,也可以使用category_in函数 (注意这里不会显示分类下子分类中的文章) :

       query_posts(array('category__in' => array(2,6)));

      可以用下面这种方式排除多个分类中的文章:

       query_posts(array('category__not_in' => array(2,6)));

      标签参数

      显示特定标签下的文章。

      tag —— 必须使用标签ID

      tag_id —— 必须使用标签ID

      tag_and —— 必须使用标签ID

      tag_in —— 必须使用标签ID

      tag_not_in —— 必须使用标签ID

      tag_slug_and ——必须使用标签ID

      tag_slug_in ——必须使用标签ID

      获取某一标签中的文章

        query_posts('tag=cooking');

      获取若干标签中任一标签中的文章

       query_posts('tag=bread+baking+recipe');

      多个标签

      显示同时属于ID为37和47的标签下的文章:

      query_posts(array('tag__and' => array(37,47));

      若要显示ID为为37或47的标签下的文章,可以使用tag参数,也可以用tag_in:

       query_posts(array('tag__in' => array(37,47));

      显示的文章既不属于标签37,也不属于标签47:

       query_posts(array('tag__not_in' => array(37,47));

      tag_slug_in与tag_slug_and工作方式几乎一致,不同之处在于相匹配的别名不同。

      作者参数

      你也可以根据作者来选择文章。

      author=3

      author=-3 ——排除ID3的作者所发表的文章

      author_name=Harriet

      注意:author_name运行在user_nicename字段上,同时author运行在author id字段上。

      显示ID为1的作者所发表的所有页面,以标题顺序排列页面,页面列表上方无置顶文章:

      query_posts('caller_get_posts=1&author=1&post_type=page&post_status=publish&orderby=title&order=ASC');

      文章&页面参数

      检索单篇文章或页面。

      1.     p => 27 —— 通过文章ID显示该文章
      2.     name => aboutmylife —— 对某篇文章的查询,查询中含有文章别名
      3.     page_id => 7 —— ID7的页面的查询
      4.     pagename => about —— 注意,这不是页面标题,而是页面路径
      5.     用’posts_per_page => 1  use posts_per_page => 3 展示3篇文章。用’posts_per_page => 1展示所有文章
      6.     showposts => 1  use showposts => 3 展示3篇文章。用’showposts => 1展示所有文章。已弃用。
      7.     post__in => array(5,12,2,14,7) —— 指定希望检索的文章ID
      8.     post__not_in => array(6,2,8) ——排除不希望检索的文章ID
      9.     post_type => page ——返回页面;默认值为post;可用值包括any, attachment, page, postrevisionany可检索到除修订版外的所有页面类型。
      10.     post_status => publish —— 返回已发布页面。可用值还包括pending, draft, future, private, trash。关于inherit请见get_childrentrash状态新增于WordPress  2.9
      11.     post_parent => 93 —— 返回页面93的子页面。

      置顶文章参数

      置顶文章功能引入于WordPress 2.7。在查询中,被设为“置顶”的文章会显示在其它文章之前,除非该文章已经被caller_get_posts=1 参数排除。

      1. array(‘post__in’=>get_option(‘sticky_posts’)) —— 返回所有置顶文章的数组
      2.     caller_get_posts=1 —— 排除返回的文章上方的置顶文章,但在返回文章列表时,以自然顺序将曾经置顶的文章安插在列表中。

      返回第一篇置顶文章

          $sticky=get_option('sticky_posts') ;  
      
          query_posts('p=' . $sticky[0]);

        $args = array(  
      
          'posts_per_page' => 1,  
      
          'post__in' => get_option('sticky_posts'),  
      
          'caller_get_posts' => 1  
      
          );  
      
          query_posts($args);

      注意:第二种方法只能返回最新发表的置顶文章;若当前无置顶文章,返回最新发表文章。

      返回第一篇置顶文章;若无,则不返回任何内容

      $sticky = get_option('sticky_posts');  
      
          $args = array(  
      
          'posts_per_page' => 1,  
      
          'post__in' => $sticky,  
      
          'caller_get_posts' => 1  
      
          );  
      
          query_posts($args);  
      
          if($sticky[0]) {  
      
          // insert here your stuff...  
      
          }

      从查询中排除所有置顶文章

      query_posts(array("post__not_in" =>get_option("sticky_posts")));

      返回某一分类下所有文章,但不在文章列表上方显示置顶文章。所有设为“置顶”的文章以正常顺序(如日期顺序)显示

       query_posts('caller_get_posts=1&posts_per_page=3&cat=6');

      返回某一分类下所有文章,完全不显示置顶文章,保留分页

        <?php  
      
            $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;  
      
            $sticky=get_option('sticky_posts');  
      
            $args=array(  
      
              'cat'=>3,  
      
              'caller_get_posts'=>1,  
      
              'post__not_in' => $sticky,  
      
              'paged'=>$paged,  
      
            );  
      
            query_posts($args);  
      
          ?>

      时间参数

      检索特定时间段内发表的文章。

      1. hour= hour (时,-范围从023
      2.     minute=  minute (分,-范围从060
      3.     second=  second (秒,-范围从060
      4.     day=  day of the month (日,-范围从131
      5.     monthnum=  month number (月,-范围从112
      6.     year=  4 digit year (年,如2009)
      7.     w=  week of the year(一年中的第几周,-范围从053),使用 MySQL WEEK command Mode=1命令

      返回最近发表的文章

        $today = getdate();    
      
          query_posts('year=' .$today["year"] .'&monthnum=' .$today["mon"] .'&day=' .$today["mday"] );

      返回12月20日发表的文章

      query_posts(monthnum=12&day=20' );

      返回2009年3月1日到3月15日之间发表的文章

      <?php  
      
            //based on Austin Matzko's code from wp-hackers email list  
      
            function filter_where($where = '') {  
      
              //posts for March 1 to March 15, 2009  
      
              $where .= " AND post_date >= '2009-03-01' AND post_date < '2009-03-16'";  
      
              return $where;  
      
            }  
      
            add_filter('posts_where', 'filter_where');  
      
            query_posts($query_string);  
      
          ?>

      返回最近30天内发表的文章

      <?php  
      
            //based on Austin Matzko's code from wp-hackers email list  
      
            function filter_where($where = '') {  
      
              //posts in the last 30 days  
      
              $where .= " AND post_date > '" . date('Y-m-d', strtotime('-30 days')) . "'";  
      
              return $where;  
      
            }  
      
            add_filter('posts_where', 'filter_where');  
      
            query_posts($query_string);  
      
          ?>

      返回过去30天到过去60天内发表的文章

          <?php  
      
            //based on Austin Matzko's code from wp-hackers email list  
      
            function filter_where($where = '') {  
      
              //posts 30 to 60 days old  
      
              $where .= " AND post_date >= '" . date('Y-m-d', strtotime('-60 days')) . "'" . " AND post_date <= '" . date('Y-m-d', strtotime('-30 days')) . "'";  
      
              return $where;  
      
            }  
      
            add_filter('posts_where', 'filter_where');  
      
            query_posts($query_string);  
      
          ?>

      分页参数

      1. paged=2 ——显示点击“较早的日志”链接后出现在第二页中的文章
      2.     posts_per_page=10 —— 每页所显示的文章数量;若值为-1,显示所有文章。
      3.     order=ASC —— 按时间顺序显示文章,若值为DESC则按逆向时间顺序显示文章(默认)

      offset(偏移)参数

      通过offset参数,你可以移除或忽略正常情况下被查询集中的一篇或多篇初始文章。

      以下显示最近一篇文章之后的5篇文章:

          query_posts('posts_per_page=5&offset=1');

      排序参数

      1. orderby=author
      2.     orderby=date
      3.     orderby=category ——注意:该参数不能用于WordPress 2.8,可能已经被废止
      4.     orderby=title
      5.     orderby=modified
      6.     orderby=menu_order
      7.     orderby=parent
      8.     orderby=ID
      9.     orderby=rand
      10.     orderby=meta_value —— meta_key=some value语句也应出现在查询参数中
      11.     orderby=none  no order —— (新增于 WP 2.8)
      12.     orderby=comment_count ——(新增于 WP 2.9)

      顺序参数

      决定以升序或降序排列排序参数

      1.   order=ASC —— 升序,从最低值到最高值
      2.     order=DESC —— 降序,从最高值到最低值

      自定义字段参数

      根据自定义关键字或值检索文章(或页面)。

      1.     meta_key=
      2.     metavalue=
      3.     meta_compare= —— 用以测试metavalue=的操作符,默认值为 ‘=’,其它可能的值包括’!=’、 ‘>’、’>=’、 ‘<’或 ‘<=’ 

      返回关键字为 ‘color’ 且值为’blue’的文章:

       query_posts('meta_key=color&metavalue=blue');

      返回自定义字段关键字为’color’的文章,无论自定义字段值为何:

       query_posts('meta_key=color');

      返回自定义字段值为’color’的文章,无论关键字为何:

       query_posts('metavalue=color')

      返回自定义字段值为’green’的页面,无论自定义字段关键字为何:

       query_posts('post_type=page&metavalue=green');

      返回自定义关键字为’color’、自定义字段值不为’blue’的文章和页面:

      query_posts('post_type=any&meta_key=color&meta_compare=!=&metavalue=blue');

      返回自定义字段关键字为’miles’、自定义字段值小于等于22的文章。注意,字段值99会被看做大于字段值100,因为数据是以字符串形式而不是数字形式存储的。

      query_posts('meta_key=miles&meta_compare=<=&metavalue=22');

      联合参数

      你可能已经从上面有些例子中看出来了,可以用&符号连接不同参数,如:

      uery_posts('cat=3&year=2004');

      显示主页上、当前月份发表的、隶属于分类13下的文章:

        if (is_home()) {  
      
            query_posts($query_string . '&cat=13&monthnum=' . date('n',current_time('timestamp')));  
      
          }

      在WP 2.3中,以下参数联合会返回同时属于分类1和分类3的两篇文章,以文章标题降序排列:

          query_posts(array('category__and'=>array(1,3),'posts_per_page'=>2,'orderby'=>title,'order'=>DESC));

      在WP 2.3和WP 2.5中,以下参数联合本应返回属于分类1且带有“apples”标签的文章:

          query_posts('cat=1&tag=apples');

      但由于一个bug,代码没能显示出正常结果。有一个解决办法:利用+号查找多个标签:

          query_posts('cat=1&tag=apples+apples');

      这就显示出我们希望显示的结果了。

      使用技巧

      设置>阅读中的“博客页面最多显示”参数会影响你的查询结果,要覆盖设置>阅读中的设置,需要在标签中添加’posts_per_page’ 参数。例如:

          query_posts('category_name=The Category Name&posts_per_page=-1');  //returns ALL from the category

      注意:query_posts函数会改写并取代页面的主查询。为谨慎起见,请不要将query_posts用作其它用途。

      你需要登录,才能进行发帖操作