今天说说WordPress 的主查询函数 -query_posts(),因为我正在制作的主题里面多次用到了这个函数 。

query_posts()查询函数决定了哪些文章出现在WordPress 主 循环(loop)中,正因为如此,query_posts函数仅用于修改主页循环(Loop),而不是在页面上生成次级循环。如果你希望在主循环外另外生 成循环,应该新建独立的WP_Query对象,用这些对象生成循环。在主循环外的循环上使用query_posts会导致主循环运行偏差,并可能在页面上 显示出你不希望看到的内容。

query_posts()查询函数函数接收大量参数,格式与URL中的参数格式相同(如p=4表示ID为4的文章)。下面就举例说说query_posts函数的一些常用的语法格式。

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

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

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

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

  1. <?php
  2. if (is_home()) {
  3. query_posts("cat=-1,-2,-3");
  4. }
  5. ?>
2.查询指定文章

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

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

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

  1. <?php
  2. //获取ID值为5的页面
  3. query_posts('p=5');
  4. global $more;
  5. //初始化$more
  6. $more = 0;
  7. //循环查询到的结果
  8. while (have_posts()) : the_post();
  9. the_content('Read the full post ?');
  10. endwhile;
  11. ?>
3.检索指定页面

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

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

或者

  1. <?php
  2. query_posts('pagename=about');
  3. ?>

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

  1. <?php
  2. query_posts('pagename=parent/child');
  3. ?>

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

  1. query_posts(array(
  2. 'cat' => 22,
  3. 'year' => $current_year,
  4. 'monthnum' => $current_month,
  5. 'order' => 'ASC',
  6. ));

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

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

分类参数

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

  • cat —— 必须使用分类ID
  • category_name
  • category_and —— 必须使用分类ID
  • category_in —— 必须使用分类ID
  • category_not_in —— 必须使用分类ID

根据ID显示单个分类

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

  1. query_posts('cat=4');

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

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

  1. query_posts('category_name=Staff Home');

根据ID显示多个分类

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

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

排除某一分类中的文章

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

  1. query_posts('cat=-3');

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

处理多个分类

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

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

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

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

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

  1. 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

获取某一标签中的文章

  1. query_posts('tag=cooking');

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

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

多个标签

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

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

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

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

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

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

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

作者参数

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

  • author=3
  • author=-3 ——排除ID为3的作者所发表的文章
  • author_name=Harriet

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

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

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

文章&页面参数

检索单篇文章或页面。

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

置顶文章参数

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

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

返回第一篇置顶文章

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

  1. $args = array(
  2. 'posts_per_page' => 1,
  3. 'post__in' => get_option('sticky_posts'),
  4. 'caller_get_posts' => 1
  5. );
  6. query_posts($args);

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

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

  1. $sticky = get_option('sticky_posts');
  2. $args = array(
  3. 'posts_per_page' => 1,
  4. 'post__in' => $sticky,
  5. 'caller_get_posts' => 1
  6. );
  7. query_posts($args);
  8. if($sticky[0]) {
  9. // insert here your stuff...
  10. }

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

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

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

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

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

  1. <?php
  2. $paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
  3. $sticky=get_option('sticky_posts');
  4. $args=array(
  5. 'cat'=>3,
  6. 'caller_get_posts'=>1,
  7. 'post__not_in' => $sticky,
  8. 'paged'=>$paged,
  9. );
  10. query_posts($args);
  11. ?>

时间参数

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

  • hour= -hour (时,-范围从0到23)
  • minute= – minute (分,-范围从0到60)
  • second= – second (秒,-范围从0到60)
  • day= – day of the month (日,-范围从1到31)
  • monthnum= – month number (月,-范围从1到12)
  • year= – 4 digit year (年,如2009)
  • w= – week of the year(一年中的第几周,-范围从0到53),使用 MySQL WEEK command Mode=1命令

返回最近发表的文章

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

返回12月20日发表的文章

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

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

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

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

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

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

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

分页参数

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

offset(偏移)参数

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

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

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

排序参数

  • orderby=author
  • orderby=date
  • orderby=category ——注意:该参数不能用于WordPress 2.8,可能已经被废止
  • orderby=title
  • orderby=modified
  • orderby=menu_order
  • orderby=parent
  • orderby=ID
  • orderby=rand
  • orderby=meta_value —— meta_key=some value语句也应出现在查询参数中
  • orderby=none – no order —— (新增于 WP 2.8)
  • orderby=comment_count ——(新增于 WP 2.9)

顺序参数

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

  • order=ASC —— 升序,从最低值到最高值
  • order=DESC —— 降序,从最高值到最低值

自定义字段参数

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

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

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

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

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

  1. query_posts('meta_key=color');

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

  1. query_posts('metavalue=color');

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

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

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

  1. 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');

联合参数

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

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

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

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

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

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

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

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

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

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

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

使用技巧

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

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

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

来源: http://www.zuluo.net/2012/2012-01/wordpress-query_posts.html

说说WordPress的主查询函数-query_posts()的更多相关文章

  1. (转)WordPress的主查询函数-query_posts()

    今天说说WordPress 的主查询函数 -query_posts(),因为我正在制作的主题里面多次用到了这个函数 . query_posts()查询函数决定了哪些文章出现在WordPress 主 循 ...

  2. WordPress函数query_posts用法汇总

    最近经常有网友跟我咨询WordPress函数query_posts的相关用法,说起来query_posts实在是太强大,参数无数,用法更是无数,如果让我说它的用法,我根本没法一一说清楚.开始之前,你可 ...

  3. 学习WordPress必须知道的函数(转)

    WordPress是目前十分流行的独立博客程序,因傻瓜化安装和使用,其在网民中的应用已近乎普及.但也因为很多新入门的用户几乎对WordPress 程序没有任何了解,造成使用中碰到问题无法解决,求助也十 ...

  4. oracle 查询 函数练习2

    /*以下代码是对emp表/dept表/salgrade表进行显示宽度设置 */col empno for 9999;col ename for a10;col job for a10;col mgr ...

  5. Oracle中关于处理小数点位数的几个函数,取小数位数,Oracle查询函数

    Oracle中关于处理小数点位数的几个函数,取小数位数,Oracle查询函数 关于处理小数点位数的几个oracle函数()1. 取四舍五入的几位小数select round(1.2345, 3) fr ...

  6. Entity framework 中Where、First、Count等查询函数使用时要注意

    在.Net开发中,Entity framework是微软ORM架构的最佳官方工具.我们可以使用Lambda表达式在Entity framework中DbSet<T>类上直接做查询(比如使用 ...

  7. 为什么sql里面not in后面的子查询如果有记录为NULL的,主查询就查不到记录

    为什么sql里面not in后面的子查询如果有记录为NULL的,主查询就查不到记录???原因很简单: SELECT * FROM dbo.TableA AS a WHERE a.id NOT IN ( ...

  8. wordpress模板各文件函数解析

    修改主题时发现好多WordPress主题函数都不了解,因此网上摘抄了一份放在自己博客上,便于以后好找. 在WordPress中如何按你的意愿显示页面,关键看你是否了解WordPress主题模板页面.这 ...

  9. C#基础:LINQ 查询函数整理

    1.LINQ 函数   1.1.查询结果过滤 :where() Enumerable.Where() 是LINQ 中使用最多的函数,大多数都要针对集合对象进行过滤,因此Where()在LINQ 的操作 ...

随机推荐

  1. 【DP】【P2734】游戏 A Game

    传送门 Description 有如下一个双人游戏:N个正整数的序列放在一个游戏平台上,游戏由玩家1开始,两人轮流从序列的任意一端取一个数,取数后该数字被去掉并累加到本玩家的得分中,当数取尽时,游戏结 ...

  2. HDU 3507 斜率优化dp

    Print Article Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)To ...

  3. expect使用小结

    因为工作关系,需要经常从线上机器上拉取数据,于是想着能否写个脚本,自动完成这个任务呢? 我一般使用scp在机器间传输文件,然而每次scp都需要输入密码,自动化脚本怎么解决这个问题呢?于是expect这 ...

  4. java后台svg转成png

    1.替换img地址 /** * 替换img地址 * @param str -- 前台svg字符串 * @return */ private String transferImgPath(HttpSer ...

  5. 【Linux】NAT模式下关于主机ping不通虚拟机的问题

    今天打开虚拟机,然后用Xshell远程连接,发现连接不上.按照以下顺序检查了一遍. 1.虚拟机网络连接采用的是NAT模式 2.虚拟机IP采用的是自动获取.   IP:192.168.191.130 子 ...

  6. PowerDesigner逆向生成

    人越长大话越少,我们不再说今天受了委屈,不再说谁谁谁不理我了我好难过,不再分享生活中的琐事. 我知道人和人之间没法互相理解,大家都很忙,针也没扎在别人身上. 所以把那些还没说出口的话消化在每一步走过的 ...

  7. Rabbit MQ 面试题相关

    项目中的MQ: #rabbitmq spring.rabbitmq.host=127.0.0.1 主机 spring.rabbitmq.port=5672 端口 spring.rabbitmq.use ...

  8. 版本号中Snapshot的含义

    Maven中建立的依赖管理方式基本已成为Java语言依赖管理的事实标准,Maven的替代者Gradle也基本沿用了Maven的依赖管理机制.在Maven依赖管理中,唯一标识一个依赖项是由该依赖项的三个 ...

  9. 【51NOD-0】1008 N的阶乘 mod P

    [算法]简单数学 [题解]多项式展开:(a*b)%p=(a%p*b%p)%p #include<cstdio> #include<algorithm> #define rep( ...

  10. JS语句循环(100以内奇偶数、100以内与7先关的数、100以内整数的和、10以内阶乘、乘法口诀、篮球弹起高度、64格子放东西)

    3.循环 循环是操作某一个功能(执行某段代码). ①循环四要素: a 循环初始值 b 循环的条件 c 循环状态 d 循环体 ②for循环 a 穷举:把所有的可能性的都一一列出来. b 迭代:每次循环都 ...