如何使用WP_Query检索想要的任何帖子
如果您过去构建过简单的主题,那么很可能不需要自己检索帖子。毕竟,WordPress 会在主页上加载最近的十篇帖子,并在存档页面上加载正确的帖子。那么更复杂的情况呢?如果您想要某种站点地图,并且想要按日期顺序列出所有帖子和页面,该怎么办?
WP_Query 是您的好朋友,它允许您根据条件从数据库中提取帖子。您还可以检索包含特定标签的单个类别中的所有帖子。您可以检索去年创建的所有页面和没有特色图片的帖子。
在这篇文章中,我将深入了解 WP_Query 的工作原理,为你解释如何使用WP_Query检索想要的任何帖子!
自定义循环
![如何使用WP_Query检索想要的任何帖子 2 如何使用WP_Query检索想要的任何帖子](https://www.pythonthree.com/wp-content/uploads/2025/02/1737986727-如何使用WP_Query检索想要的任何帖子.webp)
正确使用自定义查询的关键是掌握可以传递给它们的参数。在研究这一点之前,让我们先创建一个可用于列出帖子的快速“骨架”。常规存档页面上的循环如下所示:
<?php if ( have_posts() ) : ?>
<?php while( have_posts() ) : the_post() ?>
<!-- Display Post Here -->
<?php endwhile ?>
<?php else : ?>
<!-- Content If No Posts -->
<?php endif ?>
这很好用,因为在页面加载之前,WordPress 已经检索了正确的帖子。当我们编写自定义查询时,我们需要一个自定义循环。代码非常相似,如下所示:
<?php
$args = array(
'post_type' => 'post',
'post_status' => 'future'
);
$scheduled = new WP_Query( $args );
if ( $scheduled->have_posts() ) :
?>
<?php while( $scheduled->have_posts() ) : $scheduled->the_post() ?>
<!-- Display Post Here -->
<?php endwhile ?>
<?php else : ?>
<!-- Content If No Posts -->
<?php endif ?>
我们使用WP_Query类创建一个新的 WordPress 查询,并向其传递参数以指定我们需要的帖子类型。然后我们在$scheduled对象上调用have_posts()和the_post()方法。
如果您是面向对象编程的新手,并且不太明白为什么,请不要担心,您仍然可以轻松使用自定义查询。我们将在整篇文章中重点介绍$args数组,这将非常简单。
推荐:WordPress函数register_sidebars()为主题或内部创建多个侧边栏
简单参数
正如我所提到的, WP_Query的主要“知识体系”在于其参数。Codex列出了所有参数,我们将在这里介绍最有用的参数。
有些参数非常简单,例如tag或tag_id参数。前者采用标签 slug,后者采用标签 id。您还可以用逗号分隔多个项目,或使用否定 id 来表示您想要检索未附加该特定标签的帖子。
$args = array(
'post_type' => 'post',
'tag_id' => '22,92,44,-21'
);
$our_posts = new WP_Query( $args );
该代码片段将检索带有前三个标签但不带有第四个标签的文章。虽然该系统功能强大,足以满足简单需求,但我通常使用更灵活的分类查询,稍后我将讨论该查询。
author 、author_name、cat、category_name、s (用于搜索词)、 post_status 、post_type是一些更简单的字段的示例。请注意,某些字段(如post_status)要求您传递状态数组(如果您想使用多个值)。
$args = array(
'post_type' => array( 'post', 'page' ),
'post_status' => array( 'draft', 'publish' ),
'cat' => 'music,videos'
);
$our_posts = new WP_Query( $args );
上述示例检索所有页面、帖子、已发布或处于草稿状态且分配有音乐或视频类别的帖子。这可用于显示与音乐或视频相关的任何当前或计划内容的标题。
推荐:如何在不使用插件的情况下设置WordPress SMTP
分类查询
对于简单的东西,使用上述参数根据类别或标签检索帖子就足够了,但如果您有自定义分类法,或者需要组合多个参数怎么办?答案在于tax_query参数,它本身就是一个数组。让我们先看一个例子。
$args = array(
'post_type' => 'book',
'tax_query' => array(
array(
'taxonomy' => 'genre',
'field' => 'slug',
'terms' => array( 'scifi', 'thriller' ),
'operator' => 'NOT IN',
),
array(
'taxonomy' => 'author',
'field' => 'id',
'terms' => array( 92, 883, 399 ),
),
'relation' => 'AND',
),
);
$query = new WP_Query( $args );
在这里,我们从“书籍”帖子类型中检索一些帖子,并添加一些分类参数。使用 tax_query 中定义的两个数组,我们指定要提取作者 92、883 或 399 撰写的不属于科幻或惊悚类型的书籍。关系参数定义两个数组之间的关系。在我们的例子中,它是一个“和”关系,这意味着必须满足两个条件。
如果我们使用“或”,我们将检索不属于科幻或惊悚类别或由指定三位作者撰写的书籍。用简单的英语来说,这意味着:我想查看除科幻和惊悚类型之外的所有书籍。但是,我想查看 Terry Pratchett、Douglas Adams 和 Stephen King 的所有书籍,无论其类型如何。
推荐:WordPress函数get_terms()检索分类法或分类法列表中的term
元查询
元查询在结构上与分类查询非常相似,但它们使用帖子元表中的数据来过滤帖子。以下代码将显示所有包含特色图片的已发布帖子。
$args = array(
'post_type' => 'post',
'meta_query' => array(
array(
'key' => '_thumbnail_id',
'value' => '',
'compare' => '!=',
),
),
);
$query = new WP_Query( $args );
WordPress 使用_thumbnail_id字段存储帖子的特色图片 ID 。因此,如果我们检索此元值不为空的所有帖子,我们最终应该会得到所有具有特色图片的帖子。
这里的秘诀是知道如何使用compare属性和type。您可以使用许多熟悉 SQL 的值:’=’、’!=’、’>’、’>=’、'<‘、'<=’、’LIKE’、’NOT LIKE’、’IN’、’NOT IN’、’BETWEEN’、’NOT BETWEEN’、’EXISTS’(从 WordPress 3.5 及更高版本开始)和 ‘NOT EXISTS’(从 WordPress 3.5 及更高版本开始)
当您想要比较数字或日期时,类型属性通常很重要。可能的值是“NUMERIC”、“BINARY”、“CHAR”、“DATE”、“DATETIME”、“DECIMAL”、“SIGNED”、“TIME”、“UNSIGNED”。请记住在比较数字时使用NUMERIC,在大多数其他情况下,您应该没问题。
就像分类查询一样,您可以堆叠多个需求,然后使用关系参数来指定它们之间的关系。
$args = array(
'post_type' => 'post',
'meta_query' => array(
'relation' => 'OR',
array(
'key' => 'mood',
'value' => array( 'happy', 'awesome' ),
'compare' => 'IN',
),
array(
'key' => 'income',
'value' => 500,
'compare' => '>',
'type' => 'NUMERIC'
),
),
);
$query = new WP_Query( $args );
上述示例将显示来自假设日记的帖子,其中发生了一些好事。我要么感到高兴或很棒,要么那天我赚了 500 多美元。
日期参数
日期可能有点复杂,但非常灵活。如果您需要更多信息, WP_Query 文档中有很多示例。
检索特定时间的帖子非常简单。您可以使用year、monthnum、w(一年中的星期)、day和其他几个参数来指定时间。以下代码将检索 2013 年 3 月以来的所有帖子。
$args = array(
'post_type' => 'post',
'year' => 2013,
'month' => 3
);
$query = new WP_Query( $args );
如果您想要输入更复杂的时间范围,则需要使用date_query。这允许您使用熟悉的数组格式轻松指定任意范围。以下示例(由 Codex 提供)显示了如何检索工作日上午 9 点至下午 5 点之间撰写的帖子。
$args = array(
'post_type' => 'post',
'date_query' => array(
array(
'hour' => 9,
'compare' => '>=',
),
array(
'hour' => 17,
'compare' => '<=',
),
array(
'dayofweek' => array( 2, 6 ),
'compare' => 'BETWEEN',
),
),
);
$query = new WP_Query( $args );
排序结果
列表的显示顺序与列表内的元素一样重要。值得庆幸的是,WordPress 为我们提供了order_by和order参数。order参数非常简单,您可以使用ASC或DESC来按升序或降序排序。
order_by参数可以采用多个值:’none’、’ID’、’author’、’title’、’name’、’type’、’date’、’modified’、’parent’、’rand’、’comment_count’、’menu_order’、’meta_value’、’meta_value_num’、’post__in’。按meta_value排序特别有用。在这种情况下,不要忘记同时指定meta_key字段。
$args = array(
'post_type' => 'painting',
'meta_query' => array(
array(
'key' => 'price',
'value' => 50000,
'compare' => '>',
'type' => 'NUMERIC'
),
),
'order_by' => 'meta_value_num',
'meta_key' => 'price'
);
$query = new WP_Query( $args );
此示例检索价值超过 50,000 美元的画作,并按价格升序排列。请注意,由于价格以数字形式存储,因此我使用meta_value_num对结果进行排序,而不是使用meta_value对字符串进行排序。
另一个值得一提的排序是post__in。这个post__in本身就是一个参数,它允许您指定要检索的帖子 ID 数组。默认情况下,WordPress 按日期对帖子进行排序,您在 post__in 中指定的顺序不会被保留。如果您也使用post__in作为排序值,WordPress 将保留该顺序。
$args = array(
'post_type' => 'post',
'post__in' => array( 23, 441, 12, 322, 34, 33),
'order_by' => 'post__in',
);
$query = new WP_Query( $args );
推荐:WordPress函数has_tag()函数检查帖子是否具有特定标签
总结
以上是晓得博客为你介绍的如何使用WP_Query检索想要的任何帖子的全部内容,希望从对 WP_Query 的介绍中可以清楚地看出,这确实是一个功能强大的类。它允许您以 WP 标准方式使用自己的标准检索帖子。查看其文档以获取更多信息以及该类提供的一些用于操作查询和循环的出色属性和方法。使用WP_Query 能够以模块化和可定制的方式从数据库检索对象。
推荐:Perfmatters插件使用教程轻量WordPress性能优化插件