WordPress基础教程

说说WordPress的主查询函数-query_posts()

发布时间:2018-09-25 21:31:49

本文作者:

今天说说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以外的任何分类。

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

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

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

2.查询指定文章

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

<?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;  
?>  

3.检索指定页面

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

<?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 ——排除ID为3的作者所发表的文章
  • 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');

文章&页面参数

检索单篇文章或页面。

  • ‘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 —— 排除返回的文章上方的置顶文章,但在返回文章列表时,以自然顺序将曾经置顶的文章安插在列表中。

返回第一篇置顶文章

$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);
?>

时间参数

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

  • 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命令

返回最近发表的文章

$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);
?>

分页参数

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

offset(偏移)参数

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

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

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’的文章:

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

联合参数

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

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

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

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

使用技巧

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

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

小兽wordpress凭借多年的wordpress企业主题制作经验,坚持以“为用户而生的wordpress主题”为宗旨,累计为10万多家客户提供品质wordpress建站服务,得到了客户的一致好评。我们一直用心对待每一个客户,我们坚信:“善待客户,将会成为终身客户”。小兽wordpress能坚持多年,是因为我们一直诚信。我们明码标价(wordpress做网站需要多少钱),从不忽悠任何客户,我们的报价宗旨:“拒绝暴利,只保留合理的利润”。如果您有网站建设、网站改版、网站维护等方面的需求,请立即咨询右侧在线客服或拨打咨询热线:18907337671,我们会详细为你一一解答你心中的疑难。

相关文章

WordPress主题模板

价格便宜(200-2500元不等),时间快, 图文内容后台自己控制。
一对一指导安装、终身免费升级。

全部模板

XSwm外贸营销型主题

XSwm主题助力外贸企业快速搭建全球销售的外贸独立网站

XSmic外贸引流模板

wordpress仿make in china(中国制造)的店铺引流模板

XS2021外贸模板

颜值与内涵并重的独立站、精准的广告投放、社交媒体推广和谷歌SEO

XS2020中文模板

帮助客户以最低的成本进去互联网,并且以最快的效率去做互联网营销。

XSnm中文营销型模板

网站布局规范清晰,内容完整,营销力十足

XSzq站群模板

做最踏实、最稳定、最长效的站群系统,让客户找到你,爱上你,成交你

XSzeng企业性价比主题

简约高端企业通用产品展示WordPress主题,功能上可满足任意企业官网的使用

XShuan企业主题

SEO排名最好的wordpress企业主题,百度最喜欢的wordpress主题

XSkobe营销型主题

XSkobe帮你拥有一个媲美中联重科官网的企业网站

XSpx教育培训主题

主题功能模块丰富,可以充分展示教育培训机构的特点和功能

XStie科技主题

精致简约风格的wordpress企业模板,为科技IT公司量身打造

XStop定制型主题

wordpress企业主题制作历史以来,水平最高的一款主题。

XShw公司展示主题

面向公司官网搭建需求的中小型企业公司的WordPress企业主题

XSgr集团官网主题

打造高品质官网,设计美观大方

XSdj品牌宣传主题

结构清晰,界面简洁,核心产品展示全面,中小企业建站首选

XSdd外贸主题

wordpress外贸主题适用于任何类型的站点,本主题远低于定制一个网站的价格

WordPress模板建站常见问题

建站技术服务费用是一次性的,次年无需在我方续费。
域名与服务器均需在对应的域名和服务商按照其次年费用续费,以免造成网站无法打开的情况。
超出合同和服务范围或服务到期后,双方按照一事一价,议价合作。
准备好域名,服务器,公司介绍,产品资料,包含文字,图片,视频等。
域名和服务器是公司知识产权,你最好用自己的信息去购买,免得日后有权限问题。
在代码质量,性能,安全性,SEO和可靠性方面,我们所有的主题模板都是一样的。
所有主题,后台功能都一样(文章发布,产品发布),只是前端界面显示模块多与少的区别。
售后服务包含WordPress主题模板的使用问题,我们可以协助你安装并调试购买的WordPress主题模板,一对一售后服务,支持远程协助。
文章、产品、分类等无限添加,后期可以进行增、删、改、查。
肯定是的!在开发过程中我们非常注重搜索引擎的优化,并借助WordPress平台的SEO优势,可以不需要任何插件即可自动获取也可自定义每个页面的SEO机制。
WordPress是世界上最安全的程序,注意密码复杂度和不随意安装免费插件就能让网站安全性大大提高。
可以的,我们可以在文章中添加视频和文档。
是的,WordPress 对初学者很友好,提供直观的界面。借助预先设计的主题和插件,即使没有技术知识的人也可以建立一个功能齐全的网站。
可以签合同,提供普通发票,如需其他发票,请提前告知。

WordPress定制案例

按照你的行业属性、特点,设计符合该行业风格和需求的网站。
利于百度推广、谷歌推广,提升网站获客能力。

全部案例

青岛歌尔微电子

歌尔微电子股份有限公司(Goermicro)成立于2017年10月,是歌尔股份有限公司的子公司

广州芯德科技

芯德研发设计并生产销售的产品主要包括光网络单元(ONU/ONT)、光线路终端(OLT)、语音网关(VoIP网关)等系列接入产品。

广州誉隆包装

致力于为餐饮连锁企业、超市和食品企业提供供应链管理和包装解决方案。

广州振华汽配

广州振华汽配公司多年来一直大在汽车电子零部件方面,拥有自己的研发团队跟成熟的生产技术

苏州智鑫航五金机电

专业从事线性运动工业品的集成商,主营滚轮导轨,V型导轨

苏州天瀚精密

领先的精密运动控制解决方案服务商

深圳华大基因NIFTY

华大基因作为中国基因行业的奠基者,秉承“基因科技造福人类”的愿景

醴陵陶瓷

醴陵陶瓷是生产世界级定制陶瓷餐具产品的领导者,为全球的品牌所有者、批发商和分销商提供服务

东莞绿能集团

东莞绿能集团专业从事太阳能连接器、太阳能电缆等光伏连接系统产品的研发和生产

苏州格美纳电器

苏州格美纳电器是一个提供生活创意小电器的品牌

深圳三南科技

致力于LED灯箱照明、LED室内外装饰照明、LED智能控制等产品的研发、生产、销售及服务、创新的高科技企业。

杭州通普机电

专业生产锂电自行车的企业,本公司致力于中国脚踏锂电助力自行车驱动系统、控制系统、助力系统的研发制造和销售。

醴陵市博物馆

为醴陵市文化旅游广电体育局管理的副科级公益一类事业单位

WordPress定制建站常见问题

可以签合同,提供普通发票,如需其他发票,请提前告知。
不包含域名和空间。如需代购,可以提前说明,我们提供一条龙服务。
备案制度仅仅限于服务器在大陆的主机;服务器在国外和香港等不需要备案;国内购买的com域名需要实名制才能解析。
建站技术服务费用是一次性的,次年无需在我方续费。
域名与服务器均需在对应的域名和服务商按照其次年费用续费,以免造成网站无法打开的情况。
超出合同和服务范围或服务到期后,双方按照一事一价,议价合作。
售后服务仅包含网站的使用问题,我们可以协助你安装并调试网站,一对一售后服务,支持远程协助。
肯定是的!在开发过程中我们非常注重搜索引擎的优化,并借助WordPress平台的SEO优势,可以不需要任何插件即可自动获取也可自定义每个页面的SEO机制。
WordPress是世界上最安全的程序,注意密码复杂度和不随意安装免费插件就能让网站安全性大大提高。
除开前期的沟通准备,网站定制开发上线一般要15个工作日。

制作专业WordPress网站的最快方法

使用入门模板在几分钟内创建专业设计的网站。响应式网站模板在任何设备上都具有最佳外观和性能。

  • 步骤1

    挑选wordpress主题,上传启动

    准备好服务器和域名,在服务器上安装好wordpress程序,在到纳姆网络外贸模板中心挑选适合自己的外贸模板并上传。

  • 步骤2

    无需编码,设置网站内容

    根据企业已有的文案素材,您可以使用我们易于使用的外贸模板轻松定制网站的各个方面,无需编码知识。

  • 步骤3

    阅读主题文档,设置更多功能

    更加深入的了解wordpress模板,您可以得到一对一的模板使用文档,以确保您可以逐步设置自己的WordPress网站。

  • 步骤4

    网站上线,开启外贸营销

    你的互联网资产已经建立完成,马上开始“1+N”体系的整体互联网推广吧,我们和你一起,开创互联网大未来!

如何让线上业务更上一层楼

还没有WordPress网站

还没有WordPress网站

不管你从事什么行业,WordPress都会为你提供一个专业的主题模板。在WordPress市场上有成千上万的免费主题,适合很多中小企业。

查看所有模板
已经有WordPress网站

已经有WordPress网站

小兽WordPress诚邀你一起学习WordPress,愿与各方携手升级改善您的WordPress网站,一起交流网站加速,网站优化等问题。

马上交个朋友
微信联系
chat 扫码联系
模板建站
挑选模板
网站定制
免费诊断
咨询热线
咨询热线

189-0733-7671

返回顶部