在 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 分類存檔頁面,就執行這塊程式碼 }