欢迎光临
我们一直在努力

掌握 WP_Query:相关的函数

建站超值云服务器,限时71元/月

本文目录
[隐藏]

  • 1掌握wp_query的强大功能,从函数(Functions)、行动器(Actions)、过滤器(Filters)着手
  • 2WP_Query 相关的函数
    • 2.1获取公用的查询参数:get_query_var()
    • 2.2关联主循环:query_post()
    • 2.3获取一篇文章:get_post()
    • 2.4保存查询结果到数组中:get_posts()
    • 2.5获取页面:get_pages()
    • 2.6判断查询是否返回了文章:have_posts()
    • 2.7运行loop循环:the_post()
    • 2.8建立$post数据:setup_postdata()
    • 2.9清除当前的loop循环:rewind_posts()
    • 2.10重置$post:wp_reset_postdata()
    • 2.11重置查询: wp_reset_query()
    • 2.12判断是否当前查询为主查询:is_main_query()
    • 2.13判断是否在loop循环中:in_the_loop()
  • 3第二部分完

本文是《掌握 WP_Query》系列教程的第 3 部分,该系列共包含以下 19 个部分:

  1. 掌握 WP_Query : 入门介绍
  2. 掌握 WP_Query:教你使用Loop循环
  3. 掌握 WP_Query:相关的函数
  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:结尾

大家好,欢迎来到“掌握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对象中,检索公共变量。有两个参数:第一个返回值,第二个在第一个没有设置的情况下返回默认值。

1
2
3
4
5
<?php
 
$paged = get_query_var( 'paged', 1 );
 
?>

<?php $paged = get_query_var( ‘paged’, 1 ); ?>

关联主循环:query_post()

如实的讲,这是一个很差劲的函数。可以完全不用使用它,但是为了讲明白“正确的方式”使用它,我们将会学习它,并且告诉你什么是“差劲的功能”。

Query_posts()是用来与主查询进行替换的,把主查询放在一边,并开始一个新的查询——如之前提到的,需要在查询完后使用wp_reset_query()。

1
2
3
4
5
<?php
 
query_posts( 'category_name=news' );
 
?>

<?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”进行排列结果。
1
2
3
4
5
6
<?php
 
$first_post = get_post( 1, ARRAY_A );
$post_title = $first_post[ 'post_title' ];
 
?>

<?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循环的功能。

1
2
3
4
5
6
7
8
9
10
11
12
13
<?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 );
 
?>

<?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)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?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 );
 
?>

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

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
 
if ( have_posts() ) {
 
    // Success.
 
} else {
 
    // Failure.
 
}
 
?>

<?php if ( have_posts() ) { // Success. } else { // Failure. } ?>

运行loop循环:the_post()

官方文档:the_post()重置了loop循环中的文章索引,它主要做了以下几件事:

  1. 获取下一个查询结果。
  2. 建立$post数据
  3. 设置in_the_loop参数为TRUE.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php
 
if ( have_posts() ) {
 
    while ( have_posts() ) {
 
        the_post();
 
        the_title();
 
        the_content();
 
    }
 
}
 
?>

<?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参数的一个参考。

1
2
3
4
5
6
7
<?php
 
global $post;
 
setup_postdata( $post );
 
?>

<?php global $post; setup_postdata( $post ); ?>

清除当前的loop循环:rewind_posts()

另一个可以从字面上知道其功能的函数是rewind_posts(),完成了“倒回”循环的函数,所以在接下来可以重新运行它。

1
2
3
4
5
6
<?php
 
// After the loop.
rewind_posts();
 
?>

<?php // After the loop. rewind_posts(); ?>

重置$post:wp_reset_postdata()

此函数重置了主查询中的全局变量$post,推荐在第二次查询之前使用它。

1
2
3
4
5
6
<?php
 
// After a secondary query.
wp_reset_postdata();
 
?>

<?php // After a secondary query. wp_reset_postdata(); ?>

重置查询: wp_reset_query()

这个应该用来重置主循环的查询(而 query_posts 函数或 pre_get_posts 动作钩子我们将在下一个部分讲解 )。

1
2
3
4
5
6
<?php
 
// After the main query is altered.
wp_reset_query();
 
?>

<?php // After the main query is altered. wp_reset_query(); ?>

判断是否当前查询为主查询:is_main_query()

这是一个条件标签,如果当前的查询是主查询则返回true,否则返回false。简单吧?

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
 
if ( is_main_query() ) {
 
    // Success.
 
} else {
 
    // Failure.
 
}
 
?>

<?php if ( is_main_query() ) { // Success. } else { // Failure. } ?>

判断是否在loop循环中:in_the_loop()

另一个条件标签是in_the_loop(),如果在loop循环中,则返回true,否则返回false.

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
 
if ( in_the_loop() ) {
 
    // Success.
 
} else {
 
    // Failure.
 

 

<?php if ( in_the_loop() ) { // Success. } else { // Failure. } ?>

第二部分完

现在我们了解到了与wp_query相关的(几乎)所有函数!下面的教程中,我们会介绍WP_Query相关的行动器(actions)和过滤器(filters)。

如果对本篇内容有任何的疑问,可以在下方留言!如果你喜欢的话,可以分享到你的朋友圈里!

阅读该系列的其他文章: 上一篇:掌握 WP_Query:教你使用Loop循环 下一篇:掌握 WP_Query:行动器和过滤器

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » 掌握 WP_Query:相关的函数
分享到: 更多 (0)