嗨,欢迎来到本系列的第二部分,即“ Mastering WP_Query”。 在第一部分中,我们从简单介绍WP_Query
类是一个系列开始。 在第二部分中,我们将学习与WP_Query
相关的功能。
让我们开始!
通过函数,操作和过滤器来利用WP_Query的功能
我不是编程专家,但是我可以看到WP_Query
类是MVC模式的最佳示例之一。 一旦掌握了基础知识,它就非常强大,完全可扩展并且非常易于使用。
除了其属性,方法和参数(我们将在以后进行介绍)之外,WordPress还提供了额外的函数和挂钩(意味着动作和过滤器)来与WP_Query
类一起使用。 在本教程中,我们将了解这些函数,在下一部分中,我们将看到与WP_Query
相关的操作和过滤器。 如果您发现我忘记了什么,请随时发表评论来通知我。
WP_Query相关功能
WP_Query
类可使用13个WordPress函数,这些函数可以帮助您利用WP_Query
。 他们不需要任何介绍,所以我们开始:
获取公共查询变量: get_query_var()
我们第一个函数的名称确实说明$wp_query
:它接受全局$wp_query
对象并$wp_query
检索公共查询变量。 它有两个参数:第一个是返回其值的变量,第二个是未设置变量时返回的默认值:
<?php
$paged = get_query_var( 'paged', 1 );
?>
影响主循环: query_posts()
老实说,这是一个不好的功能。 您实际上根本不需要使用它,但是为了告诉“正确的方法”,我们将介绍它,并告诉您这是“错误的方法”。
query_posts()
是通过将主查询放在一边并运行新查询来更改主查询的函数-您需要使用wp_reset_query()
在此之后进行清理。
<?php
query_posts( 'category_name=news' );
?>
此功能是WordPress核心中最常被滥用的功能之一。 您不应该使用它来创建辅助查询-您可以使用WP_Query
类或get_posts()
函数(我们将在本教程的后面部分讨论)。 您也不应使用它来更改主查询,而应使用pre_get_posts
操作(我们将在后面讨论)。 甚至食品法典委员会也阻止我们使用它,并显示了替代方案。
底线:请勿使用。
获得一个帖子: get_post()
另一个不言自明的函数是get_post()
,您可以使用该函数获取单个帖子。 它具有三个可选参数:
- 第一个是帖子ID(或默认情况下当前帖子的ID)。
- 第二个是您将获得的结果类型:
OBJECT
,ARRAY_A
(关联数组)或ARRAY_N
(数字数组)。 - 第三个是过滤结果的选择。 默认值为
'raw'
因此除非将其设置为'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
的参数,敬请WP_Query
!)这是创建帖子列表的最佳,最有效的方法,但不是循环。
<?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 );
?>
尽管可以使用此函数毫无问题地运行“辅助查询”,但食典委建议在创建多个循环时使用WP_Query
,在获取帖子列表时建议使用get_posts()
。 Peter R. Knight用简单的术语解释了get_posts()
和WP_Query
之间的区别 :主要区别是WP_Query
进行更多的数据库查询(发布数据,元数据,作者数据和评论数据),而get_posts()
仅进行一个查询(发布)数据)。
获取页面: 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 );
?>
它接受与WP_Query
的参数非常相似的参数,但它们略有不同:
-
sort_order
:按升序(asc
)还是降序(desc
)排序页面。 -
sort_column
:如何对页面进行排序。 接受post_title
,menu_order
,post_date
,post_modified
,ID
,post_author
和post_name
。 -
hierarchical
:是否按层次结构列出页面(1
)(0
)。 -
exclude
:以逗号分隔的列表或要从列表中排除的页面ID数组。 -
include
:以逗号分隔的列表或页面ID数组,可从列表中包含并排除其他所有内容。 -
meta_key
:与meta_value
参数一起使用时,它仅包含具有已定义的meta键和值的页面。 -
meta_value
:与meta_key
参数一起使用时,它仅包含具有已定义的meta键和值的页面。 -
authors
:用逗号分隔的作者ID列表。 -
child_of
:页面的ID,仅可获取列表中的子代和孙代。 -
parent
:列出具有提供的页面ID作为父页面的页面。 为了使此参数起作用,必须将hierarchical
参数设置为0
。 -
exclude_tree
:用逗号分隔的列表或要与其子级排除的页面ID数组。 -
number
:要获取的页面数。 -
offset
:从顶部跳过的页面数。 -
post_type
:要查询的帖子类型。 自然,它默认为page
。 -
post_status
:post_status
逗号分隔的帖子状态类型列表。
检查查询是否返回帖子: have_posts()
在不接受任何参数的情况下,如果查询返回任何记录,则此函数仅返回TRUE
否则返回FALSE
。
<?php
if ( have_posts() ) {
// Success.
} else {
// Failure.
}
?>
工作循环: the_post()
食典委说 ,它“在循环中重复发布索引”。 它完成了几件事:
- 它从查询中获取下一条记录。
- 它设置
$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
,$id, $authordata, $currentday, $currentmonth, $page, $pages, $multipage, $more, $numpages
,这些变量可帮助许多模板标签在当前发布上下文中工作。 它没有分配全局$post
变量,但似乎希望它的参数是对它的引用。
<?php
global $post;
setup_postdata( $post );
?>
清除当前循环: 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
操作(我们将在下一部分中看到query_posts()
, pre_get_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.
}
?>
检查我们是否处于循环中: in_the_loop()
另一个条件标记是in_the_loop()
,如果您的代码是否在循环内运行,则仅返回TRUE
或FALSE
。
<?php
if ( in_the_loop() ) {
// Success.
} else {
// Failure.
}
?>
第二部分结束
WP_Query
—现在(可能)您知道与WP_Query
相关的所有功能! 请继续关注下一部分,我们将在其中学习与WP_Query
相关的操作和过滤器。
您对此部分有任何意见或补充吗? 请在下方评论,随时分享您的想法。 而且,如果您喜欢这篇文章,请不要忘记与您的朋友分享!
翻译自: https://code.tutsplus.com/tutorials/mastering-wp_query-related-functions--cms-22951