使用WP_Query的基础知识 + 代码示例

默认情况下,WordPress会自动将您的文章从最新到最旧排序。尽管访问者可以使用类别和标签搜索特定文章,但他们可能无法找到他们正在寻找的内容。要为每位访问者整理您的文章,使用WP_Query会很有帮助。

使用WP_Query,您可以自定义网站文章和页面的显示。这个PHP类使您能够简化复杂的数据库请求。作为开发人员或网站所有者,它可以帮助您自定义超出默认主题的页面。

在这篇文章中,我们将解释什么是WP_Query。然后,我们将向您展示如何在您的WordPress网站上使用它。最后,我们将为您提供一些在您的博客上实现它的方法示例。

WP_Query简介

在WordPress中,您网站的数据存储在MySQL数据库中。这包括从文章、页面和评论到您的配置设置的所有内容。

当访问者点击您的网站时,会向您的WordPress数据库发送一个请求。您的数据库检索特定的文章和页面以根据此查询显示它们。

作为网站所有者,您可以利用查询从数据库中获取特定信息。尽管您可以构建SQL查询,但这并不是检索数据的最有效方式。这就是WP_Query的用武之地。

WP_Query是一个PHP类,您可以使用它来为您的数据库构建查询。在WordPress中,这是一个内置类,每当有人搜索您的内容时就会出现。

搜索文章列表

但是,实施自定义WordPress查询可以使用户无需搜索即可找到特定内容。如果您需要在网站的前端呈现一组特定的文章,您可以使用WP_Query自定义文章类型轻松完成此操作。

例如,您可能想要创建一个WordPress自定义文章类型。要显示这些文章,您可以编写特定查询。这是您可以使用的基本代码结构

// WP QUERY
$query = new WP_Query([
'post_type' => 'press-release'
"posts_per_page => 25,
'category_name' => 'health',
]);

这可以通过自定义Loop来实现。本质上,循环是WordPress用来显示某些文章的PHP代码。WordPress知道如何根据您的WP_Query自定义文章类型中的指定条件处理和格式化每个文章。

WP_Query对开发人员也很有帮助。您可以使用此PHP类自定义WordPress主题,而无需直接查询数据库。

如何使用WordPress WP_Query(4 种方式)

现在您已经了解了WP_Query,让我们讨论如何创建您的第一个查询。这样,您可以快速轻松地自定义您的网站显示!

1.创建一个循环

您需要熟悉WordPress Loop才能开始使用。正如我们前面提到的,Loop负责从数据库中提取文章数据。它根据主题的模板文件确定内容的显示方式。

根据您设置的参数,以下是Loop可以显示的内容:

  • 来自WordPress自定义文章类型和自定义字段的内容。
  • 在您的主页上发布标题和摘录。
  • 单个文章的内容和评论。
  • 使用模板标签的单个页面内容。

在使用WP_Query自定义Loop之前,您需要了解Loop结构。这是一个基本循环的示例:

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

让我们分解这个循环的各个部分。首先,函数have_posts()将检查您的网站上是否有文章。如果是这样,while条件会继续每个文章的循环。本质上,这会通知您的数据库在您的网站上显示任何文章。

但是,您可能不想显示所有文章。通过将WP_Query代码插入循环中,您可以使WordPress仅呈现某些文章:

?php
// The Query
$the_query = new WP_Query( $args );
// The Loop
if ( $the_query->have_posts() ) {
    echo '<ul>';
    while ( $the_query->have_posts() ) {
        $the_query->the_post();
        echo '<li>' . get_the_title() . '</li>';
    }
    echo '</ul>';
} else {
    // no posts found
}
/* Restore original Post Data */
wp_reset_postdata();

这包含与ifwhile语句相同的基本循环结构。但是,还有一个额外的WP_Query 字符串。

您可以自定义Loop以仅根据您设置的参数显示与特定WordPress分类、类别或作者关联的文章。您还可以按日期、标签、自定义字段等缩小结果范围。换句话说,在使用WP_Query自定义Loop时,您可以采取许多路线。

2. 使用参数

在构建WP_Query时,您需要包含四个基本元素:

  • Query argument
  • Query itself
  • The Loop
  • Post data reset

查询中最关键的部分之一是参数(称为WP_Query args)。该参数通知WordPress您要从数据库中检索哪些数据。该参数不会显示您的所有文章内容,而是会在您的循环中设置一些条件。

您可能注意到了前面示例中的 ($args) 行。这是您将包含查询参数的地方。

构造您的WP_Query args,您需要将某些参数放在一个数组中。我们将在下一节讨论参数,但下面是基本参数的外观:

$args = array(
    'parameter1' => 'value',
    'parameter2' => 'value',
    'parameter3' => 'value'
);

例如,如果您想显示具有“cooking”标签的文章,您可以通过以下方式编写参数:

$query = new WP_Query( array( 'tag' => 'cooking' ) );

如果您不包含WP_Query参数,则不会从您的数据库中提取任何内容。如果没有这些信息,WordPress将不知道要显示哪些文章。

3. 设置参数

正如我们前面提到的,设置参数对于自定义WP_Query很重要。您可以通过指定此信息使WordPress从您的数据库中检索自定义的文章集合。

如果您不确定要在参数中包含哪些参数,WordPress提供了许多不同用途的示例。由于这些已经为您编码,因此可以在构建WP_Query时节省您的时间和精力。

以下是您可以使用的一些常用参数

  • Posts_per_page – 设置要显示的文章数。
  • Author – 按一位或多位作者缩小结果范围。
  • Cat – 指定结果应属于的类别。
  • Tag – 拉出具有特定标签的文章。
  • Orderby – 按作者、文章类型、日期等对结果进行排序。
  • Order – 按升序或降序对结果进行排序。
  • Post_type – 定义查询是否应检索文章、页面或自定义文章类型。
  • Post_status – 指定文章是否正在进行、已安排、已发布或已删除。

例如,您可能需要显示某个类别的文章。在这种情况下,您可以包含类别名称和slug:

$query = new WP_Query( array( 'category_name' => 'staff' ) );

这将拉取此WP_Query类别下的文章以及该类别的任何子项。

使用不同的参数,您还可以显示特定日期的文章。要在工作日从上午9点到下午5点显示内容,您将使用以下参数:

$args = array(
    'date_query' => array(
        array(
            'hour'  	=> 9,
            'compare'   => '>=',
        ),
        array(
            'hour'  	=> 17,
            'compare'   => '<=',
        ),
        array(
            'dayofweek' => array( 2, 6 ),
            'compare'   => 'BETWEEN',
        ),
    ),
    'posts_per_page' => -1,
);
$query = new WP_Query( $args );

您可以使用的参数数量实际上是无限的。通过在您的参数中包含这些自定义条件,您的WP_Query可以成功地呈现正确的数据。

4.用方法修改类属性

由于WP_Query是一个PHP类,它包含称为属性的常量。这些是PHP类的变量。

WordPress的开发人员建议不要直接更改WP_Query属性。但是,您可以使用方法与它们进行交互。

方法的工作方式与函数类似。当您修改WP_Query的方法时,您可以自定义检索到的数据。

在WP_Query的文档中,列出了许多基本任务的函数。例如,包含reset_postdata() 函数可能是编写WP_Query的重要步骤。此方法将重置$current_post和$post的属性。

这可能是这样的:

<?php
// the query
$the_query = new WP_Query( $args ); ?>
 
<?php if ( $the_query->have_posts() ) : ?>
 
    <!-- pagination here -->
 
    <!-- the loop -->
    <?php while ( $the_query->have_posts() ) : $the_query->the_post(); ?>
        <h2><?php the_title(); ?></h2>
    <?php endwhile; ?>
    <!-- end of the loop -->
 
    <!-- pagination here -->
 
    <?php wp_reset_postdata(); ?>
 
<?php else : ?>
    <p><?php _e( 'Sorry, no posts matched your criteria.' ); ?></p>
<?php endif; ?>

最终,如果您在查询中使用the_post()函数,则必须使用此方法。这可确保模板标签使用主查询的当前文章。

以下是一些可用于修改WP_Query属性的其他方法:

  • get_posts– 根据给定变量检索后数组。
  • have_posts– 确定文章是否在循环中可用。
  • generate_postdata– 显示文章。
  • fill_query_vars– 完成参数中未列出的查询变量。

根据您提供的信息,您可以自定义WP_Query以执行所需的功能。这是修改类属性的一种灵活、安全的方法。

WP_Query的例子

一旦您了解了WordPress的WP_Query的基础知识,您就可以开始使用它来自定义您的网站设计。由于您可以定义各种参数,因此选项几乎是无穷无尽的。

让我们讨论一些常见的WP_Query示例,给您一些启发!

1. 某一分类的最新文章

一般来说,在线用户对新内容最感兴趣。访问者阅读您的一篇文章后,您需要提供一些相关内容。通过推荐类似的、更新的文章,您可以将用户引导至他们可能喜欢的其他内容。

此WP_Query对于具有时间敏感文章的网站特别有用。例如,访问者可能会阅读有关记忆丧失的科学文章。使用WP_Query,您可以通过最新研究突出显示类似主题:

某分类文章推荐

如果您想提取特定类别中的最新文章,请粘贴此WP_Query:

<?php
 
// Get the current post id.
$current_post_id = get_the_ID();
 
// Get the current post's category (first one if there's more than one).
$current_post_cats = get_the_category();
$current_post_first_cat_id = $current_post_cats[ 0 ]->term_id;
 
// Setup arguments.
$args = array(
    // Get category's posts.
    'cat' => $current_post_first_cat_id,
    // Exclude current post.
    'post__not_in' => array( $current_post_id )
);
 
// Instantiate new query instance.
$my_query = new WP_Query( $args );
 
?>

使用您网站的信息编辑此查询后,您可以显示与访问者刚刚阅读的文章相似的文章。这可以有效地将用户引导至相关的当前信息,而无需搜索。

2. 本周发布的文章

如果您有专门的追随者,读者会希望在您的最新文章发表后立即阅读它们。当您可以设计您的网站以展示最近的文章时,您可以提供最相关的信息。

特别是如果您托管一个新闻网站,您需要将您的文章从最新到最旧格式化。这样做可以使用户快速轻松地找到对时间敏感的内容。

最新发布文章列表

使用WP_Query,您可以根据文章的日期设置参数。通过仅检索过去一周发布的文章,您可以防止用户看到过时的文章:

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

当您自定义date_query参数,您可以定位最近发布的文章。尽管您可以包含自己的自定义值,但突出显示过去一周撰写的文章可能会很有效。

同样,您可以宣传大多数观众喜欢的文章。通过通知用户另一个文章获得了很多参与,它可以鼓励他们点击文章以了解更多信息。

由于WordPress不会跟踪您的文章查看次数,您可能需要自己添加此功能。您可以使用插件来执行此操作,但这会降低您的网站速度。

使用WP_Query,您可以根据评论数量推荐其他热门文章。这样可以轻松显示您最喜欢的文章:

更受欢迎文章推荐

以下是可用于根据受欢迎程度构建推荐的数据:

<?php
 
// Setup arguments.
$args = array(
    // Order by comment count.
    'orderby' => 'comment_count'
);
 
// Instantiate new query instance.
$my_query = new WP_Query( $args );
 
?>

您还可以根据某个类别缩小这些结果的范围。只需添加一个带有您的类别名称的参数:

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

这也将建议限制为五个职位。如果需要,您可以使用不同的数字编辑此值。

4.同一作者和类别的文章

当访问者阅读您的博客文章时,他们可能真的很喜欢该内容。他们可能只是更喜欢作者的写作风格或一般主题。

在这种情况下,您可以使用WP_Query提供类似的文章推荐。这样,读者可以点击其他文章继续阅读:

作者相关文章推荐

要构建一行类似的文章,您需要实现一个特定的WP_Query字符串。这将在您的网站上搜索具有相同作者和文章类别的博客文章。

这是您可以使用的代码:

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

实现此代码时,您需要将‘john’替换为作者的姓名。然后,删除“fiction”并包含您的类别标签。最后,随意修改页面上显示的文章推荐数量。

5. 作者的年发布文章

如果你经营一个更突出的博客,你可能有很多不同的作者写文章。有人阅读您的一篇文章后,他们可能希望更轻松地找到该作者的其他文章。

在这种情况下,您可以列出作者在过去一年中的文章。这可以为访问者提供有关作者的信息以及他们以前的作品列表:

作者文章归档页

要开发作者的年度文章列表,您可以使用此 WP_Query:

<?php
 
// Get the year we're in.
$current_year = date( 'Y' );
 
// Setup arguments.
$args = array(
    // Get the author with the nicename "john".
    'author' => 'john',
    // Get his posts from this year.
    'year'   => $current_year
);
 
// Instantiate new query instance.
$my_query = new WP_Query( $args );
 
?>

此数据将提取特定作者撰写的所有文章。它还将根据本年度细化这些结果。例如,它不会列出一年多以前发表的任何文章。

6.预览计划发布的文章

为了让您的观众先睹为快,您可以在您的网站上列出您预定的文章。使用WP_Query,您可以显示新文章的标题和摘录。

这有助于在您发布文章之前引起对文章的兴趣。另外,使用WP_Query很容易实现:

<?php
 
/*
 * Usage with Excerpts:
 *
 * <?php echo tutsplus_show_drafts(); ?>
 *
 * Usage without Excerpts:
 *
 * <?php echo tutsplus_show_drafts( false ); ?>
 */
 
function tutsplus_show_drafts( $show_excerpts = true ) {
 
    // Setup arguments.
    $args = array(
        'post_status' => 'future',
        'nopaging' => true
    );
 
    // Instantiate new query instance.
    $my_query = new WP_Query( $args );
 
    // Check that we have query results.
    if ( $my_query->have_posts() ) {
 
        // Begin generating markup.
        $output = '<section class="pending-posts">';
 
        // Start looping over the query results.
        while ( $my_query->have_posts() ) {
 
            $my_query->the_post();
 
            // Output draft post title and excerpt (if enabled).
            $output .= '<div class="pending">';
                $output .= '<h3 class="pending-title">' . get_the_title() . '</h3>';
                    $output .= get_the_title();
                $output .= '</h3>';
 
                if ( $show_excerpts ) {
 
                    $output .= '<div class="pending-excerpt">';
                        $output .= get_the_excerpt();
                    $output .= '</div>';
 
                }
 
            $output .= '</div>';
 
        }
 
        // End generating markup.
        $output .= '</section>';
 
    } else {
 
        // Let user know that nothing was found.
        $output = '<section class="drafts-error">';
            $output .= '<p>' . __( 'Nothing found', 'tutsplus' ) . '</p>';
        $output .= '</section>';
 
    }
 
    wp_reset_postdata();
 
    return $output;
 
}
 
?>

这将自动设置您预定的文章标题的预览。如果需要,您还可以包含摘录。

小结

WP_Query提供了一种更简单的方式来执行WordPress数据库请求。使用这个PHP类,您可以自定义站点的显示并为每个在线访问者提供独特的体验。

以下是您可以在WordPress中使用WP_Query的四种方式:

  1. 创建一个循环。
  2. 使用查询参数。
  3. 设置具体参数。
  4. 修改类属性。

当您掌握了WordPress这些WP_Query技术的窍门后,您将能够根据受欢迎程度、日期、作者等来推荐特定的文章。

本文提到: