Conditional Tags – WordPress 条件标签

  • A+
所属分类:WordPress教程

介绍

在模板文件中,我们可以根据能与某页面相匹配的条件,利用条件标签更改该页面上将要显示的内容以及内容的显示方式。例如,如果希望在博客首页文章列表的上方显示一段文字,可以利用 is_home() 条件标签轻松实现这一效果。

:条件标签与 WordPress 模板层级(Template Hierarchy)密切相关。

警告: 你只能在WordPress的文章选择(posts_selection)动作钩子的后面使用条件标签(WP动作钩子是第一位的,通过它可以使用这些条件 语句)。对于主题来说,这意味着如果你将这些条件标签直接添加到 functions.php 文件的主体内(即在函数的外部),这些条件标签将不会正常工作。

条件

所有条件标签都会检查是否有条件可符合相应页面,之后返回 TRUE 或者 FALSE。下面列出能够使各个条件标签返回 TRUE 的条件。

主页(The Main Page)

is_home()

显示博客首页时,该条件标签返回 TRUE。注意:如果将静态页面作为博客主页(Front Page),该标签会在 设置 > 阅读 中设置的“文章页(Posts page)”返回TRUE。

首页(The Front Page)

is_front_page()

显示博客头版消息(无论是日志或是页面)。当系统显示博客主页且管理面板的 设置 > 阅读 菜单下“主页显示为”选项设为最近发表的文章”,或者 设置 > 阅读 菜单下“主页显示为”选项设为且”主页”是当前被显示的页面时,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。

注: 该函数不区分 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变量,因此系统会用到WordPress主循环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()

显示的内容在评论弹出式窗口中时,该标签返回TRUE。

comments_open()

若评论允许当前日志在WordPress主循环中运行,该标签返回TRUE。

pings_open()

若引用通告ping允许当前日志在WordPress主循环中运行,该标签返回TRUE。

PAGE 页面

这里的PAGE指的是WordPress的“页面”功能,而不是博客生成的网页。

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
  2. $paged = $wp_query->get( 'page' );
  3.  
  4. if ( ! $paged || $paged < 2 )
  5. {
  6. // This is not a paginated page (or it's simply the first page of a paginated page/post)
  7. }
  8. else
  9. {
  10. // This is a paginated page.
  11. }
  12. ?>

例2

  1. <?php
  2. $paged = get_query_var( 'page' ) ? get_query_var( 'page' ) : false;
  3. if ( $paged === false )
  4. {
  5. // This is not a paginated page (or it's simply the first page of a paginated page/post)
  6. }
  7. else
  8. {
  9. // This is a paginated page.
  10. }
  11. ?>

子页面

不存在子页面函数 is_subpage() ,但是你可以使用下面的代码进行检测:

片段1

  1. <?php
  2. global $post;
  3. if ( is_page() && $post->post_parent ) {
  4. // 这是一个子页面
  5. } else {
  6. // 这不是一个子页面
  7. }
  8. ?>

你可以将 片段 2 的代码添加到主题的 functions.php 文件,来自定义自己的 is_subpage() 函数。它同样会像 片段 1 一样检测一个父页面,如果存在父页面,它会返回父页面的ID;反之不返回。

片段2

  1. function is_subpage() {
  2. global $post; // 加载这个页面的详细信息
  3.  
  4. if ( is_page() && $post->post_parent ) { // 测试是否这个页面含有父页面
  5. return $post->post_parent; // 返回父页面的 ID
  6.  
  7. } else { // 不存在父页面,所以...
  8. return false; // ... 这个问题的答案是错误的
  9. }
  10. }

要检测这个页面的父页面是一个特定的页面,比如 “About” (默认情况下该页面的ID为 2),我们可以使用 片段 3 的代码。通过检测不同的页面来显示不同的广告横幅图片,或不同的头部图片,例如:

片段3

  1. <?php
  2.  
  3. if ( is_page( 'about' ) || '2' == $post->post_parent ) {
  4. // the page is "About", or the parent of the page is "About"
  5. $bannerimg = 'about.jpg';
  6.  
  7. } elseif ( is_page( 'learning' ) || '56' == $post->post_parent ) {
  8. $bannerimg = 'teaching.jpg';
  9.  
  10. } elseif ( is_page( 'admissions' ) || '15' == $post->post_parent ) {
  11. $bannerimg = 'admissions.jpg';
  12.  
  13. } else {
  14. $bannerimg = 'home.jpg'; // just in case we are at an unclassified page, perhaps the home page
  15. }
  16.  
  17. ?>

片段 4 可以更加容易地实现上面所说的检测。下面这个函数如果检测到的页面是所要找的页面或者这个页面的子页面,这个函数将返回 TRUE。

片段4

  1. function is_tree( $pid ) { // $pid = The ID of the page we're looking for pages underneath
  2. global $post; // load details about this page
  3.  
  4. if ( is_page($pid) )
  5. return true; // we're at the page or at a sub page
  6.  
  7. $anc = get_post_ancestors( $post->ID );
  8. foreach ( $anc as $ancestor ) {
  9. if( is_page() && $ancestor == $pid ) {
  10. return true;
  11. }
  12. }
  13.  
  14. return false; // we arn't at the page, and the page is not an ancestor
  15. }

添加片段 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”,两者有很大区别。

标签页面

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主循环 中。

has_tag(‘mild’)

若当前日志标签为“mild”,as_tag(‘mild’) 返回TRUE。

has_tag(array(‘sharp’,’mild’,’extreme’))

若当前日志标签为数组中任一个标签,has_tag(array(‘sharp’,’mild’,’extreme’)) 返回TRUE。

分类法页面

is_tax

is_tax()

显示任何分类法归档页面时,返回TRUE。

is_tax( ‘flavor’ )

显示 flavor 分类法的归档页面时,返回TRUE。

is_tax( ‘flavor’, ‘mild’)

显示的 flavor 分类法的归档页面的别名为 ‘mild’ 时,返回TRUE。

is_tax( ‘flavor’, array( ‘sharp’, ‘mild’, ‘extreme’ ) )

显示的 flavor 分类法的归档页面的别名为数组 “sharp”, “mild”, 或 “extreme” 中的任何一个时,返回TRUE。

has_term

has_term()

检查当前文章是否包含任何给出的项(term)。第一个参数为空字符串,第二个参数可以是 分类法的别名(slug)或名称(name) 。

has_term( ‘green’, ‘color’ )

当前文章从 color 这个分类法中包含 green 这个项时,返回TRUE。

has_term( array( ‘green’, ‘orange’, ‘blue’ ), ‘color’ )

当前文章从 color 这个分类法中包含数组中任何一个项时,返回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。

多作者网站

is_multi_author( )

当一个网站有多个作者时,返回TRUE。注:首次出现于 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()

根据发布日期,如果今天是新的一天时,返回TRUE。用在循环中。

存档页面

is_archive()

无论显示何种存档页面时,is_archive() 都会返回TRUE。类别存档、标签存档、作者存档以及日期存档页面都属于存档页面。

搜索结果页面

is_search()

显示搜索结果页面时,is_search() 返回TRUE。

404 页面

is_404()

出现”HTTP 404: Not Found”错误后所显示的页面。

分页型页面

is_paged()

当 前页面需要分页显示时,is_paged()返回TRUE。分页型页面是指某个存档页面或需要分成若干页显示的主页,显示第二页以及之后页面 时,is_paged()返回TRUE。有些日志或页面使用<!–nextpage–>快速标签分页显示其内容,这些日志和页面都不属于 分页型页面。

附件

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()

网站需要使用RSS订阅时,is_feed()返回TRUE。一般情况下会用到is_feed()标签的是WordPress系统和插件开发人员,普通WordPress用户很少用到is_feed()标签。

引用通告(Trackback)

is_trackback()

网站需要将WordPress钩子勾入Trackback。一般情况下会用到这个标签的是WordPress系统和插件开发人员,普通WordPress用户很少用到 is_feed() 标签。

预览

is_preview()

若目前页面是在草稿状态下显示的(即预览),is_preview() 返回TRUE。

摘要

as_excerpt()

当前日志要显示摘要时,as_excerpt() 返回TRUE。

has_excerpt(’42’)

若ID为42的日志要显示摘要时,has_excerpt(’42’) 返回TRUE。

  1. <?php
  2. // Get $post if you're inside a function
  3. global $post;
  4.  
  5. if ( empty( $post->post_excerpt ) ) {
  6. // This post has no excerpt
  7. } else {
  8. // This post has excerpt
  9. }
  10. ?>

其他用法

当你要隐藏自动摘要或者只显示你文章的摘要:

  1. <?php if ( ! has_excerpt() ) {
  2. echo '';
  3. } else {
  4. the_excerpt();
  5. }

使用自己的文字替换自动摘要:

  1. <?php if ( ! has_excerpt() ) {?>
  2. <!-- you text or code -->
  3. <?php } ?>

已分配导航菜单

has_nav_menu()

当已注册的导航菜单分配有一个菜单时,返回TRUE,反之返回FALSE。

在循环中

in_the_loop()

判断目前是否在WordPress主循环中。该标签适用于插件开发人员,若目前在 WordPress 主循环中,该标签返回TRUE。

边栏已激活

is_active_sidebar()

检查现有侧边栏是否被激活(是否启用)。若侧边栏被启用,is_active_sidebar() 返回TRUE,否则返回FALSE。

网络中的部分(多站点)

is_multisite()

检查当前网站是否是一个WordPress多站点安装。

主站点(多站点)

is_main_site()

确定当前站点是多站点网络中的主站点。

网络管理员(多站点)

is_super_admin()

确定用户是多站点网络的(超级)管理员。

已启用的插件

is_plugin_active()

检查插件是否已启用。

子主题

is_child_theme()

检查是否在使用子主题。

主题支持功能

current_theme_supports()

检查是否存在各种主题功能。

实例

下面是这些条件标签的一些使用实例。

单篇日志

下面这个例子向我们展示了怎样用 is_single() 为某个单独日志页面显示独特内容:

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

选择在 index.php 中显示全文还是摘要。 如果是首页或单篇日志,就显示全文,否则显示摘要:

  1. if ( is_home() || is_single() ) {
  2. the_content();
  3. }
  4. else {
  5. the_excerpt();
  6. }

在不是首页的任何地方显示自定义内容:

  1. <?php if ( ! is_home() ) {?>
  2. Insert your markup ...
  3. <?php }?>

区分基于日期的页面

如果访问者按日期浏览网站,我们可以用不同颜色标注不同年份的日志或其它信息:

  1. <?php
  2. // this starts The Loop
  3. if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
  4. <h2 id="post-<?php the_ID(); ?>">
  5. <a href="<?php the_permalink() ?>" rel="bookmark" title="Permanent Link to <?php the_title(); ?>">
  6. <?php the_title(); ?></a></h2>
  7. <small><?php the_time('F jS, Y') ?> <!-- by <?php the_author() ?> --></small>
  8.  
  9. <?php
  10. // are we showing a date-based archive?
  11. if ( is_date() ) {
  12. if ( date( 'Y' ) != get_the_date( 'Y' ) ) {
  13. // this post was written in a previous year
  14. // so let's style the content using the "oldentry" class
  15. echo '<div class="oldentry">';
  16. } else {
  17. echo '<div class="entry">';
  18. }
  19. } else {
  20. echo '<div class="entry">';
  21. }
  22.  
  23. the_content( 'Read the rest of this entry »' );
  24.  
  25. ?>
  26. </div>

可视化的侧边栏内容

本例根据访问者当前浏览的界面,在侧边栏上显示不同内容。

  1. <!-- begin sidebar -->
  2. <div id="sidebar">
  3. <?php
  4. // let's generate info appropriate to the page being displayed
  5. if ( is_home() ) {
  6. // we're on the home page, so let's show a list of all top-level categories
  7. echo "<ul>";
  8. wp_list_categories( 'optionall=0&sort_column=name&list=1&children=0' );
  9. echo "</ul>";
  10. } elseif ( is_category() ) {
  11. // we're looking at a single category view, so let's show _all_ the categories
  12. echo "<ul>";
  13. wp_list_categories( 'optionall=1&sort_column=name&list=1&children=1&hierarchical=1' );
  14. echo "</ul>";
  15. } elseif ( is_single() ) {
  16. // we're looking at a single page, so let's not show anything in the sidebar
  17. } elseif ( is_page() ) {
  18. // we're looking at a static page. Which one?
  19. if ( is_page( 'About' ) ) {
  20. // our about page.
  21. echo "<p>This is my about page!</p>";
  22. } elseif ( is_page( 'Colophon' ) ) {
  23. echo "<p>This is my colophon page, running on WordPress " . bloginfo( 'version' ) . "</p>";
  24. } else {
  25. // catch-all for other pages
  26. echo "<p>Vote for Pedro!</p>";
  27. }
  28. } else {
  29. // catch-all for everything else (archives, searches, 404s, etc)
  30. echo "<p>Pedro offers you his protection.</p>";
  31. } // That's all, folks!
  32. ?>
  33. <form id="searchform" method="get" action="<?php echo $_SERVER['PHP_SELF']; ?>">
  34. <div>
  35. <input type="text" name="s" id="s" size="15" />
  36. <input type="submit" value="<?php _e( 'Search' ); ?>" />
  37. </div>
  38. </form>
  39.  
  40. </div>
  41. <!-- end sidebar -->

404页面

设计Error 404页面中的编写友好的错误信息部分有一个使用PHP条件函数isset()的示例。

动态菜单高亮

动态菜单高亮中介绍了如何用条件标签在菜单中激活当前页面的高亮显示部分。

在主题的footer.php文件中

有时在模板文件(如 sidebar.php)中执行的查询可能破坏一些条件标签。例如,某个条件标签可以在 header.php 文件中正常运行,但却不能适应主题的 footer.php 文件。这时可以在页脚中把 wp_reset_query 放条件检验前:

  1. <?php
  2. wp_reset_query();
  3. if ( is_page( '2' ) ) {
  4. echo 'This is page 2!';
  5. }
  6. ?>

http://codex.wordpress.org/Conditional_Tags

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: