在“掌握WP_Query
”系列的这一部分中,您将了解可与WP_Query
类一起使用的一些参数,即用于以下方面的参数:
- 状态
- 订购
- 分页
您可以使用这些参数从数据库中获取计划的帖子,查询附件,修改帖子的排序方式和排序方式,指定显示的帖子数量等等。
但是在执行此操作之前,您需要了解参数在WP_Query
如何工作。
WP_Query中的参数工作原理回顾
在开始之前,让我们快速回顾一下WP_Query
参数如何工作。 在主题或插件中编码WP_Query
时,需要包括四个主要元素:
- 查询参数,使用本教程将介绍的参数
- 查询本身
- 循环
- 完成:关闭if和while标签并重置发布数据
实际上,这将类似于以下内容:
<?php
$args = array(
// Arguments for your query.
);
// Custom query.
$query = new WP_Query( $args );
// Check that we have query results.
if ( $query->have_posts() ) {
// Start looping over the query results.
while ( $query->have_posts() ) {
$query->the_post();
// Contents of the queried post results go here.
}
}
// Restore original post data.
wp_reset_postdata();
?>
参数是什么告诉WordPress从数据库中获取什么数据,这就是我将在这里介绍的数据。 因此,我们在这里只关注代码的第一部分:
$args = array(
// Arguments for your query.
);
如您所见,参数包含在数组中。 在学习本教程时,您将学习如何对它们进行编码。
编写您的论点
有一种特定的方式可以对数组中的参数进行编码,如下所示:
$args = array(
'parameter1' => 'value',
'parameter2' => 'value',
'parameter3' => 'value'
);
您必须将参数及其值用单引号引起来,并在它们之间使用=>
,并用逗号分隔。 如果您弄错了,WordPress可能不会将所有参数添加到查询中,或者会出现白屏。
状态参数
如您所知,您是否曾经将帖子的状态从“草稿”转换为“已发布”,或者将其放入垃圾箱,WordPress会为每个帖子分配一个状态。 您可以使用post_status
参数来查询具有一种或多种状态的帖子。
可用的参数为:
-
publish
:已发布的帖子或页面。 -
pending
:帖子正在等待审核。 -
draft
:处于草稿状态的职位。 -
auto-draft
:一个新创建的帖子,没有内容。 -
future
:future
发布的帖子。 -
private
:对未登录的用户不可见。 -
inherit
:修订。 -
trash
:帖子在垃圾箱中。 -
any
:检索任何状态,但将'exclude_from_search'
设置为true的帖子状态除外(即trash
和auto-draft
)。
如果您未在查询参数中指定状态,则WordPress将默认为publish
; 如果当前用户已登录,则还将包含状态为private
帖子。 如果您在管理页面中运行查询,WordPress还将包括受保护状态,默认情况下为受保护状态,即future
, draft
和pending
。
假设您正在运行一个事件网站,并且使用事件的自定义帖子类型,使用发布日期作为事件发生的日期。 默认情况下,WordPress不会显示尚未发生的任何事件:尽管您已经安排了它们,但是它们的计划日期是将来的日期,因此它们的发布状态是将来的。
为了解决这个问题,您只需使用以下参数:
$args = array(
'post_type' => 'event',
'post_status' => 'future'
);
这将仅显示尚未发生的事件,因为这些事件将具有publish
状态。 但是,如果您还想显示发生的事件,则可以使用一系列发布状态来包含多个:
$args = array(
'post_type' => 'event',
'post_status' => array(
'future',
'publish'
)
);
查询附件时, post_status
参数必不可少。 这是因为它们具有inherit
而不是publish
的状态。 因此,要查询所有附件,可以使用以下命令:
$args = array(
'post_type' => 'attachment',
'post_status' => 'inherit'
);
另外,您可以用any
具有相同效果的inherit
替换。
订购参数
您可以使用两个参数来订购WP_Query
检索到的WP_Query
: order
和orderby
。 如您所料, order
定义了循环中帖子输出的顺序, orderby
定义了数据库中将对其排序的字段。
让我们先来看一下order
的参数。
订单参数
您可以为此使用两个参数:
-
ASC
:从最低值到最高值(1、2、3; a,b,c)的升序。 -
DESC
:从最高值到最低值(3、2、1; c,b,a)的降序。
这些是不言自明的。 如果您不包括order
参数,则WordPress将默认为DESC
。
orderby参数
您可以按一系列字段对帖子进行排序:
-
none
:无订单(适用于2.8版 )。 -
ID
:按邮寄ID排序。 请注意大写。 -
author
:按作者排序。 -
title
:按标题排序。 -
name
:按子弹标定购。 -
type
:按帖子类型排序。 -
date
:按日期排序。 -
modified
:通过最后修改日期顺序。 -
parent
:按帖子/页面的父级ID排序。 -
rand
:随机顺序。 -
comment_count
:按评论数comment_count
。 -
menu_order
:按页面顺序menu_order
。 最常用于“页面”(使用您在“编辑页面”屏幕中添加到元框的值)和“附件”(使用“插入/上传媒体库”对话框中的整数字段),但可用于启用了menu_order
任何帖子类型。 -
meta_value
:按元键(或自定义字段)的值排序。 仅当您在参数中还包含meta_key
参数时,此方法才有效。 元值是按字母顺序而不是数字顺序排序的(例如,34将排在4之前)。 -
meta_value_num
:按数字元值meta_value_num
。 与meta_value
,您还必须在查询中包含meta_key
参数。 -
post__in
:保留post__in
数组中给出的帖子ID顺序。
默认值为date
,即发布的日期。
因此,例如,如果您想按标题升序对帖子进行排序,则可以使用以下参数:
$args = array(
'orderby' => 'title',
'order' => 'ASC'
);
按多个字段排序
您不必只局限于一个字段来对帖子进行排序。 要按多个字段排序,如果要按不同的顺序对每个字段进行排序,则可以使用带有orderby
参数的数组,以及(可选)带有order
参数的数组。
因此,假设您有一个“评级自定义”字段,该字段要用于在电子商务网站中进行排序。 您可以按以下方式按评分和标题(以升序排列)进行排序:
$args = array(
'orderby' => array(
'meta_value_num',
'title'
),
'order' => 'ASC',
'meta_key' => 'rating'
);
请注意,我已经包含了meta_key
参数,以让WordPress知道我正在使用哪个自定义字段。 这样做是因为WordPress存储帖子元数据的方式 :不在wp_posts
表中,而是在wp_postmeta
表中。
但是,如果您想按降序排序,然后按标题升序排序,该怎么办? 您只需使用另一个数组:
$args = array(
'orderby' => array(
'meta_value_num',
'title'
),
'order' => array(
'DESC',
'ASC'
),
'meta_key' => 'rating'
);
当不使用帖子元数据时,也可以按多个字段排序,例如按帖子类型和日期排序:
$args = array(
'orderby' => array(
'type',
'date'
),
'order' => array(
'ASC',
'DESC'
)
);
这将按帖子类型以升序排序,然后在每种帖子类型中,按日期降序排序。
分页参数
我们接下来要使用的参数是分页。 这些帮助您定义要查询的帖子数量以及输出时的分页方式。
可用参数为:
-
nopaging
( boolean ):显示所有帖子或使用分页。 默认值为'false'
,即使用分页。 -
posts_per_page
( int ):每页显示的帖子数。 -
posts_per_archive_page
( int ):每页显示的帖子数-仅在存档页面上。 -
offset
( int ):要替换或传递的帖子数。 -
paged
( int ):存档中显示帖子的页面。 -
page
( int ):静态首页的页数。 显示通常仅在静态首页的第X页上显示的帖子。 -
ignore_sticky_posts
( boolean ):忽略发布粘性-默认为false
。
让我们看一些例子。
职位数和抵消职位
例如,显示五个最新帖子:
$args = array(
'posts_per_page' => '5'
);
或显示五个最近的帖子,但不包括最近的一个:
$args = array(
'posts_per_page' => '5',
'offset' => '1'
);
请注意,尽管您是从数据库中最新的六个帖子中获取帖子,但仍然使用'posts_per_page' => '5'
因为这是将要输出的帖子数。
进一步讲,您可以编写两个查询:一个查询显示最近的帖子,第二个查询显示除该帖子以外的其他十个帖子:
$args = array(
'posts_per_page' => '1'
);
// Query and loop go here as well as resetting posts.
$args = array(
'posts_per_page' => '10',
'offset' => '1'
);
// Second query, loop, and resetting go here.
您还可以使用posts_per_page
显示所有帖子:
$args = array(
'posts_per_page' => '-1'
);
即时贴
通常,您的粘性帖子将首先出现在任何查询中:如果要覆盖此ignore_sticky_posts
,请使用ignore_sticky_posts
:
$args = array(
'posts_per_page' => '5',
'ignore_sticky_posts' => true
);
上面的参数将返回最近的五个帖子,无论它们是否发粘。
请注意,如果只想显示粘性帖子,则需要使用get_option()
函数和post__in
参数,如下所示:
$sticky = get_option( 'sticky_posts' );
$args = array(
'posts_per_page' => '5',
'post__in' => $sticky
);
上面将显示最后五个粘性帖子:如果少于五个(例如三个)粘性帖子,则不会显示非粘性帖子,而只会显示最近的三个粘性帖子。
分页在档案中
除了定义从数据库中获取多少帖子外,您还可以使用分页参数来定义如何在存档和搜索页面上对结果帖子进行分页。
因此,例如在存档页面上,您可以使用以下代码在存档中每页显示20个帖子:
$args = array(
'posts_per_archive_page' => '20'
);
注意: posts_per_archive_page
参数将覆盖posts_per_page
。
您也可以选择仅输出在分页页面中出现在给定页面上的页面。 因此,例如,如果您想显示上面示例中第三页上显示的20条帖子,则可以使用以下代码:
$args = array(
'posts_per_archive_page' => '20',
'paged' => '3'
);
查询相同帖子的另一种方法是使用offset
参数:
$args = array(
'posts_per_page' => '20',
'offset' => '40'
);
这会跳过前40个帖子(位于前两个存档页面上),而获取接下来的20个帖子(将位于第三个存档页面上)。我最喜欢WordPress的一件事是,它经常给您带来比一种实现目标的方法!
您也可以完全关闭分页,以确保所有帖子都显示在同一页面上:
$args = array(
'nopaging' => true
);
摘要
WP_Query
类在确定要查询的帖子数,要显示的顺序以及要显示的帖子状态时为您提供了很大的灵活性。
这些参数中的一些对于查询某些类型的帖子至关重要(例如,附件的'post_status' => 'inherited'
),而其他一些则只是使您可以更好地控制查询的运行方式。
通过使用这些参数,您可以创建自定义查询,而不仅仅是输出最新发布的帖子。
翻译自: https://code.tutsplus.com/tutorials/wp_query-arguments-status-order-and-pagination--cms-23167