文本是《掌握 WP_Query(共19篇)》专题的第 3 篇。阅读本文前,建议先阅读前面的文章:
大家好,欢迎来到“掌握WP_Query”第二部分。在第一部分中,我们学习了WP_Query类,在这部分中,我们将要学习WP_Query的相关函数。
掌握wp_query的强大功能,从函数(Functions)、行动器(Actions)、过滤器(Filters)着手
我不是编程的专家,但是我知道WP_Query类是MVC模式最好的例子。当你掌握了基本知识后,你会了解到wp_query功能很强大、容易扩展和使用。
除本篇文章之外,我们在将来可能要用到的方法和参数,WordPresss都提供了另外的函数和挂钩(hooks),也就是行动器(Actions)、过滤器(Filters),用来与WP_Query类共同工作。本教程的下一部分中将会进行介绍与WP_Query相关的行动器(Actions)、过滤器(Filters)。如果其中有什么问题,可以评论提醒我。
WP_Query 相关的函数
下面介绍13个Wordpress与WP_Query相关的函数,帮助你掌握WP_Query的强大功能。不需要过多的辞藻,让我们开始:
获取公用的查询参数:get_query_var()
从函数名的字面义就可以知道:从全局变量$wp_query对象中,检索公共变量。有两个参数:第一个返回值,第二个在第一个没有设置的情况下返回默认值。
<?php
$paged = get_query_var( 'paged', 1 );
?>
关联主循环:query_post()
如实的讲,这是一个很差劲的函数。可以完全不用使用它,但是为了讲明白“正确的方式”使用它,我们将会学习它,并且告诉你什么是“差劲的功能”。
Query_posts()是用来与主查询进行替换的,把主查询放在一边,并开始一个新的查询——如之前提到的,需要在查询完后使用wp_reset_query()。
<?php
query_posts( 'category_name=news' );
?>
这是wordpress中最少用到的函数。完全可以不使用它去新建一个查询——可以直接使用WP_Query类中的get_posts()函数(后面将要介绍到)。不用使用它去替换主查询,另外可以使用pre_get_posts 行动器(action)来完成相应的操作(后面我们将会介绍到)。甚至,在wordpress官方文档中,也不推荐我们去使用它。
总之,别用它。
获取一篇文章:get_post()
另一个自明其义的函数是get_post(),可以用来取一篇文章。有3个可选参数:
- 第一个参数是文章ID(或者是默认的当前文章)
- 第二个参数是获得文章的类型:对象OBJECT、关联数组ARRAY_A或者是数值数组ARRAY_N。
- 第三个参数是可选的过滤结果。如果没有设置默认的是“行”row排列,或者你可以设置成为“编辑”edit,“显示”display,“归属”attribute或者“js”进行排列结果。
<?php
$first_post = get_post( 1, ARRAY_A );
$post_title = $first_post[ 'post_title' ];
?>
保存查询结果到数组中:get_posts()
get_posts()函数可以运行查询并保存到数组中,当需要在不同的地方使用的时候,就可以拿出来使用。需要与WP_Query相同的参数,所以定制你自己喜欢的查询吧。(我们将会在之后重新回顾WP_Query的参数,所以请继续看教程)get_posts()函数是最好也是最高效生成文章列表的非loop循环的功能。
<?php
$args = array(
'category_name' => 'news',
'order' => 'ASC',
'orderby' => 'post_title',
'posts_per_page' => -1
);
// Return an array of all posts in the "news" category.
$all_posts_list = get_posts( $args );
?>
get_posts()函数可以运行查询并保存到数组中,当需要在不同的地方使用的时候,就可以拿出来使用。需要与WP_Query相同的参数,所以定制你自己喜欢的查询吧。(我们将会在之后重新回顾WP_Query的参数,所以请继续看教程)get_posts()函数是最好也是最高效生成文章列表的非loop循环的功能。
获取页面:get_pages()
这个奇葩的函数是用来获取页面的列表的,不仅可以传递post_type参数,还可以让你选择另一篇文章类型 (前提是这个文章类型是分层的,否则返回false)。
<?php
$args = array(
'sort_order' => 'ASC',
'sort_column' => 'post_title',
'hierarchical' => 1,
'exclude' => '',
'include' => '',
'meta_key' => '',
'meta_value' => '',
'authors' => '',
'child_of' => 0,
'parent' => -1,
'exclude_tree' => '',
'number' => '',
'offset' => 0,
'post_type' => 'page',
'post_status' => 'publish'
);
$pages = get_pages( $args );
?>
这个奇葩的函数是用来获取页面的列表的,不仅可以传递post_type参数,还可以让你选择另一篇文章类型 (前提是这个文章类型是分层的,否则返回false)。
- sort_order: 是否在一个提升序排列 (asc)或降序排列(desc)。
- sort_column:如何分类页面。接受post_title、menu_order post_date post_modified,ID,post_author和post_name参数。
- hierarchical:是否分层(1)显示页面,不分层(0)
- exclude:用逗号分隔的列表、页面ID数组,用来排除get_post生成的列表结果
- include: 用逗号分隔的列表、页面ID数组,用来包含get_post生成的特定页面列表
- meta_key: 当使用了meta_key参数时,get_post的结果只会显示有meta_key的页面。
- meta_value: 当使用了meta_value参数时,get_post的结果只会显示有meta_value的页面。
- authors: 用逗号分隔的列表作者ID列表。
- child_of: 仅获取指定ID的子页面和孙页面。
- parent: 仅获取指定ID为父页面的页面,并且需要设置hierarchical为0,才能正常的返回结果。
- exclude_tree:用逗号分隔的列表、页面ID数组,用来排除get_post获取子页面列表结果
- number: 获取页面的数量
- offset: 跳过从顶部的页面数。
- post_type: 查询的类型,默认是page。(页面)
- post_status: 用逗号分隔的文章状态列表,使get_post获取到指定文章状态的列表。
判断查询是否返回了文章:have_posts()
不需要任何参数,如果是查询到了任何结果,这个函数返回true,否则的话false.
<?php
if ( have_posts() ) {
// Success.
} else {
// Failure.
}
?>
运行loop循环:the_post()
官方文档:the_post()重置了loop循环中的文章索引,它主要做了以下几件事:
- 获取下一个查询结果。
- 建立$post数据
- 设置in_the_loop参数为TRUE.
<?php
if ( have_posts() ) {
while ( have_posts() ) {
the_post();
the_title();
the_content();
}
}
?>
建立$post数据:setup_postdata()
同样,从字面义上可以理解这个函数:它建立了全局的文章数据。让我们来看看官方文档是怎么说的吧:
setup_postdata()给$id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages进行了赋值,从而使许多模板标签能够使用在当前的文章内容中。它并没有直接给参数$post进行赋值,但是从某种角度来说,是$post参数的一个参考。
<?php
global $post;
setup_postdata( $post );
?>
清除当前的loop循环:rewind_posts()
另一个可以从字面上知道其功能的函数是rewind_posts(),完成了“倒回”循环的函数,所以在接下来可以重新运行它。
<?php
// After the loop.
rewind_posts();
?>
重置$post:wp_reset_postdata()
此函数重置了主查询中的全局变量$post,推荐在第二次查询之前使用它。
<?php
// After a secondary query.
wp_reset_postdata();
?>
重置查询: wp_reset_query()
这个应该用来重置主循环的查询(而 query_posts 函数或
)。pre_get_posts
动作钩子我们将在下一个部分讲解
<?php
// After the main query is altered.
wp_reset_query();
?>
判断是否当前查询为主查询:is_main_query()
这是一个条件标签,如果当前的查询是主查询则返回true,否则返回false。简单吧?
<?php
if ( is_main_query() ) {
// Success.
} else {
// Failure.
}
?>
判断是否在loop循环中:in_the_loop()
另一个条件标签是in_the_loop(),如果在loop循环中,则返回true,否则返回false.
<?php
if ( in_the_loop() ) {
// Success.
} else {
// Failure.
}
?>
第二部分完
现在我们了解到了与wp_query相关的(几乎)所有函数!下面的教程中,我们会介绍WP_Query相关的行动器(actions)和过滤器(filters)。
如果对本篇内容有任何的疑问,可以在下方留言!如果你喜欢的话,可以分享到你的朋友圈里!
原文出自:http://code.tutsplus.com/tutorials/mastering-wp_query-related-functions–cms-22951
由 痴空见观@WordPress大学 原创翻译,未经允许,禁止转载和采用本译文。
您已阅读完《掌握 WP_Query(共19篇)》专题的第 3 篇。请继续阅读该专题下面的文章:
- 4.掌握 WP_Query:行动器和过滤器
- 5.掌握 WP_Query:WP_Query类的属性和方法
- 6.WP_Query 参数:文章、页面和文章类型
- 7.WP_Query 参数:分类和标签
- 8.WP_Query 参数:分类法(Taxonomies)
- 9.WP_Query 参数:自定义字段(Custom Fields)
- 10.WP_Query 参数:日期
- 11.WP_Query 参数:状态、排序和分页
- 12.WP_Query 参数:作者、搜索、密码、权限、缓存和返回字段
- 13.掌握 WP_Query:10个有用的例子
- 14.结合 WP_Query 与主查询(the Main Query)
- 15.掌握 WP_User_Query
- 16.掌握 WP_Comment_Query
- 17.掌握 WP_Meta_Query 和 WP_Date_Query
- 18.WordPress 4.1的查询改进
- 19.掌握 WP_Query:结尾