Query_posts语句是WordPress最实用的语句之一。 正是在query_posts的作用下,WordPress的Loop循环才能够调用并显示所有文章内容。 Query_posts的魅力在于,它可以根据你的要求,通过各种各样的方式灵活地检索并过滤日志或页面。

你可以用query_posts进行简单的文章抓取,可以只抓取一篇,也可以抓取上百篇。 而说到复杂点的用法,你甚至可以利用query_posts来查询某一分类目录下某个作者发表的、带有某个标签的特定数量文章….

WordPress中文手册上有对query_posts函数的介绍,不过下面要介绍的是一些更详细更有趣的用法。

1.注意事项

首先要注意的是,使用query_posts的最好方法….就是不要用它。 Query_posts中说到: query_posts函数仅用于修改主页循环(Loop),而不是一种在页面上生成次级循环的手段。如果你希望在主循环外另外生成循环,应该新建独立的WP_Query对象,用这些对象生成循环。在主循环外的循环上使用query_posts会导致主循环运行偏差,并可能在页面上显示出你不希望看到的内容。

最恰当的方法是使用query查询类。

$query = 'posts_per_page=10';

$queryObject = new WP_Query($query);

// The Loop...

if ($queryObject->have_posts())

{ while ($queryObject->have_posts())

{ $queryObject->the_post(); the_title(); the_content();

} } ?>

2. 不同调用方法

传统的文章调用方法是以查询字符串形式传递query_posts参数(如variable1=value1&variable2=value2&…),不过后来有了新方法——用数组来设置查询参数。

// GOOD

// select 10 posts from category 1

$query = 'posts_per_page=10&cat=1';

$queryObject = new WP_Query($query);

// The Loop...

// BETTER

$query = array ( 'posts_per_page' => 10, 'cat' => 1 );

$queryObject = new WP_Query($query);

// The Loop...

?>

当然,使用哪种方法完全由个人习惯决定,不过我认为用数组更为方便,原因如下:

便于阅读

可以利用if语句更轻松地给数组添加条件,以动态生成查询

一些查询参数(某些使用频率较低的参数,如分类参数和标签参数)需要被传递数组

你可以将函数调用以参数的形式传递

3. 关于日志顺序

默认情况下WordPress日志是按日期顺序排列的,这也是大多数人的需求,不过如果能更改默认的排列顺序那就更好了。 例如你可以随意调用几篇日志,让它们显示在侧边栏。 WordPress 2.9引入了以评论的数量多寡给文章排序的功能,这样就可以更方便地向访客显示最受欢迎的文章….不过这里为了使用query_posts,我们假设一下不使用WordPress的这个功能。

// select posts ordered by comment_count

$query = 'orderby=comment_count';

$queryObject = new WP_Query($query);

// The Loop...

?>

4. Meta值

Post meta函数的实用性也很强, 我们可以利用下面的代码来显示最受欢迎的文章:

// grab posts by post count ordered in descending order

(most votes first)

$query = 'meta_key=vote_count&orderby=meta_value&order=DESC';

$queryObject = new WP_Query($query);

// The Loop...

?>

5. 日志? 页面? 附件?

你可以按文章类型调用自己想要的日志、页面或附件。 对附件的调用可能是最有趣但同时被使用频率也是最低的一个。 利用下面的代码(与上文中提到的顺序参数),你就可以根据自己的喜好在网站上显示各种媒体文件了:

// grab 1 random attachment

$query = 'post_type=attachment&orderby=rand&posts_per_page=1';

$queryObject = new WP_Query($query);

// The Loop...

?>

6. 置顶文章

WordPress在 2.7版本中引入了文章置顶功能。 这使用户选定的文章能够不受时间的排序标准,总是显示在文章列表的最上方。 实现文章置顶的标准操作是,将这些文章添加到所返回数据列表的开始部分。 你可能需要对置顶文章过滤器函数进行以下操作:

默认情况——调用最先添加的置顶文章

只调用置顶文章(适用于杂志型主题)

按正常情况调用文章,忽略文章的置顶状态

要调用所有置顶文章:

$query = 'post_type=attachment&orderby=rand&posts_per_pages=1';

$queryObject = new WP_Query($query);

// The Loop...

?>

要忽略置顶文章——让所有文章按正常排序方式显示:

$query = array( 'post__not_in' => get_option('sticky_posts') );

$queryObject = new WP_Query($query);

// The Loop...

?>

7. 抓取所有文章

你可以用几种不同的方法在网站地图和存档页等需要显示所有已发布文章的地方调用所有文章。 要调用所有已发布的文章,可以使用下面的这段代码:

// showposts is the traditional way of doing it,

but it's now deprecated so could be removed at any time

// there are still lots of themes that use showposts (including my own)

so it's worth switching over as soon as you can just in case

$query = 'showposts=-1';

$queryObject = new WP_Query($query);

// The Loop...

// the new way to do it

$query = 'posts_per_page=-1';

$queryObject = new WP_Query($query);

// The Loop...

// must admit I have never tried this myself but according

to the documentation it will work

$query = 'nopaging=true'; $queryObject = new WP_Query($query); // The Loop… ?>

8. 钩子(hooks)和过滤器(filter)

Query_posts函数一个鲜有人知的功能就是,你可以用它勾入已生成的查询。 这种行为可能有些冒险,不过实用价值很高。 WordPress有一些可以用来修改查询要素的过滤器(filter)函数。 根据对WordPress filter函数的介绍,可以用在文章查询和调用上的filter包括:

post_limits 应用于查询的LIMIT语句,该语句可返回日志数组

posts_distinct 允许插件将DISTINCTROW语句加入查询,该查询可返回日志数组

posts_groupby 应用于查询的GROUP BY语句,该语句可返回日志数组(通常情况下该数组为空)

posts_join_paged 应用于查询的JOIN语句。在计算出分页后,该查询返回日志列表(分页并不影响JOIN语句,因此该函数相当于posts_join)

posts_orderby 应用于查询的ORDER BY语句,该语句可返回日志数组

posts_request 在执行查询前,应用于将返回日志数组的整个SQL查询

posts_where_paged 应用于查询的WHERE语句。在计算出分页后,该查询返回日志数组(分页并不影响WHERE语句,因此该函数相当于posts_where)

posts_join 应用于查询的JOIN语句,该语句可返回日志数组 该过滤器函数与post_where函数一并为JOIN语句添加了一个数据库表。

posts_where 应用于查询的WHERE语句,该语句可返回日志数组

Query_posts参数数量极多且复杂,大多数人没有必要了解这些。但有时如果你想用数字型meta值来为一次查询排序,却发现meta值是字符串字段类型的(即,查询的顺序是1, 10, 11, 2, 23, 3,而你希望是按数字大小来排序:1,2,3,10,11,23)。 这时你可以用下面的代码达到效果:

add_filter ('posts_orderby', 'bm_featureHomeFilterOrder');

function bm_featureHomeFilterOrder ($order = '')

{ global $wpdb; $field = $wpdb->postmeta . '.meta_value';

$order = str_replace($field, 'CAST(' . $field . ' AS UNSIGNED)', $order);

return $order; }

9. 文章回转

文章回转功能使用户可以运行“WordPress循环”后重设主循环,然后再重新运行主循环。 调用文章回转也很容易。

那么要使用它你需要:

$query = 'posts_per_page=10';

$queryObject = new WP_Query($query);

// The Loop...

rewind_posts();

// The Loop...

?>

10. 不显示某些文章(隐藏重复内容)

最后这个方法曾经在WebLogToolsCollection上出现过。 其原理是当用户在某一个页面上使用多个WordPress循环时,用代码阻止重复内容被链接。例如,当你的网站首页显示了最新发表的日志后会继续显示分类,如果隐藏重复内容,分类下将隐藏已经显示的最新发表的日志,  从而让更多内容显示在主页上。这是WebLogToolsCollection上的原始代码:$bmIgnorePosts = array();

/**

* add a post id to the ignore list for future query_posts

*/

function bm_ignorePost ($id) {

if (!is_page()) {

global $bmIgnorePosts;

$bmIgnorePosts[] = $id;

}

}

/**

* reset the ignore list

*/

function bm_ignorePostReset () {

global $bmIgnorePosts;

$bmIgnorePosts = array();

}

/**

* remove the posts from query_posts

*/

function bm_postStrip ($where) {

global $bmIgnorePosts, $wpdb;

if (count($bmIgnorePosts) > 0) {

$where .= ' AND ' .

$wpdb->posts . '.ID NOT IN(' . implode (',', $bmIgnorePosts) . ') ';

}

return $where;

}

add_filter ('posts_where', 'bm_postStrip');

下面是改进后的:

// set the query

$query = 'posts_per_page=10';

// loop 1 - display most recent 10 posts

$queryObject = new WP_Query($query);

if ($queryObject->have_posts()) {

while ($queryObject->have_posts()) {

bm_ignorePost($queryPost->post->ID);

$queryObject->the_post();

the_title();

the_content();

}

}

// loop 2 - same query, get the next 10 posts

$queryObject = new WP_Query($query);

if ($queryObject->have_posts()) {

while ($queryObject->have_posts()) {

bm_ignorePost($queryPost->post->ID);

$queryObject->the_post();

the_title();

the_content();

}

}

?>

?php query_posts(cat)?,你未必知道的query_posts使用技巧相关推荐

  1. vue Mutation 必须是同步函数 为什么_Vue 开发必须知道的 36 个技巧「近1W字」

    Vue 开发必须知道的 36 个技巧 说明:本文并非原创,来源于segmentfault,搜索文章标题可查看原文 前言 Vue 3.x 的Pre-Alpha 版本.后面应该还会有 Alpha.Beta ...

  2. Python 程序员需要知道的 30 个技巧(转载)

    Python 程序员需要知道的 30 个技巧 原创2017-04-14 伯乐专栏/阿喵 Python开发者 Python开发者 Python开发者 微信号 PythonCoder 功能介绍 人生苦短, ...

  3. Vue 开发必须知道的 36 个技巧【近1W字】

    前言 Vue 3.x 的Pre-Alpha 版本.后面应该还会有 Alpha.Beta 等版本,预计至少要等到 2020 年第一季度才有可能发布 3.0 正式版; 所以应该趁还没出来加紧打好 Vue2 ...

  4. 5种你未必知道的JavaScript和CSS交互的方法

    随着浏览器不断的升级改进,CSS和JavaScript之间的界限越来越模糊.本来它们是负责着完全不同的功能,但最终,它们都属于网页前端 技术,它们需要相互密切的合作.我们的网页中都有.js文件和.cs ...

  5. 关于MySQL,你未必知道的!

    架构师之路年终总结(七)-MySQL篇 今年(去年)写了几万字关于MySQL的文章,年终稍作总结,希望对大家有帮助. 1.索引到底是怎么实现的? 这两篇文章很重要,讲解MySQL索引底层实现,也是阅读 ...

  6. 你未必知道的CSS故事:揭开leading的面纱

    从传承说起 作为网页排版语言,CSS跟其他专业或大众化的排版软件一样,同样植根于传统出版.传统出版,特别是铅活字印刷时代被称为"铅与火"的时代.而通过计算机软件排版印刷的时代,被称 ...

  7. html 的empty属性,你未必知道的CSS小知识:你知道table里的empty-cells属性吗?

    css里的empty-cells属性是所有浏览器都支持的,甚至包括IE8,它的用法是下面这个样子: table { empty-cells: hide; } 估计你从语义上已经猜出它的作用了.它是为H ...

  8. 计算机小技巧7,大神也未必知道的7个电脑小技巧,你会吗?

    一.不用第三方工具,也能轻松局部截图 现在我们很多人在需要截图的时候,往往使用QQ.微信或者输入法的截图工具,大家可能都知道如果想全屏截图的话,直接按下键盘上的ProntScreen键就可以,其实,局 ...

  9. 你未必知道的49个CSS知识点

    这里感觉讲解CSS非常丰富,摘抄了一些,上面是原文地址. 01.[负边距]?负边距的效果.注意左右负边距表现并不一致. 左为负时,是左移,右为负时,是左拉. 上为负时,是上移,下为负时,是上拉 07. ...

最新文章

  1. 关于CAShapeLayer的一些实用案例和技巧
  2. 【机器学习】对于特征离散化,特征交叉,连续特征离散化非常经典的解释
  3. 垂直串联六关节机器人调试手册_工业机器人有哪些应用你知道吗?
  4. 知名电商“猝死”办公地人去楼空:不发货退款难 消费者被坑哭了
  5. html中怎么在横线中加字_传说中仓颉造字,汉字是怎么演变来的?
  6. react-hooks原理
  7. ubuntu安装软件
  8. tcp 11种状态转换图
  9. 系统分析师 VS 系统架构设计师,哪个证书含金量比较高?
  10. mysql中时间不早于今天_MySQL不正确日期时间值早于1980年的日期
  11. JS入门必备基础知识(适合小白)
  12. Vue安装教程(保姆级详细教程)
  13. 蚁群算法原理及Matlab实现
  14. macOS、Shimo下载使用及路由配置
  15. 暑期JAVA学习(14.1)Map集合案例-统计投票人数
  16. mysql如何查询前几天_sql语句查询mysql怎么取前几天的数据
  17. 浅尝 | 从 0 到 1 Vue 组件库封装
  18. 声学模型训练----Acoustic Modeling
  19. python(re 模块-正则表达式)
  20. Datawhale 1月leetcode

热门文章

  1. altium designer2021版本使用探索
  2. JVM之类加载阶段详解
  3. 投影仪与电脑显示切换
  4. android擦动画,Android中动画的使用
  5. VSCode 使用过程中 字体 画面模糊
  6. Nginx 指定域名跨域请求宝塔配置
  7. Verdi 使用教程(持续更新中)
  8. 基于AI绘画的换脸教学(初级)
  9. 【githubdailyshare】微软最近在 GitHub 上开源了一个 AI 音乐项目,基于深度学习,可自动完成音乐创作
  10. Logger 日志管理