wordpress 的 query_posts函数
WordPress函数query_posts在WordPress主题中是用于控制哪些文章可以出现在主循环中。
可能说主循环很多人都不懂,那么举个例子:
首页、存档页的这些文章(包括分页中的)都是在主循环中的。在不使用query_posts函数控制的情况,首页、存档页等都是按照文章的发布时间列出你博客上所有已发布的文章,而如果你想定义哪些文章可以显示,哪些文章不显示,文章按照什么样的方法排序等,那么你就要用到query_posts函数了。
WordPress函数query_posts非常强大,参数无数,用法更是无数,下面简单汇总一下query_posts函数的常用方法。开始之前,你可以先看看query_posts的官方文档。看文档对很多人来说可能会很困难,但是要成为一名优秀的主题开发者,学会看文档才是王道。
query_posts() 可以用来控制在循环(Loop)中显示哪些文章。它可以替换主查询,而使用一个新的查询来获取文章。要清除 query_posts() 的新查询,可以使用 wp_reset_query() 来重置查询。
我们强烈建议您使用 pre_get_posts 来替代 query_posts() ,同时使用 is_main_query 来检查主查询。
举个例子,在首页(homepage),你可以看到最新的10篇文章。如果你想仅仅显示 5 篇文章(不在乎分页),你可以像这样使用 query_posts() :
[pcsh lang="php" tab_size="4" message="" hl_lines="" provider="manual"]
query_posts( 'posts_per_page=5' );
[/pcsh]
下面是在 functions.php 中使用 pre_get_posts 实现类型的结果:
[pcsh lang="php" tab_size="4" message="" hl_lines="" provider="manual"]
function five_posts_on_homepage( $query ) {
if ( $query->is_home() && $query->is_main_query() ) {
$query->set( 'posts_per_page', '5' );
}
}
add_action( 'pre_get_posts', 'five_posts_on_homepage' );
[/pcsh]
注:pre_get_posts 动作无法正常工作于 页面(Page) 查询
query_posts的弊端:
改变主循环(Alters Main Loop)
query_posts() 是通过替换查询条件来改变主循环生成的内容的。一旦你使用 query_posts(), 你文章的相关的全局变量和模板标签都将改变。条件标签(Conditional tags)在你调用 query_posts() 之后也会发生改变——这可能是也可能不是预期的结果。
二级循环(Secondary Loops)
要创建 二级列表(例如:在页面底部显示相关文章列表,或者在边栏小工具中显示一个列表), 尝试使用 WP_Query 或 get_posts() 来获取文章。
如果你一定要用 query_posts() ,请确保你在上一个使用了 query_posts() 的循环结束的地方,使用 wp_reset_query() 来重置查询。
分页(Pagination)
分页将无法正常工作,除非你适当设置 'paged' 查询: adding the paged parameter
额外的SQL查询
如果你在模板页面中使用 query_posts ,WordPress 就会在 query_posts 时执行数据库查询和检索记录(即它是如何知道是服务于哪个模板页面!)所以,当你使用 query_posts() 覆盖了默认的查询,你基本上就扔掉了默认的查询以及它的结果,并重新对数据库执行了另一个查询。
这也许不是一个问题,尤其是如果你正在处理一个较小的基于博客的网站。但是对于大型网站、大型数据库以及较高的访客流量来说,你就要考虑使用其他查询方式来减少 SQL查询了,比如直接修改默认的查询(在它被请求前)。使用请求(request)过滤器可是实现这点。
参考文献:
http://www.wpdaxue.com/query_posts.html
最后更新于 2017-03-17 15:58:08 并被添加「」标签,已有 621 位童鞋阅读过。
此处评论已关闭