循環(huán)是 WordPress 通過主題模板文件輸出文章的默認(rèn)機(jī)制?。在循環(huán)中,WordPress 遍歷當(dāng)前頁面獲取到的所有文章,然后使用主題中的模板標(biāo)簽將其格式化并輸出。
循環(huán)從WordPress數(shù)據(jù)庫中提取每個(gè)文章的數(shù)據(jù),并在每個(gè)模板標(biāo)簽的位置插入適當(dāng)?shù)男畔ⅰQh(huán)中的所有HTML或PHP代碼都將針對每個(gè)文章進(jìn)行處理。
簡而言之,循環(huán)的名稱是真實(shí)的:它一次遍歷當(dāng)前頁面檢索到的每個(gè)文章,并執(zhí)行主題中指定的操作。
您可以用 WordPress 循環(huán)來做很多事情,例如:
- 在網(wǎng)站首頁顯示多個(gè)文章模塊
- 在文章詳情頁面顯示內(nèi)容和評論
- 在側(cè)邊欄中顯示最新文章或熱門文章
- 顯示指定文章類型或分類方法中的數(shù)據(jù)
- 根據(jù)指定的條件獲取數(shù)據(jù)并顯示在文章模塊中
您可以自定義模板文件中的“循環(huán)”以顯示和操作不同的內(nèi)容。
循環(huán)細(xì)節(jié)
循環(huán)的基本使用方法如下。
<?php
if ( have_posts() ) :
while ( have_posts() ) : the_post();
// 顯示文章內(nèi)容
endwhile;
endif;
?>
上面的代碼首先判斷是否有循環(huán),如果有,則逐個(gè)顯示循環(huán)中的內(nèi)容。
- have_posts()?函數(shù)檢查當(dāng)前頁面是否有文章。?
- 只要括號中的條件邏輯為真,?
while?循環(huán)就會繼一直執(zhí)行下去。?
使用循環(huán)
循環(huán)應(yīng)放在?index.php或其他用來顯示文章的模板中。因?yàn)槲覀儾幌朐诿總€(gè)文章中都顯示網(wǎng)站頁頭,所以循環(huán)代碼應(yīng)該放在?get_header()?之后。
<?php
get_header();
//循環(huán)從這里開始
if ( have_posts() ) :
while ( have_posts() ) : the_post();
// 顯示文章內(nèi)容
endwhile;
endif;
?>
如以上代碼所示,循環(huán)必須以?if?和?while?語句開頭,以?endwhile?和?endif?語句結(jié)束。用以顯示文章內(nèi)容的模板標(biāo)簽必須在循環(huán)開始語句和結(jié)束語句中間。
一個(gè)非常簡單的index.php文件如下所示:
<?php
get_header();
if ( have_posts() ) :
while ( have_posts() ) : the_post();
the_content();
endwhile;
else :
_e( '抱歉,未找到您需要的文章。', 'textdomain' );
endif;
get_sidebar();
get_footer();
?>
可以在循環(huán)中顯示什么
您可以在循環(huán)中使用模板標(biāo)簽顯示各種文章內(nèi)容、文章自定義字段,下面是一些常用的模板標(biāo)簽:
next_post_link():顯示在當(dāng)前文章之后?發(fā)布的文章的鏈接previous_post_link()–?顯示在當(dāng)前文章之前發(fā)布的文章的鏈接the_category():顯示當(dāng)前文章所在的分類the_author():顯示文章作者the_content():顯示文章正文內(nèi)容the_excerpt():顯示文章摘要the_ID():顯示文章或頁面 IDthe_meta():顯示文章或頁面的自定義字段the_shortlink():顯示文章的短鏈接the_tags():顯示文章所包含的標(biāo)簽the_title():顯示文章標(biāo)題the_time():顯示文章發(fā)布時(shí)間
顯示文章的時(shí)候,我們可以使用條件標(biāo)簽控制文章是否在滿足某種條件的情況下顯示。例如:
is_home()?–如果當(dāng)前頁面是主頁,則返回trueis_admin()?–如果在管理后臺返回true,否則返回falseis_single()?–如果頁面當(dāng)前僅顯示單個(gè)文章,則返回trueis_page()?–如果頁面當(dāng)前僅顯示單個(gè)頁面,則返回trueis_page_template()?–可用于確定頁面是否使用特定模板,例如:?is_page_template('about-page.php')is_category()?–如果頁面或文章具有指定的類別,則返回true,例如:?is_category('news')is_tag()?–如果頁面或文章具有指定的標(biāo)簽,則返回trueis_author()?–如果在作者的存檔頁面內(nèi),則返回trueis_search()?–如果當(dāng)前頁面是搜索結(jié)果頁面,則返回trueis_404()?–如果當(dāng)前頁面不存在,則返回truehas_excerpt()?–如果文章或頁面有摘要,則返回true
示例
下面讓我們看一些 WordPress 循環(huán)的真實(shí)使用示例。
基本示例
文章列表頁
大多數(shù)網(wǎng)站都有文章列表頁面,在列表頁面中,可以顯示這個(gè)列表中所有文章的標(biāo)題、縮略圖、摘要、分類等信息。下面的示例是一個(gè)簡單的列表頁面,示例代碼首先檢查是否有文章,如果有,顯示文章標(biāo)題、縮略圖、摘要,如果沒有,則顯示提示消息。
<?php
if ( have_posts() ) :
while ( have_posts() ) : the_post();
the_title( '<h2>', '</h2>' );
the_post_thumbnail();
the_excerpt();
endwhile;
else:
_e( '抱歉,未找到您需要的文章。', 'textdomain' );
endif;
?>
文章詳情頁
在 WordPress 中,每個(gè)文章都有自己的詳情頁面,您可以使用模板標(biāo)簽在這個(gè)頁面上顯示文章的各種信息。
在下面的示例中,模板循環(huán)顯示了文章的標(biāo)題和內(nèi)容,除此之外,您還可以顯示文章正文、文章作者、發(fā)表時(shí)間等信息。
<?php
if ( have_posts() ) :
while ( have_posts() ) : the_post();
the_title( '<h1>', '</h1>' );
the_content();
endwhile;
else:
_e( '抱歉,未找到您需要的文章。', 'textdomain' );
endif;
?>
中級示例
不同分類顯示不同文章樣式
我們來看一下模板示例,在這個(gè)示例中:
- 首先,顯示每篇文章的標(biāo)題、發(fā)布時(shí)間、作者、正文和分類。
- 然后,我們利用判斷函數(shù)?in_category()?來為分類 ID 為 3 的文章顯示不同的樣式。?
<?php
// 開始循環(huán)
if ( have_posts() ) :
while ( have_posts() ) : the_post();
// 判斷文章是否在分類 3 中,如果是,添加 CSS 類 "post-category-three". 否則,添加 CSS 類 "post".
if ( in_category( 3 ) ) : ?>
<div class="post-category-three">
<?php else : ?>
<div class="post">
<?php endif;
// 顯示文章標(biāo)題
the_title( '<h2>', ';</h2>' );
// 顯示該文章作者存檔的鏈接
printf( __( '作者 %s', 'textdomain' ), get_the_author_posts_link() );
// 顯示文章內(nèi)容
?>
<div class="entry">
<?php the_content() ?>
</div>
<?php
// 顯示逗號分隔的文章分類
_e( '文章分類 ', 'textdomain' ); the_category( ', ' );
// 關(guān)閉 div
?>
</div>
<?php
// 結(jié)束循環(huán),下面是沒有文章時(shí)顯示的內(nèi)容
endwhile;
else :
// 如果沒有文章,顯示提示消息
_e( '抱歉,未找到您需要的文章。', 'textdomain' );
// 結(jié)束判斷和循環(huán)
endif;
?>
主循環(huán)
主循環(huán)是 WordPress 中的一個(gè)非常重要的概念,在開始學(xué)習(xí)多個(gè)循環(huán)之前,您首先需要了解一下什么是主循環(huán)。
當(dāng)訪問 WordPress 站點(diǎn)的時(shí)候,WordPress 會根據(jù)您訪問的頁面新建一個(gè)文章查詢和循環(huán),設(shè)置一個(gè) $wp_query 全局變量。這個(gè)變量就是主循環(huán)數(shù)據(jù)的變量,您可以直接在頁面模板中循環(huán)這個(gè)數(shù)據(jù)來輸出文章。
看一下下面的代碼:
if ( have_posts() ) :
while ( have_posts() ) : the_post();
the_title();
endwhile;
endif;
為了說明主循環(huán),我們稍微改寫一下代碼。
if ( $wp_query->have_posts() ) :
while ( $wp_query->have_posts() ) : $wp_query->the_post();
the_title();
endwhile;
endif;
兩段代碼是等效的,為了保持代碼的簡潔性,WordPress 隱藏了全局的主循環(huán)變量?$wp_query。
多個(gè)循環(huán)
在某些情況下,您可能需要使用多個(gè)循環(huán)。例如,您可能需要在頁面頂部的內(nèi)容列表中顯示文章標(biāo)題,然后在頁面下方顯示文章內(nèi)容。因?yàn)槭褂玫氖峭粋€(gè)循環(huán),您只需要在開始第二次循環(huán)之前重置循環(huán)即可,使用函數(shù)?rewind_posts()?即可實(shí)現(xiàn)這個(gè)功能。
使用?rewind_posts()?重新開始循環(huán)
您可以使用 rewind_post() 函數(shù)讓循環(huán)從循環(huán)中的第一個(gè)元素重新開始,當(dāng)您需要在一個(gè)頁面中循環(huán)同一個(gè)查詢時(shí),這個(gè)函數(shù)非常有用。
這下面是一個(gè)rewind_posts()?示例?:
<?php
// 開始主循環(huán)
if ( have_posts() ) :
while ( have_posts() ) : the_post();
the_title();
endwhile;
endif;
// 使用 rewind_posts()再次使用這個(gè)循環(huán)
rewind_posts();
// 開始新循環(huán)
while ( have_posts() ) : the_post();
the_content();
endwhile;
?>
新建查詢和循環(huán)
對同一個(gè)查詢使用兩個(gè)循環(huán)相對容易,但并不總是您所需要的。有時(shí)候您需要在一個(gè)頁面上顯示不同的文章,例如,您需要在頁面的左側(cè)顯示所有文章,右側(cè)顯示分類「example-category」中的文章。這種情況下,您需要新建一個(gè)文章查詢,然后循環(huán)這個(gè)新的文章查詢結(jié)果,示例代碼如下:
<?php
// 顯示所有文章
if ( have_posts() ) :
while ( have_posts() ) : the_post();
the_title();
the_content();
endwhile;
else :
_e( '抱歉,未找到您需要的文章。' );
endif;
wp_reset_postdata();
// 創(chuàng)建一個(gè)新的文章查詢,獲取分類 「category_name」中的文章。
$secondary_query = new WP_Query( 'category_name=example-category' );
// 循環(huán)新的查詢結(jié)果
if ( $secondary_query->have_posts() )
echo '<ul>';
while ( $secondary_query->have_posts() ) : $secondary_query->the_post();
the_title( '<li>', '</li>' );
endwhile;
echo '</ul>';
endif;
wp_reset_postdata();
?>
如上例所示,我們首先顯示主循環(huán)中的結(jié)果。然后,使用?WP_Query 類查詢指定分類中的文章。
請注意,上面示例中的第二個(gè)循環(huán)和主循環(huán)還有一個(gè)區(qū)別:后者調(diào)用了
wp_reset_postdata()?函數(shù)來重置文章數(shù)據(jù)。
重置多個(gè)循環(huán)
在循環(huán)中,文章數(shù)據(jù)是存儲在 $post全局變量中的,在循環(huán)結(jié)束時(shí),我們需要重置這個(gè)全局變量,否則會導(dǎo)致一些難以調(diào)試的 Bug 。根據(jù)循環(huán)調(diào)用的方式,有三個(gè)函數(shù)可以用來重置循環(huán)。
使用?wp_reset_postdata()?重置文章數(shù)據(jù)
使用 WP_Query 新建自定義循環(huán)或使用了多個(gè)循環(huán)時(shí),請使用 wp_reset_postdata() 來重置文章數(shù)據(jù),這個(gè)函數(shù)將全局變量 $post 變量還原到主查詢中的當(dāng)前文章。如果您在進(jìn)行 WordPress 開發(fā)時(shí)遵循了最佳實(shí)踐,該函數(shù)是用來重置循環(huán)的最常見函數(shù)。
要正確使用此功能,請?jiān)谝韵氯魏?WP_Query 循環(huán)之后放置以下代碼:
<?php wp_reset_postdata(); ?>
下面是使用 WP-Query 類新建了查詢和循環(huán)后,使用 wp_reset_postdata() 還原文章數(shù)據(jù)的示例代碼。
<?php
// 示例參數(shù),定義每頁顯示3篇文章
$args = array( 'posts_per_page' => 3 );
// 調(diào)用 WP_Query 新建文章查詢
$the_query = new WP_Query( $args );
if ( $the_query->have_posts() ) :
// 開始循環(huán)
while ( $the_query->have_posts() ) : $the_query->the_post();
the_title();
the_excerpt();
// 結(jié)束循環(huán)
endwhile;
else:
// 如果沒有滿足條件的文章,就返回以下文字
_e( '抱歉,未找到您需要的文章。', 'textdomain' );
endif;
wp_reset_postdata();
?>
使用?wp_reset_query()?重置主循環(huán)和文章數(shù)據(jù)
因?yàn)?query_posts()?函數(shù)新建的循環(huán)是一個(gè)主循環(huán),在使用了這個(gè)函數(shù)新建查詢后,您必須使用?wp_reset_query()?來還原查詢和文章數(shù)據(jù)。如果使用了WP_Query新建查詢,您可以使用 wp_reset_query() 函數(shù)來還原文章數(shù)據(jù)(因?yàn)樵摵瘮?shù)已經(jīng)調(diào)用了 wp_reset_postdata() 函數(shù)),但是最好的做法是使用 wp_reset_postadata 函數(shù)來還原使用 WP_Query 新建的自定義循環(huán)。
要正確使用此功能,請?jiān)?query_posts() 循環(huán)后放置以下代碼:
<?php wp_reset_query(); ?>
因?yàn)?
query_posts()會新建一個(gè)主循環(huán)來替代當(dāng)前頁面的主循環(huán),使用這個(gè)函數(shù)會帶來一些副作用,新建循環(huán)時(shí),應(yīng)該盡量使用WP_Query而不是query_posts()函數(shù)。



