在 WordPress 主題和插件開發中,條件判斷標籤 (Conditional Tags) 是非常重要的,通過條件判斷標籤,我們可以判斷各種情況,從而使用對應的代碼等。

這類的條件判斷標籤一般會返回一個布爾值,這樣我們就可以使用 if 語句判斷不同的頁面不同的情況而分別使用不同的代碼。

最近都在折騰 WordPress,所以從網上收集了大牛翻譯的 WordPress 的官方文檔 Conditional Tags,方便查詢使用,歡迎收藏本文以備用。

所有的條件判斷標籤

所有的條件判斷標籤都會判斷某個條件是否成立,然後返回 True 或者 False 。此外有些條件判斷標籤還可以使用一些參數進一步的判斷,下面是所有的 WordPress 條件判斷標籤:

主頁面 (Main)

is_home()

判斷當前頁面是否是博客主頁面。主頁面通常是顯示博客內容列表的首頁,但是如果你在 「後台」->「設置」->「閲讀」 中設置了靜態首頁和文章索引頁面的話,當訪問文章索引頁面是返回 True 。

首頁 (Front)

is_front_page()

判斷當前頁面是否是博客首頁。首頁和上面的主頁面不同,首頁可以是文章索引頁面,也可以是你在 「後台」->「設置」->「閲讀」 中設置的靜態首頁。

後台控制面板 (Administration Panels)

is_admin()

判斷當前頁面是否是後台的控制面板 (Dashboard) 。

文章頁面 (Single Post)

is_single()

判斷當前頁面是否是一篇文章或者是附件頁面或者自定義文章類型頁面。注意,WordPress 中文章 (Single) 和頁面 (Page) 是不同的概念。這個條件判斷標籤可以附加參數。

is_single( '17' )

判斷當前文章是否是 id 為 17 的文章。

is_single( 'Irish Stew' )

判斷當前文章的標題是否是 「Irish Stew」 。

is_single( 'beef-stew' )

判斷當前文章的別名 (Slug) 是否為 「beef-stew」 。

is_single( array( 17, 'beef-stew', 'Irish Stew' ) )

傳遞多個參數需要使用數組。上面條件判斷標籤判斷滿足 id 為 17 、別名為 beef-stew 、標題為 Irish Stew 任意一個條件文章被訪問時返回 True 。

is_single( array( 17, 19, 1, 11 ) )

判斷多個文章的 id,用法同上。

is_single( array( 'beef-stew', 'pea-soup', 'chili' ) )

判斷多個文章的別名,用法同上。

is_single( array( 'Beef Stew', 'Pea Soup', 'Chili' ) )

判斷多個文章的標題,用法同上。

注意:這個函數對於傳遞的參數,並無法很明確的判斷參數究竟是 id 、文章標題或者是文章別名,如果參數為 17,當 id 為 17 的文章會返回 True,當 Slug 為 17 的文章也會返回 True 。

置頂文章 (Sticky Post)

is_sticky()

WordPress 帶有置頂文章的功能,使用這個標籤判斷是否為置頂文章,需要傳遞一個參數 (通常為文章 id,用法同上) 。如果不想傳遞參數,需要用在主循環 (Loop) 中,由主循環提供。通常的用法是在主循環輸出文章索引列表的時候,使用 is_sticky() 判斷當前文章是否為置頂文章,然後在置頂文章的 title 前面輸出 「[置頂]」 之類的標誌。

文章類型 (Post Type)

get_post_type()

嚴格意義上,這並不是一個條件判斷標籤,它會返回當前文章註冊的文章類型,並且可以通過類似 if ( 『book』 == get_post_type() ) … 來實現判斷文章類型的功能。

is_singular()

判斷是否滿足 is_single 、 is_page 和 is_attachment 的任意一個條件,滿足返回 True 。可以測試所有的文章類型。

post_type_exists()

判斷某個文章類型是否被註冊了,需要傳遞一個文章類型參數。它並不是測試某文章是否屬於某個文章類型。

is_post_type_hierarchical( $post_type )

如果 $post_type 在註冊的時候設置了支持層次 ( hierarchical support ) 返回 True 。例如:is_post_type_hierarchical( 『book』 ) 。

is_post_type_archive()

判斷是否在任何的自定義文章類型存檔頁面 (post type archive) 。

is_post_type_archive( $post_type )

判斷是否在 $post_type 中符合條件的文章類型存檔頁面,$post_type 可以是一個單一的文章類型或者是一個文章類型數組。提示:如果想要應用文章類型存檔功能,需要在註冊文章類型的時候,將 has_archive 參數設置為 True 。

評論相關 (Comments)

is_comments_popup()

判斷是否在評論彈出框的窗口中。

comments_open()

判斷評論功能是否開啓,必須用在主循環中。

pings_open()

判斷文章 ping 功能是否開啓,必須用在主循環中。

判斷頁面 (Page)

WordPress 中內置的有兩種內容形式,一種是文章 (Post) 另一種是頁面 (Page),這裏要判斷的是頁面,而不是指你網站的某個網頁。

is_page()

判斷當前頁面是否為 「頁面」 。

is_page( 42 )

判斷當前頁面是否是一個 ID 為 42 的頁面。

is_page( 'About Me And Joe' )

判斷當前頁面是否是一個標題為 「About Me And Joe」 的頁面。

is_page( 'about-me' )

判斷當前頁面是否是一個別名為 「about-me」 的頁面。

is_page( array( 42, 'about-me', 'Aout Me And Joe' ) )

一次包含多種情況的判斷,需要使用數組傳遞,用法同上。

0 判斷內容分頁

在文章和頁面中,有時候內容很多,在文章中插入 <!–nextpage–> 標籤可以將內容分隔開分成不同的頁面,並通過對應的函數獲取分頁的列表。下面的例子,可以判斷當前是在第幾個頁面中,這樣你就可以在某個頁面中輸出一些特別的信息 (例如在第一個頁面中,輸出一個提示) 。

例子 1:

<?php
$paged = $wp_query->get( 'page' );

if ( ! $paged || $paged < 2 ) {
    // 這裏是不帶有分頁或者是帶有分頁頁面的第一頁
} else {
   // 這裏是帶有分頁的其他頁面。
}
?>

例子 2:

<?php
$paged = get_query_var( 'page' ) ? get_query_var( 'page' ) : false;
if ( $paged === false ) {
    // 這裏是不帶有分頁或者是帶有分頁頁面的第一頁
} else {
   // 這裏是帶有分頁的其他頁面。
}
?>

判斷子頁面 (sub-Pages)

WordPress 中的頁面 (page) 是有父子級關係的,判斷是否為子頁面時,沒有內置 is_subpage() 這樣的函數,但是你可以使用下面的方法來判斷。

方法 1:

<?php
global $post;     // 下面代碼需要用在主循環中,如果你在循環外使用,需要聲明全局變量 $post

if ( is_page() && $post->post_parent ) {
    // 這是一個子頁面
} else {
    // 這不是一個子頁面
}
?>

建議將下面的方法 2 加入你的 functions.php 文件中,下面的 is_subpage() 函數的原理與方法 1 類似,但是可以返回當前頁面父頁面的 ID 或者是 false 。

方法 2:

<?php
function is_subpage() {
    global $post;                              // 獲取頁面的相關信息
    if ( is_page() && $post->post_parent ) {   // 判斷是否有父頁面
        return $post->post_parent;             // 如果有返回父頁面的 ID
    } else {
        return false;                          // 如果沒有返回 false
    }
}
?>

如果你經常需要判斷子頁面,強烈建議使用方法 2 。

如果需要判斷父頁面是否為某個特定的頁面,可以使用方法 3 的代碼。方法 3 代碼會判斷的更加詳細,從而更加便於自定義和個性化 (例如加一些圖片) 。

方法 3:

<?php
if ( is_page( 'about' ) || '2' == $post->post_parent ) {
    // 這個頁面是 「about」 頁面,或者它的父頁面是 「about」
    $bannerimg = 'about.jpg';
} elseif ( is_page( 'learning' ) || '56' == $post->post_parent ) {
    $bannerimg = 'teaching.jpg';
} elseif ( is_page( 'admissions' ) || '15' == $post->post_parent ) {
    $bannerimg = 'admissions.jpg';
} else {
    $bannerimg = 'home.jpg'; // 如果都不滿足的話,就用這個圖片
}
?>

方法 4 是一個函數可以讓你更容易的實現判斷,只需要傳遞參數即可,如果正在訪問對應頁面,將會返回 True 。

方法 4:

<?php
function is_tree( $pid ) {      // $pid = 傳遞的 ID 參數是我們希望判斷的頁面 ID
    global $post;

    if ( is_page($pid) )
        return true;            // 當前正在這個頁面,所以返回 True

    $anc = get_post_ancestors( $post->ID );
    foreach ( $anc as $ancestor ) {
        if( is_page() && $ancestor == $pid ) {
            return true;
        }
    }

    return false;  // 沒有在當前頁面,並且這個頁面沒有子頁面
}
?>

可以將這個函數添加進 functions.php 中,調用 is_tree( 『id』 ) 就可以判斷當前頁面是否是指定頁面或者是這個頁面的子頁面。相比較方法 3 is_tree( 『2』 ) 的功能和 is_page( 『about』 ) || 『2』 == $post->post_parent 是一樣的。

注意,如果頁面乘此多於一級,那麼父級頁面指的是上一層頁面,不是這個頁面層次關係最頂層的頁面。

判斷頁面模版 (Page Template)

判斷當前頁面是否由某個頁面模版生成的。

is_page_template()

判斷是否使用了一個頁面模版。

is_page_template( 'about.php' )

判斷應用的頁面模版是否是 「about」 這個模板。注意,這個參數與其他參數不同,如果你想判斷是否是由某個頁面模版聲稱的,你需要將那個頁面模版的文件名填上去,包括後面的 .php 後綴。

判斷分類頁面 (Category)

is_category()

判斷當前頁面是否為分類目錄或者存檔 (archive) 頁面。

is_category( '9' )

判斷當前分類頁面的 ID 是否為 9 。

is_category( 'Stinky Cheeses' )

判斷當前分類頁面的名字是否為 「Stinky Cheeses」 。

is_category( 'blue-cheese' )

判斷當前分類頁面的別名是否為 「blue-cheese」 。

is_category( array( 9, 'blue-cheese', 'Stinky cheeses' ) )

同上,你懂的。

in_category( '5' )

判斷當前文章是否屬於某個特定分類目錄 (id 為 5),返回 True 。注意,這裏是 in 而不是 is,與上面的不同。

in_category( array( 1,2,3 ) )

判斷當前文章是否屬於某些特定的分類目錄。

判斷標籤頁面 (Tag)

is_tag()

判斷當前頁面是否為標籤頁面。

is_tag( 'mild' )

判斷當前標籤頁面的別名是否為 「mild」 。

is_tag( array( 'sharp', 'mild', 'extreme' ) )

判斷當前標籤頁面的別名是否是 「sharp」 、 「mild」 或者 「extreme」 中的某個。

has_tag()

判斷當前文章是否有一個標籤,必須用在主循環中。

has_tag( 'mild' )

判斷當前文章是否有標籤 「mild」 。

has_tag( array( 'sharp', 'mild', 'extreme' ) )

判斷當前文章是否有數組裏的那些標籤。

判斷自定義分類頁面 (Taxonomy)

自定義分類頁面並非是上面的 category 那種分類頁面,而是指 WordPress 分類系統頁面。在 WordPress 默認內置了兩種分類系統:category 和 tag,同時支持開發者自定義分類系統。

is_tax()

判斷當前頁面是否為一個分類系統的存檔頁面。

is_tax( 'flavor' )

判斷當前頁面是否為一個名為 flavor 自定義分類的存檔頁面。

is_tax( 'flavor', 'mild' )

判斷當前自定義分類 flavor 頁面的別名是否為 mild 。

is_tax( 'flavor', array( 'sharp', 'mild', 'extreme' ) )

判斷當前自定義分類 flavor 頁面的頁面是否為 sharp 、 mild 、 extreme 中的一個。

has_term()

判斷當前頁面是否帶有自定義分類。

has_term( 'green', 'color' )

判斷當前頁面是否是否帶有別名為 green 的自定義分類 color 。

has_term( array( 'green', 'orange', 'blue' ), 'color' )

判斷當前頁面是否是否帶有數組中的自定義分類 color 。

判斷作者頁面 (Author)

is_author()

判斷當前頁面是否是一個作者存檔頁面。

is_author( '4' )

判斷當前頁面是否為 id 為 4 的作者頁面。

is_author( 'Vivian' )

判斷當前存檔頁面是否是 Vivian(Nickname) 的作者存檔頁面。

is_author( array( 4, 'john-jones', 'Vivian' ) )

判斷當前存檔頁面是否屬於 id 為 4,或者名字為 「john-jones」 、 「Vivian」 的作者存檔頁面。

is_multi_author()

判斷當前博客是否有超過一個作者發表過文章。 WordPress 3.2 以上版本可用。

判斷是否為日期存檔頁面 (Date Page)

is_date()

判斷當前頁面是否為任何的按時間存檔的頁面。

is_year()

判斷當前頁面是否為按年份存檔的頁面。

is_month()

判斷當前頁面是否為按月份存檔的頁面。

is_day()

判斷當前頁面是否為按日期存檔的頁面。

is_time()

判斷當前頁面是否為按照小時、分鐘、秒存檔的頁面。

is_new_day()

判斷當前頁面是否為文章日期的新的一天,必須用在主循環中。

判斷任意存檔頁面 (Any Archive Page)

is_archive()

判斷當前頁面是否為一個存檔頁面,包括:分類、標籤、作者頁面、日期存檔頁面等。

判斷搜索結果頁面 (Search Result Page)

is_search()

判斷當前頁面是否為一個搜索結果頁面。

0 判斷是否為 404 頁面 (404 Not Found Page)

is_404()

判斷當前頁面是否帶有 「HTTP 404:Not Found」 錯誤。

判斷被分頁頁面 (Paged Page)

is_paged()

這裏的分頁指的是存檔頁面,如果一個日誌或者靜態頁面的內容通過通過 <!–nextpage–> 拆分成多個頁面,這些不能算為 paged page

判斷是否為附件頁面 (Attachment)

is_attachment()

判斷當前頁面是否為一個附件頁面。附件頁面通常為一個圖片或者是一些其他文件,可以在編輯文章上傳文件那裏進行設置。

判斷單頁面、文章頁面或者附件頁面

is_singular()

只要 is_single() 、 is_page() 、 is_attachment() 返回 True,此函數返回 True 。

is_singular( 'book' )

判斷當前文章是否屬於自定義文章類型 (Custom Post Types)「book」 。

is_singular( array( 'newspaper', 'book' ) )

判斷當前文章是否屬於數組中某個自定義文章類型。

判斷訂閲頁面

is_feed()

判斷是否在訂閲輸出的頁面。這個判斷標籤是為插件開發者提供的。

判斷引用通告 (Trackback)

is_trackback()

判斷當前 WordPress 主題是否開啓了 Trackback 功能。這個判斷標籤是為開發者提供的。

判斷預覽頁面

is_preview()

判斷一篇文章是否在預覽 (文章本身處於草稿狀態) 。

判斷是否有摘要

has_excerpt()

判斷當前文章是否有摘要內容。

has_excerpt( 42 )

判斷文章 ID 為 42 的文章是否有摘要內容。

還可以使用下面代碼來實現:

<?php
// 先獲取全局變量 $post
global $post;

if ( empty( $post->post_excerpt ) ) {
    // 如果文章沒有摘要執行這塊代碼
} else {
    // 如果文章帶有摘要執行這塊代碼
}
?>

如果你想在文章沒有摘要的時候,顯示空內容:

<?php if ( ! has_excerpt() ) {
      echo '';
} else {
      the_excerpt();
}

判斷是否有可用的自定義導航菜單

has_nav_menu()

判斷一個被註冊過的自定義導航菜單是否被指定了一個菜單。

判斷是否在主循環中

in_the_loop()

判斷是否在主循環內部。對開發者來説很有用。

0 判斷邊欄是否已經激活可用

is_active_sidebar()

判斷給出的邊欄是否激活 (正在使用) 。如果邊欄 (用 name 、 id 、 number 標誌) 正在使用,就會返回 True 。

判斷是否是網站的一部分 (對於多站點網站)

is_multisite()

判斷當前的站點是否是 WordPress MultiSite 的一部分。

判斷是否是主站點 (對於多站點網站)

is_main_site()

判斷當前站點在整個網絡中,是否是主站點。

判斷網站的 Admin(對於多站點網站)

is_super_admin()

判斷當前用户是否是整個網站中的管理員。

判斷插件是否激活

is_plugin_active()

判斷某個插件是否激活正在使用。

判斷子主題

is_child_theme()

判斷當前是否是一個正在使用的子主題。

判斷當前主題功能

current_theme_supports()

判斷當前主題的功能特性是否存在。

7 使用條件判斷標籤的實例

下面給出一些例子,讓你明白上面的判斷標籤如何使用。

文章中的條件判斷

下面的例子講述了當用户訪問一篇文章的時候如何使用 is_single() 來顯示一些特殊的內容。

if ( is_single() ) {
   echo 'This is just one of many fabulous entries in the ' . single_cat_title() . ' category!';
}

下面的例子介紹瞭如何在主循環中使用條件判斷語句。功能是在首頁 (index) 中顯示文章的摘要,而在文章 (single) 和主頁 (home) 中顯示文章的正文內容。

if ( is_home() || is_single() ) {
   the_content();
}
else {
   the_excerpt();
}

同時使用多個條件判斷標籤

使用常見的 PHP 操作符 就可以使用多個條件判斷標籤。

// 同時判斷兩個條件
if ( is_single() || is_page() ) ) {
// 如果當前是一篇文章或者一個頁面,就執行這塊代碼
}

if ( is_archive() && ! is_category( 'nachos' ) ) {
// 如果當前是一個分類的存檔頁面 (除了 nachos 分類),就執行這塊代碼
}
// 同時判斷三個條件
if ( $query->is_main_query() && is_post_type_archive( 'products' ) && ! is_admin() ) {
	// 如果當前是 main query 並且是 products 自定義文章類型的存檔頁面
	// 同時沒有用 admin 賬號登陸後台,就執行這塊代碼
}

if ( is_post_type_archive( 'movies' ) || is_tax( 'genre' ) || is_tax( 'actor' )  ) {
	// 如果當前是 Movies 的自定義文章類型存檔
	// 或者是 genre 分類存檔頁面
	// 或者是 actor 分類存檔頁面,就執行這塊代碼
}