首页 > 新闻 > 如何使用WP_Query类 [+ 3 个示例]

如何使用WP_Query类 [+ 3 个示例]

2023-01-09 小编

WordPress具有大量的内置功能,其中最整洁的功能之一是能够以多种不同的方式查询帖子和数据。WP_Query类是所有这些权力的核心,使您可以访问从帖子标题到作者信息的所有内容。

开发人员在WordPress网站上使用WP_Query类

使用 HubSpot 的 WordPress 网站工具发展您的业务

WordPress为用户提供了几种内置方法来利用这些信息,包括类别,标签,作者和搜索栏。但是,如果您想为网站访问者提供更精心策划的帖子列表怎么办?

那时你转向WP_Query类。

什么是WP_Query?

WP_Query是一个PHP类,用于构造对WordPress数据库的查询并返回帖子,页面或其他自定义对象以在页面上呈现。它允许开发人员构建复杂的搜索,同时无需编写单独的SQL查询。

WP_Query提供了用于自定义 The Loop 的快捷方式和内置函数,这是在给定页面上显示内容的过程。由于专注于The Loop,WP_Query是寻求自定义页面内容和外观的WordPress主题开发人员的首选。

鉴于The Loop的重要性,我们将与WP_Query调用的基本结构一起研究它。

如何使用WP_Query

在检查 The Loop 之前,让我们快速浏览一下下面的WP_Query语法。在最基本的级别,调用 WP_Query 并调用类的新实例。

new WP_Query();

但是,WP_Query提取的任何结果只有在分配给变量时才能进行操作。

$posts = new WP_Query();

现在,您有了用于存储从数据库中提取的内容数组的 $posts 变量。这也将允许您在下一节中与这些结果进行交互。

但是,需要强调的是,在不提供任何参数的情况下调用 WP_Query 类不会从数据库中提取任何内容。可用于WP_Query的许多参数将在后面的部分中进行研究。现在,让我们添加参数为 2 的 cat 参数(类别的缩写),这是小说类别的 ID。

$arguments = array(
   "cat" => 2
);
$fiction_posts = new WP_Query($arguments);

您可能已经注意到 cat 参数被包装在数组中。这意味着您可以提供多个参数来WP_Query优化搜索。

现在,让我们看看如何使用自定义版本的 The Loop 显示结果。

WP_Query和循环

在普通的WordPress中,The Loop决定了内容在页面上的呈现方式。您可以在下面看到循环的高级表示形式。

<?phpif ( have_posts() ) :
    while ( have_posts() ) :
        the_post();
        // Display post content
    endwhile;endif;?>

在此工作流中,have_posts() 函数检查是否有要显示的帖子。如果有,则执行一个 while 循环来获取每个帖子并使用 the_post() 函数检索其数据。然后,该数据通过HTML和其他PHP呈现到页面上。while 循环在有要显示的帖子时继续执行。

当您需要显示WP_Query调用的结果时,将重新调整上一示例中的 Loop 逻辑的用途。让我们检查一个自定义循环的示例。

<?php   // Arguments and WP_Query instance invocation
   $arguments = array(
      "cat" => 2
   );
   $fiction_posts = new WP_Query($arguments);
   // Custom loop
   if($fiction_posts->have_posts()) :
      while($fiction_posts->have_posts()) :
         $fiction_posts->the_post();
         echo the_title();
         echo the_content();
      endwhile;
   // Catch-all if no results returned
   else:
     echo "<p>No posts found.</p>";
  endif;
  wp_reset_postdata();?>

在此示例中,您将定义参数并调用 WP_Query 类的新实例来搜索数据库。然后,while 循环遍历返回的结果数组。the_title() 和 the_content() 函数提取每篇博客文章的标题和内容,并使用 echo 语句将它们呈现到页面。

如果数据库中没有帖子与提供的参数与 else 语句匹配,此示例也有一个捕获全部。否则,页面上不会显示任何内容。

最后,您会注意到文件末尾的 wp_reset_postdata() 函数调用。下一节将研究此最佳做法。

潜在的陷阱和WP_Query的解决方案

尽管WP_Query功能强大,但它有一个潜在的缺点,可能会导致严重的站点问题。幸运的是,以下各节概述了两种解决方案。

1. 重置发布数据。

在上一个示例中,自定义循环文件以 wp_reset_postdata() 结尾。如果您的循环使用 the_post(),则此函数调用是必需的。wp_reset_postdata() 函数重置全局$post对象,因此其他循环显示的帖子没有重叠。

例如,如果您在博客的主提要上为小部件添加自定义循环,则构建提要的循环可能会在恢复查询时显示查询中的帖子,而不是其自己的数组中的下一篇文章。

2. 存储全局发布对象。

此陷阱的另一种解决方法是将全局$post对象存储在临时变量中。然后,此变量用于通过重新分配其值来还原$post对象,如下所示。

<?php
   $temp_storage = $post;
   $posts = new WP_Query($arguments);
   while($fiction_posts->have_posts()) :
      // Loop commands
   endwhile;
  $post = $temp_storage;?>

WordPress Codex建议使用wp_reset_postdata(),但这两个选项都是可行的。

WP_Query自定义循环和The Loop之间的潜在冲突是WordPress插件开发人员更喜欢WP_Query类的get_posts方法的原因之一。 get_posts使用WP_Query等参数拉取相同的内容,并且每次调用都会自动进行重置过程。

现在,您已经自定义了The Loop并减轻了任何陷阱,让我们回顾一下WP_Query中可用的不同搜索条件。

WP_Query 阿格斯

WP_Query的真正强大之处在于可用于优化数据库搜索的各种参数。为这些参数指定的值称为参数(通常缩写为 args)。

WP_Query有 18 个不同的参数组可供提取:

WP_Query参数参数组

类别太多,无法单独浏览,但下一节将检查最常用的参数。您可以在WordPress Codex中更详细地查看参数组。

WP_Query 常用参数

以下是您在搜索中可能使用的参数:

  • posts_per_page:声明要返回的帖子数量
  • 作者:根据 ID 指示帖子是属于一位还是多位作者
  • cat:根据 ID 指示结果应属于一个或多个类别
  • 标签:确定帖子是否应具有标签 slug 定义的一个或多个标签
  • 排序依据:定义您希望检索到的帖子按顺序排序的条件(例如,按日期、评论数等)
  • 顺序:确定结果是按升序还是降序排序
  • post_type:确定WP_Query检索帖子、页面还是自定义帖子类型
  • post_status:确定查询是检索已发布、已计划、正在进行还是已删除的帖子

您已经在自定义循环中看到了 cat 参数的运行情况。为了进行查看,参数将与其指定的搜索值一起添加到参数数组中。您可以在下面看到参数的另一个示例。

<?php  
  $arguments = array(
      "tag" => "short-story+action"
   );
   $posts = new WP_Query($arguments);?>

在这里,查询搜索同时具有“短篇小说”和“动作”标签的帖子。如果我们想进行此查询,我们可以将加号 (+) 替换为逗号 (,)。

<?php  
  $arguments = array(
      "tag" => "short-story,spotify"
   );
   $posts = new WP_Query($arguments);?>

现在,搜索会拉取带有“短篇小说”“动作”标签的帖子。值由加号或逗号分隔的字符串是如何在WP_Query中提交多个搜索字词以扩大或缩小搜索范围的一个示例。

让我们研究一下在一个参数中提交多个值的其他方法。

在WP_Query参数中使用多个值

您经常会发现自己想要在参数中搜索多个值。例如,您可以通过向 author__in 参数添加数组来获取多个作者的帖子。该数组包含两个作者 ID 以形成一个包含范围,因此在下面的示例中拉取来自 ID 为 1-5 的作者的帖子。

<?php  
  $arguments = array(
      "author__in" => array(1,5)
   );
   $posts = new WP_Query($arguments);?>

其他参数(如 post_type)也采用包含字符串而不是 ID 的数组。您可以在下一个示例中看到此操作;这些参数告诉WP_Query从数据库中提取帖子、页面和推荐。

<?php  
  $arguments = array(
      "post_type" => array( "post", "page", "testimonial" )
   );
   $posts = new WP_Query($arguments);?>

有些参数根本不采用数组。相反,它们接受一串值。正如您在 tags 属性中看到的那样,这些值用逗号分隔,表示“要么/或”搜索,用加号分隔,表示“和”搜索。

在下面的示例中,查询将搜索 ID 为 12 的类别中的帖子或 ID 为 13 的类别中不相关的帖子。将负号添加到 13 表示应排除此类别。

<?php  
  $arguments = array(
      "cat" => "12, -13"
   );
   $posts = new WP_Query($arguments);?>

现在您已经了解了可用于优化搜索的选项,让我们检查一下 WP_Query 中的一些默认参数

WP_Query默认参数

WordPress对某些参数的参数做出假设。这样,您就不必在每次调用WP_Query时定义公共参数,并缩短代码,从而提高性能并简化调试。

但是,您应该了解这些默认参数,以便更好地了解WP_Query如何排序和返回内容,并根据需要重新定义它们。关键参数WP_Query默认参数包括:

  • post_type默认为“发布”。
  • 对于已发布的内容,post_status默认为“发布”。
  • 顺序默认为“DESC”表示降序。
  • 顺序默认为“日期”。

WP_Query中使用的不同参数和参数有许多细微差别。如有疑问,请查阅法典。

现在,让我们将这些参数付诸行动,并向数据库提交一些实际查询。

WP_Query示例

对于大多数WordPress网站,您将希望提取不同类型的内容来吸引用户的注意力或满足他们的需求。当然,WP_Query适合这份工作。以下示例演练了您可能在网站上使用的常见查询。

1. 获取本周发布的帖子。

您的用户通常对您的最新内容感兴趣,尤其是当您的网站专注于新闻或 IT 等快速发展的行业时。幸运的是,WP_Query有一个强大的系统,可以根据日期参数查找帖子。

<?php  
   $arguments = array(
      "date_query" => array(
         array(
           "year" => date( "Y" ),
           "week" => date( "W" ),
         )
      )
   );
   $posts = new WP_Query($arguments);?>

在此示例中,查询搜索本周发布的帖子。我们使用 date_query 参数来实现这一点,它接受其数组中的多个日期参数。

为了以当前周为目标,第二个数组嵌套在具有年份属性的date_query数组中。这些值是使用内置日期函数设置的。“Y”和“W”参数是当前年份和周的简写。这意味着查询将提取本周没有任何更新,以确保您的网站访问者始终看到最新帖子。

如果要定位其他日期,可以添加其他date_query数组,如下所示。

<?php  
   $arguments = array(
      "date_query" => array(
         array(
           "year" => date( "Y" ),
           "week" => date( "W" ),
         )
      ),
      "date_query" => array(
         array(
            "year" => 2021,
            "month" => 12,
            "day" => 14,
         )
      ),
   );
   $posts = new WP_Query($arguments);?>

现在,查询将定位本周的帖子以及 2021 年 12 月 14 日发布的任何帖子。

2. 获取同一作者在同一类别中的帖子。

接下来,让我们看一下另一种常见的内容产品。读者已经读完了一篇文章,所以如果他们有兴趣阅读更多文章,你需要提供一行类似的帖子。为此,查询将搜索同一作者的帖子,并且与当前帖子属于同一类别。

<?php  
   $arguments = array(
      "author_name" => "stephen",
      "category_name" => "fiction",
      "posts_per_page" => 3,
   );
   $posts = new WP_Query($arguments);?>

该示例搜索author_name与“stephen”user_nicename匹配且“fiction”category_name参数匹配的帖子。由于相关帖子小组件通常显示三个帖子,因此该示例在 posts_per_page 参数中设置此限制。这样可以提高性能,因为查询不会拉取无关的发布数据。

请注意,WP_Query默认按日期降序对结果进行排序,这意味着将显示符合这些条件的最新帖子。如果要根据不同的参数显示结果,可以在上面的示例代码中调整 orderby 和 order 参数。

默认情况下,下一个示例将覆盖订单。

3.获取同一类别的热门帖子。

与上一个示例类似,您可能希望提供有关读者正在参与的主题的其他帖子。您可以使用 orderby 参数并将其设置为 comment_count 参数来实现此目的。

<?php  
   $arguments = array(
      "category_name" => "fiction",
      "orderby" => "comment_count",
      "posts_per_page" => 5,
   );
   $posts = new WP_Query($arguments);?>

该查询搜索小说类别中的帖子,按评论数对结果进行排序,并显示评论最多的五个帖子(因为大多数侧边栏小部件在五个时被切断)。

同样,默认顺序参数保留为降序,以便首先显示参与度最高的帖子。

使用WP_Query构建新体验。

WordPress的数据库提供了大量机会来搜索您网站的内容并为您的用户发现新产品。WP_Query是构造这些查询并在页面上显示结果的有效方法。

考虑到可用于优化搜索的参数和参数层,WP_Query是发现帖子之间联系并通过及时和相关的内容产品改善读者用户体验的理想方法。


*必填

您好,访客!有什么新鲜事想告诉大家?

点击按钮快速添加回复内容: 高兴 支持 激动 给力 加油 生气 路过 威武
发表
暂时还没评论,等你发挥!