Products
GG网络技术分享 2025-03-18 16:07 1
假设您想通过在您网站的特定页面上查询和显示帖子的方式来做一些独特的事情。 也许您想要多个查询——一个用于精选帖子,一个用于最近的帖子。 或者您可能想从您的博客页面中排除某些类别的帖子。
无论您的目标是什么,您都决定构建一个自定义页面模板,其中的查询功能稍有不同。 但是,在开始编码之前,您需要做出决定:您应该使用哪个 WordPress 查询工具?
WordPress 包括几个不同的查询: WP_query
, query_posts()
, get_posts()
, get_pages()
, 和 pre_get_posts
. 在许多情况下,您可以使用不止一种这些工具来获得所需的结果。 然而,问题仍然存在,在 应该 你用?
在这篇文章中,我们将详细介绍这五个 WordPress 查询函数中的每一个。 我们将了解每一个是如何工作的,识别任何固有的限制或陷阱,并确定每个应该使用的场景。 在本文结束时,您将知道能够就适合您的帖子查询需求的工具做出明智的决定。
单击下面的链接以探索特定项目或继续阅读以了解所有这些选项:
让我们开始吧。
WP_Query
WP_Query
是(几乎)每个 WordPress 查询背后的类。 当您在 WordPress 中加载页面或帖子时, WP_query
目的, $query
, 被创建并提取相关的帖子或页面数据。 考虑到 WP_Query
作为支持大多数 WordPress 查询的引擎。
你用 WP_Query
即使没有意识到你正在使用它。 当您加载 URL 时,WordPress 核心会使用 WP_Query
根据您应用于网站的 URL 和设置。 因此,如果您访问带有类似 URL 的页面 http://example.com/category/wordpress WordPress 创建一个 WP_Query
定位所有帖子的对象 WordPress 类别并加载所有帖子数据。
WP_Query
为 WordPress 内置的标准帖子和页面查询提供支持,它也可用于构建自定义查询。 这是通过一些面向对象的编程来完成的。 您所要做的就是创建一个新变量并将其声明为 WP_Query
类,像这样:
当然,那么你需要对查询的结果做一些事情。 但是,这超出了本教程的范围。 相反,如果您需要帮助,请参阅本文末尾的教程列表 WP_Query
付诸实践。
作为 WordPress 开发人员,您可能会使用 WP_Query
比任何其他查询函数或钩子更频繁。 它用途广泛且功能强大。 虽然这篇文章中涉及的其他一些查询在某些情况下可能会为您节省一些击键,但一般来说,您选择不会出错 WP_Query
满足您的自定义查询编写需求。
唯一的例外是您需要做的就是过滤标准查询的结果。 在这种情况下, pre_get_posts
是您应该使用的工具。 那么接下来就让我们一起来看看吧。
pre_get_posts
pre_get_posts
是一个钩子,而不是一个函数。 而不是重新查询数据库, pre_get_posts
允许您修改 $query
查询数据库之前的对象——有效地过滤标准查询返回的结果。
在大多数情况下, pre_get_posts
与条件标签配对,过滤特定情况下的查询结果。 例如,您可以使用 pre_get_posts
在网站主页上返回不同数量的帖子。 本质上,如果您想运行标准查询但以某种方式对其进行修改, pre_get_posts
是工作的工具。
在某些情况下 pre_get_posts
将不起作用,不应使用。 WordPress Codex 提出了两个这样的例子:
pre_get_posts
过滤器不应用于更改单个页面模板上的查询,因为这样做会干扰已设置的属性 parse_query()
.pre_get_posts
如果添加到模板文件中,过滤器将不起作用,例如 存档.php 因为这些文件是在主查询已经运行后加载的。这让我们何去何从? 这意味着 pre_get_posts
是修改查询加载帖子到主页、博客页面和单个页面的主循环的绝佳选择,例如 页面.php 和 单.php.
但是,有时过滤标准查询是不够的。 也许您想使用多个 WordPress 查询,或者以一种方式处理查询结果 pre_get_posts
不允许。 在这种情况下,您可以返回 WP_Query
或继续阅读以了解其他一些选项。
query_posts()
如果你四处寻找几年前的 WordPress 教程,你会发现很多教程推荐使用 query_posts()
. 但是,现代教程几乎普遍建议不要这样做。 这就是为什么。
这 query_posts()
函数替换主查询对象, $query
,由 WordPress 核心运行的默认循环创建和使用。 它通过创建一个新的 WP_Query
实例并将其分配给 $query
目的。
这听起来好像 query_posts()
真的很强大也很有用。 然而,摆弄核心循环意味着 query_posts()
有很大的缺点,应该避免。
官方 WordPress 代码参考提供了使用 query_posts()
在绝大多数情况下都应该避免。 对此给出的主要原因包括:
query_posts()
可以通过将处理查询所需的工作量增加两倍来显着减慢页面加载时间。query_posts()
替换标准查询数据,它可能会导致任何数量的分页问题,并对使用多个查询的页面造成严重破坏。简而言之,使用 query_posts()
是一个危险的提议。 事实上,官方文档以警告开头: 此函数将完全覆盖主查询和 不适用于插件或主题. 其修改主查询的过于简单的方法可能会产生问题,应尽可能避免。
换句话说,如果你正在编写一个主题或插件——这正是 广阔的 我们大多数人都在做——避免使用 query_posts()
. 相反,创建一个全新的 WP_Query
反对或使用 get_posts()
, get_pages()
, 要么 pre_get_posts
反而。
get_posts()
想想 get_posts()
用作可修改的、预定义的实例 WP_Query
类,因为这正是它的本质。 当你使用 get_posts()
您正在有效地调用预设的默认值并使用它们来创建 WP_Query
班级。
在某种意义上, get_posts()
很像 query_posts()
:它们都是预定义的实例 WP_Query
. 但是,它们也完全不同,因为 query_posts()
替换默认值 $query
对象同时 get_posts()
只需创建一个全新的查询,它不会以如下方式干扰全局变量 query_posts()
做。
那么,使用的意义何在 get_posts()
? 为什么不直接使用 WP_Query
? 答案是方便。 如果您正在考虑使用 get_posts()
你绝对可以完成你想要完成的任何事情 WP_Query
. 但是,通过使用 get_posts()
您节省了几次击键。
之间还有一个区别 WP_Query
和 get_posts()
. 那就是后者返回一个帖子数组,而前者一次返回一个帖子 the_post()
功能。 这意味着 get_posts()
一次将所有帖子作为数组返回,而 WP_Query
一次遍历一个帖子,在每个帖子的迭代过程中回显出每个帖子的相关内容。 实际上,这意味着当使用 get_posts()
你用一个 foreach
函数显示结果,但你使用标准 if...while
循环结构在使用时回显内容 WP_Query
.
要记住的另一件事是,由于 get_posts()
不修改全局 $query
对象,你需要使用 setup_postdata()
每个帖子都可以访问 WP_Query
方法和属性。 虽然这听起来很复杂,但事实并非如此。 看一看:
所以那段代码将从 slider
类别(大概是在帖子滑块中显示它们)。 首先,我们确保查询返回的内容带有 if ( $slider_posts )
代码,然后循环浏览显示标题和内容的帖子。 通过使用 setup_postdata()
我们可以使用全局变量,例如 $id
和 $authordata
以及模板标签,例如 the_title()
和 the_content()
. 如果不设置帖子数据,我们将无法使用这些变量和模板标签。
get_pages()
一个没有引起太多关注的查询函数是 get_pages()
询问。 与这篇文章中的所有其他查询不同,这些查询都以某种方式与 WP_Query
, get_pages()
是一个绕过的函数 WP_Query
并直接查询数据库。
喜欢 get_posts()
,此函数返回它在数组中定位的内容。 然而,不同于 get_posts()
,可用于提取任何帖子类型(帖子、页面、自定义帖子类型等)的任何帖子, get_pages()
只能用于检索分层帖子类型,例如页面和分层自定义帖子类型。
此外, get_pages()
允许您指定一些分层帖子类型独有的查询参数,包括 'child_of'
, 'parent'
, 和 'hierarchical'
. 访问这些参数是您可能考虑使用此特定查询的主要原因。
在这篇文章中,我们介绍了五种强大的 WordPress 查询工具,但我们并没有真正向您展示如何使用它们。 但是,我们过去曾写过有关编写自定义查询的文章,您可以通过查看我们博客中的其他资源来了解有关如何在主题和插件中使用这些查询的更多信息:
如您所见,在查询 WordPress 数据库时,不乏选择。 WordPress 开发人员至少可以使用五种强大的工具来获取他们希望显示的数据库条目。 让我们回顾一下每个可用的选项:
WP_Query
:支持大多数 WordPress 查询的多功能类。 它很灵活,可用于创建任何类型的查询。pre_get_posts
: 一个钩子,可以用来细化 $query
查询数据库之前的对象,从而安全地修改默认查询。 将它与条件标签一起使用以优化标准查询的结果。query_posts()
: 一个强大的实例 WP_Query
替换默认值的类 $query
对象,不适用于主题或插件开发。 不要使用它。get_posts()
: 的一个实例 WP_Query
返回帖子数组的类。 它包括一系列默认值,可以为您节省一些击键次数,而不是制作自定义实例 WP_Query
,但前提是默认选项符合您的需要。get_pages()
: 一个函数,可以通过使用分层参数进行细化,并返回分层帖子类型的数组,例如页面或分层自定义帖子类型。Demand feedback