WordPress 自定義查詢 – 多個循環

已發表: 2021-01-29

在大多數情況下,使用 WordPress 構建網站時,您激活的主題將默認顯示一個列出您最近發布的帖子的首頁,除非您從“設置”>“閱讀”下的管理選項中選擇顯示靜態頁面。 但是,如果您想顯示既不是靜態頁面也不是您的最新帖子的不同範圍的內容怎麼辦? 幸運的是,使用 WordPress 多重循環可以做到這一點。

讓我們看看這是如何實現的!

在您的 WordPress 主頁上使用多個循環

在我們開始之前,值得注意的是,您應該使用子主題對您自己的網站進行這些修改,因為我們將編輯您主題的模板文件。 如果您不這樣做,您會發現下次更新主題時所做的任何修改都將丟失。 您可以在此處找到有關兒童主題的更多信息。

無論您使用什麼主題,主頁的相應 PHP 文件都將包含一個標準循環,顯示一些帖子(在大多數情況下,這將是最近發布的帖子)。 例如,在 Twenty Twenty 主題中,您會在index.php文件的第 79 行附近找到控制它的代碼。

 if ( have_posts() ) { $i = 0; while ( have_posts() ) { $i++; if ( $i > 1 ) { echo '<hr class="post-separator styled-separator is-style-wide section-inner" aria-hidden="true" />'; } the_post(); get_template_part( 'template-parts/content', get_post_type() ); } }

在這樣的標準循環中,使用了兩個重要的全局變量:

  • $wp_queryWP_Query類對象並保存 WP 數據庫查詢結果
  • $post是當前的WP_Post類對象。

在上面的代碼中,我們首先使用have_posts()全局函數檢查是否有任何帖子要顯示,如果有,則在 while 循環中遍歷這些帖子。 the_post()全局函數是遍歷帖子的函數,告訴 WordPress 轉到下一個帖子。

如果您想詳細了解這些函數和類,可以在wp-includes/class-wp-query.php文件中找到它們。

出於我們示例的目的,我們激活了二十二十個主題,然後在名為“類別 1”的類別下創建了 6 個帖子,在名為“服務”的類別下創建了 5 個服務帖子。

為了簡單起見,我們將通過僅顯示帖子標題列表來使循環代碼盡可能簡單。

 if ( have_posts() ) { while ( have_posts() ) { the_post(); the_title( '<h3 class="entry-title">', '</h3>' ); } }

這意味著在我們的主頁中,我們將看到如下內容:

開始定制我們的主頁輸出

正如我們從上面的屏幕截圖中看到的,如果我們訪問我們的“首頁”,我們將看到 10 個最新的帖子,而不管分配給它們的類別如何。

我們現在將繼續創建我們自己的自定義主頁模板,我們將在其中包含自定義輸出。

為此,請創建一個名為custom-homepage.php的文件並將其保存在主題的文件夾中。 將以下代碼添加到此頁面:

 <?php /* * Template Name: My custom homepage template */ get_header(); if ( have_posts() ) { while ( have_posts() ) { the_post(); the_title( '<h4 class="example"></h4>' ); } } get_footer();

然後,前往您的 WordPress 管理員並創建一個名為“我的主頁”的頁面,然後從“模板”下拉菜單中選擇“我的自定義主頁模板”作為模板。

然後要將其設為默認主頁,您需要在“設置”菜單(設置 > 閱讀 > 靜態頁面)中選擇它。

此時,如果您查看您的主頁,您應該只看到從網站前端查看的頁面標題。

現在我們已經完成了這個設置,讓我們在“我的自定義主頁模板”模板中添加一些查詢。

添加自定義查詢

我們在此示例中的目標是顯示所有類別的一些最新帖子。 在此下方,我們將顯示來自名為“書籍”的自定義帖子類型的帖子。 如果您不知道如何設置自定義帖子類型,請查看文章“手動創建 WordPress 自定義帖子類型”。 包括自定義帖子類型當然是完全可選的。 如果您不想這樣做,那麼只需跳過我們引用此​​帖子類型的步驟。

讓我們首先用這個替換當前循環(在index.php中的第 79 行左右):

 $args = array( 'posts_per_page' => 8, 'orderby', 'date', 'order', 'DESC' ); $query = new WP_Query( $args ); while ( $query->have_posts() ) : $query->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile;

這個循環意味著您的主頁現在將顯示您最近的 8 個帖子(如下所示):

然後,如果您想包含自定義帖子類型“書籍”(或任何其他自定義帖子類型),我們將在第一個循環下方為書籍帖子添加第二個循環,如下所示:

 echo '<h4>Books</h4>'; $args = array( 'post_type' => 'book', 'posts_per_page' => 8 ); $query = new WP_Query( $args ); while ($query->have_posts()) : $query->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile;

前往您網站的前端並刷新頁面以確認一切正常。

拆分自定義查詢

將自定義查詢分成幾部分會很有用。 這樣做的一個原因是,如果您想在恢復初始循環之前通過顯示來自另一個類別或帖子類型的帖子來“中斷”第一個查詢。 例如,如果您想顯示某個類別的最新帖子,然後在最後以更多“最新帖子”結束頁面結束之前顯示其他內容,這很有用。

讓我們跳進去。 首先,刪除我們之前使用的custom-homepage.php文件的內容並添加以下代碼。

 <?php /* * Template Name: My custom homepage template */ get_header(); //////////// // Services Posts loop echo '<h4>Services</h4>'; $args = array( 'posts_per_page' => 3, 'category_name'=> 'services' ); $services = new WP_Query( $args ); while ( $services->have_posts() ) : $services->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; // Books Posts in between echo '<h4>Books</h4>'; $args = array( 'post_type' => 'book', ); $books = new WP_Query( $args ); while ( $books->have_posts() ) : $books->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; // Resume Services Posts loop echo '<h4>More Services</h4>'; $args = array( 'offset' => '3', 'posts_per_page' => 3, 'category_name'=> 'services' ); $services = new WP_Query( $args ); while ( $services->have_posts() ) : $services->the_post(); the_title( '<h4 class="example"></h4>' ); endwhile; //////////// get_footer();

在第一個循環中,我們從服務類別中檢索 3 個帖子。 為了在第三個循環中恢復服務類別帖子同時避免重複,我們定義了一個偏移量=> 3 。 這意味著我們會看到以下內容:

當然,您可以將偏移值更改為您想要的任何數字。

將自定義帖子添加到最新帖子查詢

如果我們想在主頁最新帖子中包含書帖怎麼辦? 默認情況下,默認循環不包含自定義帖子。 這是我們如何解決這個問題。

對於本節,我們將主頁的閱讀設置設置為“您的最新帖子”。

這裡要遵循的路線是使用pre_get_posts鉤子。 這個鉤子在wp-includes/class-wp-query.php文件中引入,用於自定義$query對象和主 WordPress 循環,你認為合適。 它在創建查詢變量對象之後但在實際查詢運行之前執行。

打開活動主題的functions.php文件並在末尾插入以下代碼:

 function homepage_add_cpt( $query ) { if ( $query->is_main_query() && is_home() ) { $query->set( 'post_type', array( 'post', 'book' ) ); } } add_action( 'pre_get_posts', 'homepage_add_cpt' );

此代碼在if條件中所做的是確保僅在主查詢運行時將修改應用於主頁。

如果您現在訪問您的主頁,您會注意到在最新帖子中,還包括自定義“書籍”帖子。

結論

幾乎無一例外,您在 WordPress 主頁的內容方面需要實現的任何目標都是可能的。 正如我們在這裡所展示的,使用 WordPress 多循環是自定義主頁上顯示的輸出的強大方法。 我們的方法只是眾多方法之一。 WordPress 對出現在您網站上的輸出提供了令人難以置信的控制級別。 嘗試使用他們提供的工具來實現您想要的!