当前位置:首页>WordPress建站>WordPress开发>掌握 WP_Query:相关的函数

掌握 WP_Query:相关的函数

WordPress 主题 CoreNext

文本是《掌握 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循环中的文章索引,它主要做了以下几件事:

  1. 获取下一个查询结果。
  2. 建立$post数据
  3. 设置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大学 原创翻译,未经允许,禁止转载和采用本译文。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。

给TA打赏
共{{data.count}}人
人已打赏
欢迎关注WordPress大学公众号 WPDAXUE
WordPress开发

掌握 WP_Query:教你使用Loop循环

2016-2-23 17:23:52

WordPress开发

掌握 WP_Query:行动器和过滤器

2016-2-26 8:58:38

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索