介紹
在模板文件中,我們可以根據(jù)能與某頁面相匹配的條件,利用條件標簽更改該頁面上將要顯示的內(nèi)容以及內(nèi)容的顯示方式。例如,如果希望在博客首頁文章列表的上方顯示一段文字,可以利用 is_home() 條件標簽輕松實現(xiàn)這一效果。
注:條件標簽與WordPress模板層級(Template Hierarchy)密切相關。
警告:你只能在WordPress的文章選擇(posts_selection)動作鉤子的后面使用條件標簽(WP動作鉤子是第一位的,通過它可以使用這些條件語句)。對于主題來說,這意味著如果你將這些條件標簽直接添加到 functions.php 文件的主體內(nèi)(即在函數(shù)的外部),這些條件標簽將不會正常工作。
條件
所有條件標簽都會檢查是否有條件可符合相應頁面,之后返回TRUE或者FALSE。下面列出能夠使各個條件標簽返回TRUE的條件。
主頁(The Main Page)
is_home()
顯示博客首頁時,該條件標簽返回TRUE。注意:如果將靜態(tài)頁面作為博客主頁(Front Page),該標簽會在 設置 > 閱讀 中設置的“文章頁(Posts page)”返回TRUE。
首頁(The Front Page)
is_front_page()
顯示博客頭版消息(無論是日志或是頁面)。當系統(tǒng)顯示博客主頁且管理面板的 設置 > 閱讀 菜單下“主頁顯示為”選項設為最近發(fā)表的文章”,或者 設置 > 閱讀 菜單下“主頁顯示為”選項設為且"主頁"是當前被顯示的頁面時,is_front_page()標簽返回TRUE。
管理面板
is_admin()
顯示儀表盤或后臺管理面板時,該標簽返回TRUE。
單篇日志頁面
is_single()
顯示任何單獨一篇日志時,is_single()標簽返回TRUE。
is_single(’17’)
顯示 ID 為17的單篇日志時,該標簽返回TRUE。
is_single(‘Irish Stew’)
顯示標題為"Irish Stew"的單篇日志時,該標簽返回TRUE。
is_single(‘beef-stew’)
顯示別名為"beef-stew"的單篇日志時,該標簽返回TRUE。
is_single(array(17,’beef-stew’,’Irish Stew’))
當所顯示的單篇日志 ID 為17,或 post_name 為"beef-stew",或 post_title 為"Irish Stew"時,is_single(array(17,’beef-stew’,’Irish Stew’))標簽返回TRUE。
is_single( array( 17, 19, 1, 11 ) )
當所顯示的日志為 ID = 17,ID = 19, ID = 1 或者 ID = 11 時,該標簽返回TRUE。
is_single( array( ‘beef-stew’, ‘pea-soup’, ‘chili’ ) )
當顯示的單篇日志的 post_name 為 "beef-stew" 、 "pea-soup" 或 "chili" 時,該標簽返回 TRUE。
is_single( array( ‘Beef Stew’, ‘Pea Soup’, ‘Chili’ ) )
當顯示的單篇日志的 the post_title 為 "Beef Stew" 、"Pea Soup" 或 "Chili"時,該標簽返回 TRUE。
注: 該函數(shù)不區(qū)分 post ID、 post title 或 post name。如果請求的是 ID 為 17 的文章,post_name 為 17 的文章也會返回 TRUE;post title 為 17 的日志也一樣返回TRUE。
置頂文章
is_sticky()
若當前日志的"Stick this post to the front page(將該日志在首頁置頂)"復選框被選中,is_sticky()返回TRUE。此時標簽沒有提供日志的ID變量,因此系統(tǒng)會用到WordPress主循環(huán)the Loop的日志ID。
is_sticky(’17’)
若ID為17的日志被置頂,該標簽返回TRUE。
文章類型
get_post_type()
它不算一個真正的條件標簽,但將返回當前文章的已注冊的文章類型。例如:if ( ‘book’ == get_post_type() ) …
將返回文章類型為 ‘book’ 的文章。
is_singular()
任何單篇日志、頁面 或附件 都會返回 TRUE。 它允許用于文章類型的檢測。
post_type_exists()
如果所給的文章類型是一個已注冊的文章類型,就返回TRUE。它不會測試WordPress默認的文章類型。
文章類型層級
is_post_type_hierarchical( $post_type )
如果 $post_type 在注冊的時候就已被設置 支持層級(Hierarchical),就返回 TRUE。
is_post_type_hierarchical( ‘book’ )
如果 book 這種文章類型在注冊的時候就已被設置 支持層級,就返回TRUE。
文章類型存檔
is_post_type_archive()
任何文章類型存檔頁面,都返回TRUE。
is_post_type_archive( $post_type )
如果文章類型存檔頁面為 指定的 $post_type (可以是一種文章類型或一組文章類型),就返回TRUE。
要開啟文章類型存檔,請在注冊文章類型時,使用 ‘has_archive’ => true 。
評論彈出式窗口
is_comments_popup()
顯示的內(nèi)容在評論彈出式窗口中時,該標簽返回TRUE。
comments_open()
若評論允許當前日志在WordPress主循環(huán)中運行,該標簽返回TRUE。
pings_open()
若引用通告ping允許當前日志在WordPress主循環(huán)中運行,該標簽返回TRUE。
PAGE 頁面
這里的PAGE指的是WordPress的“頁面”功能,而不是博客生成的網(wǎng)頁。
is_page()
顯示任何一篇頁面時,該標簽返回TRUE。
is_page(’42’)
顯示ID為42的頁面時,該標簽返回TRUE。
is_page(‘About Me And Joe’)
若顯示的頁面的post_name為"About Me And Joe",該標簽返回TRUE。
is_page(‘about-me’)
若顯示的頁面的post_name(別名)為"about-me",該標簽返回TRUE。
is_page(array(42,’about-me’,’About Me And Joe’))
當所顯示的頁面 ID 為42,或post_name為"about-me",或post_title為"About Me And Joe"時,is_page(array(42,’about-me’,’About Me And Joe’))標簽返回TRUE。
is_page( array( 42, 54, 6 ) )
當頁面的 ID 為 42、 54 或 6 時,改標簽返回TRUE。
分頁
你可以使用這個代碼來檢測是否一篇 日志 或 PAGE頁面 被 <!–nextpage–> 標簽進行了分頁。這是非常有用的,例如你只想在劃分為多頁的 日志 的第一頁中顯示 meta-data 。
例 1
<?php
$paged = $wp_query->get( 'page' );
if ( ! $paged || $paged < 2 )
{
// This is not a paginated page (or it's simply the first page of a paginated page/post)
}
else
{
// This is a paginated page.
}
?>
例 2
<?php
$paged = get_query_var( 'page' ) ? get_query_var( 'page' ) : false;
if ( $paged === false )
{
// This is not a paginated page (or it's simply the first page of a paginated page/post)
}
else
{
// This is a paginated page.
}
?>
子頁面
不存在子頁面函數(shù) is_subpage() ,但是你可以使用下面的代碼進行檢測:
片段 1
<?php
global $post; // 如果在循環(huán)外
if ( is_page() && $post->post_parent ) {
// 這是一個子頁面
} else {
// 這不是一個子頁面
}
?>
你可以將 片段 2 的代碼添加到主題的 functions.php 文件,來自定義自己的 is_subpage() 函數(shù)。它同樣會像 片段 1 一樣檢測一個父頁面,如果存在父頁面,它會返回父頁面的ID;反之不返回。
片段 2
function is_subpage() {
global $post; // 加載這個頁面的詳細信息
if ( is_page() && $post->post_parent ) { // 測試是否這個頁面含有父頁面
return $post->post_parent; // 返回父頁面的 ID
} else { // 不存在父頁面,所以...
return false; // ... 這個問題的答案是錯誤的
}
}
要檢測這個頁面的父頁面是一個特定的頁面,比如 "About" (默認情況下該頁面的ID為 2),我們可以使用 片段 3 的代碼。通過檢測不同的頁面來顯示不同的廣告橫幅圖片,或不同的頭部圖片,例如:
片段 3
<?php
if ( is_page( 'about' ) || '2' == $post->post_parent ) {
// the page is "About", or the parent of the page is "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'; // just in case we are at an unclassified page, perhaps the home page
}
?>
片段 4 可以更加容易地實現(xiàn)上面所說的檢測。下面這個函數(shù)如果檢測到的頁面是所要找的頁面或者這個頁面的子頁面,這個函數(shù)將返回 TRUE。
片段 4
function is_tree( $pid ) { // $pid = The ID of the page we're looking for pages underneath
global $post; // load details about this page
if ( is_page($pid) )
return true; // we're at the page or at a sub page
$anc = get_post_ancestors( $post->ID );
foreach ( $anc as $ancestor ) {
if( is_page() && $ancestor == $pid ) {
return true;
}
}
return false; // we arn't at the page, and the page is not an ancestor
}
添加片段 4 到主題的 functions.php 文件中,并且通過 is_tree( ‘id’ ) 來查看當前頁面是否是我們要找的頁面或者它的子頁面。 is_tree( ‘2’ ) 就等同于 片段 3 中 "is_page( ‘about’ ) || ‘2’ == $post->post_parent"。
請注意,如果你有多個級別的頁面,父頁面只是這個子頁面最直接的上一個等級的頁面,而不是這個層次結構的最頂級的頁面。
頁面模板
is_page_template()
目前是否使用了頁面模板
is_page_template(‘about.php’)
是否使用頁面模板’about’?注意:頁面模板與其它條件標簽有所不同,用戶需要使用文件名(如 about.php 或my_page_template.php)來指定某個頁面模板。
分類頁面
is_category()
顯示分類存檔頁面頁面時,is_category()標簽返回TRUE。
is_category(‘9’)
顯示分類ID為9的存檔頁面時,is_category(‘9’)標簽返回TRUE。
is_category(‘Stinky Cheeses’)
顯示分類名稱為“Stinky Cheeses”的存檔頁面時,is_category(‘Stinky Cheeses’)標簽返回TRUE。
is_category(‘blue-cheese’)
顯示分類別名為"blue-cheese"的存檔頁面時,is_category(‘blue-cheese’) 標簽返回TRUE。
is_category(array(9,’blue-cheese’,’Stinky Cheeses’))
當所顯示的分類存檔term_ID為9,或別名為"blue-cheese",或類別名稱為"Stinky Cheeses"時,is_category(array(9,’blue-cheese’,’Stinky Cheeses’)) 標簽返回TRUE。
in_category(‘5’)
若當前日志屬于ID 為 5 的分類,in_category(‘5’) 標簽返回TRUE。
in_category( array( 1,2,3 ) )
如果當前日志屬于 ID 為 1, 2, 或 3 的分類,返回TRUE。
! in_category( array( 4,5,6 ) )
如果當前日志不屬于 ID 為 4, 5, 或 6 的分類,返回TRUE。注意前面添加的感嘆號”!“。
注意:判斷條件是否符合時,請不要將“in”寫作“is”,兩者有很大區(qū)別。
標簽頁面
is_tag()
顯示標簽存檔頁面時,is_tag() 會返回TRUE。
is_tag(‘mild’)
顯示別名為“mild”的標簽的存檔頁面時,is_tag(‘mild’) 返回TRUE。
is_tag(array(‘sharp’,’mild’,’extreme’))
若顯示的標簽別名為"sharp"、 "mild"或"extreme",is_tag(array(‘sharp’,’mild’,’extreme’)) 返回TRUE。
has_tag()
若當前日志有標簽,has_tag()返回TRUE。該標簽必須用在WordPress主循環(huán) 中。
has_tag(‘mild’)
若當前日志標簽為“mild”,as_tag(‘mild’) 返回TRUE。
has_tag(array(‘sharp’,’mild’,’extreme’))
若當前日志標簽為數(shù)組中任一個標簽,has_tag(array(‘sharp’,’mild’,’extreme’)) 返回TRUE。
分類法頁面
is_tax()
顯示任何分類法歸檔頁面時,返回TRUE。
is_tax( ‘flavor’ )
顯示 flavor 分類法的歸檔頁面時,返回TRUE。
is_tax( ‘flavor’, ‘mild’)
顯示的 flavor 分類法的歸檔頁面的別名為 ‘mild’ 時,返回TRUE。
is_tax( ‘flavor’, array( ‘sharp’, ‘mild’, ‘extreme’ ) )
顯示的 flavor 分類法的歸檔頁面的別名為數(shù)組 "sharp", "mild", 或 "extreme" 中的任何一個時,返回TRUE。
has_term()
檢查當前文章是否包含任何給出的項(term)。第一個參數(shù)為空字符串,第二個參數(shù)可以是 分類法的別名(slug)或名稱(name) 。
has_term( ‘green’, ‘color’ )
當前文章從 color 這個分類法中包含 green 這個項時,返回TRUE。
has_term( array( ‘green’, ‘orange’, ‘blue’ ), ‘color’ )
當前文章從 color 這個分類法中包含數(shù)組中任何一個項時,返回TRUE。
已注冊的分類法
taxonomy_exists()
當某一種分類法已通過 register_taxonomy() 進行注冊,返回TRUE。
作者頁面
is_author()
顯示作者頁面時,is_author()返回TRUE。
is_author(‘4’)
若顯示的是ID為4的作者的存檔頁面,is_author(‘4’) 返回TRUE。
is_author(‘Vivian’)
若顯示的是用戶名為“Vivian”的作者的存檔頁面,is_author(‘Vivian’) 返回TRUE。
is_author(‘john-jones’)
若顯示的是用戶名為“john-jones”的作者的存檔頁面,is_author(‘john-jones’) 返回TRUE。
is_author(array(4,’john-jones’,’Vivian’))
若頁面的用戶名ID為4,或user_nicename為“john-jones”,或用戶名為“Vivian”,is_author(array(4,’john-jones’,’Vivian’)) 返回TRUE。
多作者網(wǎng)站
is_multi_author( )
當一個網(wǎng)站有多個作者時,返回TRUE。注:首次出現(xiàn)于 WordPress 3.2 中。
日期頁面
is_date()
顯示日期相關的存檔頁面(如月存檔,年存檔,日存檔等基于時間的存檔頁面)時,is_date() 返回TRUE。
is_year()
顯示年存檔信息時,is_year() 返回TRUE。
is_month()
顯示月存檔信息時,is_month() 返回TRUE。
is_day()
顯示日存檔信息時,is_day() 返回TRUE。
is_time()
顯示某時、某分或某秒的存檔信息時,is_time() 返回TRUE。
is_new_day()
根據(jù)發(fā)布日期,如果今天是新的一天時,返回TRUE。用在循環(huán)中。
存檔頁面
is_archive()
無論顯示何種存檔頁面時,is_archive() 都會返回TRUE。類別存檔、標簽存檔、作者存檔以及日期存檔頁面都屬于存檔頁面。
搜索結果頁面
is_search()
顯示搜索結果頁面時,is_search() 返回TRUE。
404 頁面
is_404()
出現(xiàn)"HTTP 404: Not Found"錯誤后所顯示的頁面。
分頁型頁面
is_paged()
當前頁面需要分頁顯示時,is_paged()返回TRUE。分頁型頁面是指某個存檔頁面或需要分成若干頁顯示的主頁,顯示第二頁以及之后頁面時,is_paged()返回TRUE。有些日志或頁面使用<!–nextpage–>快速標簽分頁顯示其內(nèi)容,這些日志和頁面都不屬于分頁型頁面。
附件
is_attachment()
顯示某篇日志或頁面的附件文件時,is_attachment() 會返回TRUE。附件可以是一張圖片,也可以是用戶所上傳的其它文件。附件能夠顯示在“頁面”或模板上。更多信息請參閱“圖片和附件的使用”。
獨立頁面、單篇日志或附件
is_singular()
當is_single(), is_page() 或is_attachment()返回TRUE時,is_singular() 也返回TRUE。
is_singular( ‘book’ )
當正在查看的文章屬于 book 這種 自定義文章類型 時,返回TRUE。
is_singular( array( ‘newspaper’, ‘book’ ) )
當正在查看的文章屬于 book 或 newspaper 這種 自定義文章類型 時,返回TRUE。
新聞聚合器
is_feed()
網(wǎng)站需要使用RSS訂閱時,is_feed()返回TRUE。一般情況下會用到is_feed()標簽的是WordPress系統(tǒng)和插件開發(fā)人員,普通WordPress用戶很少用到is_feed()標簽。
引用通告(Trackback)
is_trackback()
網(wǎng)站需要將WordPress鉤子勾入Trackback。一般情況下會用到這個標簽的是WordPress系統(tǒng)和插件開發(fā)人員,普通WordPress用戶很少用到is_feed()標簽。
預覽
is_preview()
若目前頁面是在草稿狀態(tài)下顯示的(即預覽),is_preview() 返回TRUE。
摘要
as_excerpt()
當前日志要顯示摘要時,as_excerpt() 返回TRUE。
has_excerpt(’42’)
若ID為42的日志要顯示摘要時,has_excerpt(’42’) 返回TRUE。
<?php
// Get $post if you're inside a function
global $post;
if ( empty( $post->post_excerpt ) ) {
// This post has no excerpt
} else {
// This post has excerpt
}
?>
其他用法
當你要隱藏自動摘要或者只顯示你文章的摘要:
<?php if ( ! has_excerpt() ) {
echo '';
} else {
the_excerpt();
}
使用自己的文字替換自動摘要:
<?php if ( ! has_excerpt() ) {?>
<!-- you text or code -->
<?php } ?>
已分配導航菜單
has_nav_menu()
當已注冊的導航菜單分配有一個菜單時,返回TRUE,反之返回FALSE。
在循環(huán)中
in_the_loop()
判斷目前是否在WordPress主循環(huán)中。該標簽適用于插件開發(fā)人員,若目前在WordPress主循環(huán)中,該標簽返回TRUE。
邊欄已激活
is_active_sidebar()
檢查現(xiàn)有側邊欄是否被激活(是否啟用)。若側邊欄被啟用,is_active_sidebar() 返回TRUE,否則返回FALSE。
網(wǎng)絡中的部分(多站點)
is_multisite()
檢查當前網(wǎng)站是否是一個WordPress多站點安裝。
主站點(多站點)
is_main_site()
確定當前站點是多站點網(wǎng)絡中的主站點。
網(wǎng)絡管理員(多站點)
is_super_admin()
確定用戶是多站點網(wǎng)絡的(超級)管理員。
已啟用的插件
is_plugin_active()
檢查插件是否已啟用。
子主題
is_child_theme()
檢查是否在使用子主題。
主題支持功能
current_theme_supports()
檢查是否存在各種主題功能。
實例
下面是這些條件標簽的一些使用實例。
單篇日志
下面這個例子向我們展示了怎樣用is_single()為某個單獨日志頁面顯示獨特內(nèi)容:
if ( is_single() ) {
echo 'This is just one of many fabulous entries in the ' . single_cat_title() . ' category!';
}
選擇在 index.php 中顯示全文還是摘要。 如果是首頁或單篇日志,就顯示全文,否則顯示摘要:
if ( is_home() || is_single() ) {
the_content();
}
else {
the_excerpt();
}
在不是首頁的任何地方顯示自定義內(nèi)容:
<?php if ( ! is_home() ) {?>
Insert your markup ...
<?php }?>
區(qū)分基于日期的頁面
如果訪問者按日期瀏覽網(wǎng)站,我們可以用不同顏色標注不同年份的日志或其它信息:
<?php
// this starts The Loop
if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<h2 id="post-<?php the_ID(); ?>">
<a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>">
<?php the_title(); ?></a></h2>
<small><?php the_time('F jS, Y') ?> <!-- by <?php the_author() ?> --></small>
<?php
// are we showing a date-based archive?
if ( is_date() ) {
if ( date( 'Y' ) != get_the_date( 'Y' ) ) {
// this post was written in a previous year
// so let's style the content using the "oldentry" class
echo '<div class="oldentry">';
} else {
echo '<div class="entry">';
}
} else {
echo '<div class="entry">';
}
the_content( 'Read the rest of this entry ?' );
?>
</div>
可視化的側邊欄內(nèi)容
本例根據(jù)訪問者當前瀏覽的界面,在側邊欄上顯示不同內(nèi)容。
<!-- begin sidebar -->
<div id="sidebar">
<?php
// let's generate info appropriate to the page being displayed
if ( is_home() ) {
// we're on the home page, so let's show a list of all top-level categories
echo "<ul>";
wp_list_categories( 'optionall=0&sort_column=name&list=1&children=0' );
echo "</ul>";
} elseif ( is_category() ) {
// we're looking at a single category view, so let's show _all_ the categories
echo "<ul>";
wp_list_categories( 'optionall=1&sort_column=name&list=1&children=1&hierarchical=1' );
echo "</ul>";
} elseif ( is_single() ) {
// we're looking at a single page, so let's not show anything in the sidebar
} elseif ( is_page() ) {
// we're looking at a static page. Which one?
if ( is_page( 'About' ) ) {
// our about page.
echo "<p>This is my about page!</p>";
} elseif ( is_page( 'Colophon' ) ) {
echo "<p>This is my colophon page, running on WordPress " . bloginfo( 'version' ) . "</p>";
} else {
// catch-all for other pages
echo "<p>Vote for Pedro!</p>";
}
} else {
// catch-all for everything else (archives, searches, 404s, etc)
echo "<p>Pedro offers you his protection.</p>";
} // That's all, folks!
?>
<form id="searchform" method="get" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<div>
<input type="text" name="s" id="s" size="15" />
<input type="submit" value="<?php _e( 'Search' ); ?>" />
</div>
</form>
</div>
<!-- end sidebar -->
404頁面
設計Error 404頁面中的編寫友好的錯誤信息部分有一個使用PHP條件函數(shù)isset()的示例。
動態(tài)菜單高亮
動態(tài)菜單高亮中介紹了如何用條件標簽在菜單中激活當前頁面的高亮顯示部分。
在主題的footer.php文件中
有時在模板文件(如sidebar.php)中執(zhí)行的查詢可能破壞一些條件標簽。例如,某個條件標簽可以在header.php文件中正常運行,但卻不能適應主題的footer.php文件。這時可以在頁腳中把wp_reset_query放條件檢驗前:
<?php
wp_reset_query();
if ( is_page( '2' ) ) {
echo 'This is page 2!';
}
?>
- 原文:http://codex.wordpress.org/Conditional_Tags
- 翻譯:倡萌@WordPress大學 – WordPress條件標簽(Conditional Tags)





終于找到教程了,非常感謝
精品文章啊!我可以轉載到我的經(jīng)驗公式【www.jygongshi.com】嗎?我會付上原文鏈接的
牛逼~