循環(huán)

  1. 主頁
  2. 文檔
  3. WordPress主題開發(fā)手冊
  4. 主題基礎(chǔ)
  5. 循環(huán)

循環(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ù)男畔ⅰQh(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)簽:

顯示文章的時(shí)候,我們可以使用條件標(biāo)簽控制文章是否在滿足某種條件的情況下顯示。例如:

  • is_home()?–如果當(dāng)前頁面是主頁,則返回true
  • is_admin()?–如果在管理后臺返回true,否則返回false
  • is_single()?–如果頁面當(dāng)前僅顯示單個(gè)文章,則返回true
  • is_page()?–如果頁面當(dāng)前僅顯示單個(gè)頁面,則返回true
  • is_page_template()?–可用于確定頁面是否使用特定模板,例如:?is_page_template('about-page.php')
  • is_category()?–如果頁面或文章具有指定的類別,則返回true,例如:?is_category('news')
  • is_tag()?–如果頁面或文章具有指定的標(biāo)簽,則返回true
  • is_author()?–如果在作者的存檔頁面內(nèi),則返回true
  • is_search()?–如果當(dāng)前頁面是搜索結(jié)果頁面,則返回true
  • is_404()?–如果當(dāng)前頁面不存在,則返回true
  • has_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ù)。

這篇文章對您有用嗎? 4 4
0 條回復(fù) A文章作者 M管理員
    暫無討論,說說你的看法吧
?
個(gè)人中心
購物車
優(yōu)惠劵
今日簽到
有新私信 私信列表
搜索

石河子市| 罗定市| 沾化县| 碌曲县| 纳雍县| 松潘县| 涿州市| 沈丘县| 吴堡县| 苏尼特左旗| 新竹县| 库伦旗| 白山市| 平度市| 达拉特旗| 鄱阳县| 凤凰县| 彭州市| 米林县| 民乐县| 格尔木市| 秦皇岛市| 延吉市| 亳州市| 邳州市| 东辽县| 旅游| 道真| 离岛区| 米脂县| 安顺市| 天等县| 色达县| 大悟县| 闽侯县| 平湖市| 视频| 论坛| 金川县| 齐齐哈尔市| 桂阳县|