WordPress主题开发教程手册 — 条件标签函数
条件函数可以在 WordPress 模版中使用,通常作为 if/else 的判断条件,来判断当前页面是否满足某个条件,然后根据判断结果显示对应的内容。
该函数一般返回一个布尔值,如果返回值为 true,if 后面的代码被执行,如果返回 false,else 后面的代码被执行。
下面的示例代码中,我们使用 is_user_logged_in() 函数来判断用户是否已经登录,然后根据用户的登录状态,显示对应的问候语。
if ( is_user_logged_in() ):
echo '欢迎光临,已注册用户!';
else:
echo '欢迎光临,请注册一个用户!';
endif;
在什么地方使用条件标签函数
在使用条件函数之前,条件函数用来进行判断的信息必须已经从数据库中获取出来了,也就是 WordPress 查询已经运行过了。如果在 WordPress 获取到数据之前使用条件函数,条件函数是不工作的。
我们可以通过三种方法使用条件函数:
- 在模板文件中使用。
- 在 functions.php 中创建一个函数,然后在模版文件中调用这个函数
- 在 functions.php 中创建一个函数,然后在 action 或 filter 中使用这个函数。
条件标签函数详解
下面是我们可以使用的返回结果为 true 的条件函数,有些条件函数可以接受参数。
主页
如果当前页面为网站首页,此函数返回 true,如果阅读设置里面的主页设置为了「静态页面」,该函数只在设置为「你的最新文章」的页面中返回 true.
无论在阅读设置里面设置的是「最新文章」还是「静态页面」,只要当前页面是网站首页,此函数就返回 true。
也就是,该函数再以下两种情况下返回 true
- 博客首页
- 「设置 -> 阅读 -> 首页显示 」被设置为「您的最新文章」
或者
- 「设置 -> 阅读 -> 首页显示 」被设置为「 一个静态页 」
- 当前显示的是上面选择的静态页面
管理后台
当我们在仪表盘或后台页面时,此函数返回 true。
单个文章页面
当前页面是文章详情页(或附件、自定义文章类型详情页)时,返回 true。如果是页面,则返回 false。
is_single(’17’)
is_single() 还可以通过文章 ID 和其他文章参数判断是否为特定的某个文章。当文章 ID 为 17 时,上面的函数返回 true。
is_single(‘Hello World’)
参数也可以是文章标题,当前页面是标题为「Hello World」的文章时,上面的函数返回 true
is_single(‘hello-world’)
参数也可以是文章别名,当前页面是别名为「hello-world」的文章时,上面的函数返回 true.
is_single( array( 17, ‘beef-stew’, ‘Irish Stew’ ) )
该函数的参数也可以是一个数组,数组的元素可以是文章 ID、文章别名、文章名。
注意:该函数的参数不区分文章 ID、别名或标题,假设我们传入 17 作为参数,当文章 ID 为 17 或者别名为 17 时,该函数都返回 true。
文章详情、页面、或附件页面
任何 is_single,is_page 和 is_attachment 为 true 的情况下,这个函数都返回 true,该函数还接受一个文件类型名称作为参数,用来判断是否为某个文章类型的文章详情页。
置顶文章
如果当前文章在编辑界面被设置了置顶,该函数返回 true。在循环中,该函数可以接受一个文章 ID 作为参数,来判断某个文章是否置顶,
is_sticky(’17’)
判断 ID 为 17 的文章是否为置顶文章。在文章循环中使用时,这个参数会自动设置,可以省略。
文章类型
我们可以通过 get_post_type() 来测试当前文章是否为某个文章类型中的文章 。严格来说,这不是一个条件函数,但是我们可以拿他返回的结果来个我们需要判断的文章类型做对比,如下:
if('book'== get_post_type())...
用来判断某个文章类型是否已经被注册。
文章类型是否是分级的
is_post_type_hierarchical($post_type)
该函数用来判断某个文章类型是否是分级的,比如 WordPress 默认的页面,有父页面和子页面的功能,就说明这个文章类型是分级,那么下面的函数就会返回 true:
is_post_type_hierarchical('page')
文章类型存档页(列表页)
用来判断当前页面是否为文章类型的列表页。
is_post_type_archive($post_type)
该函数接受一个文章类型名称作为参数,来判断当前页面是否为某个文章类型的列表页。
注意:注册文章类型时,设置了参数 ‘has_archive’=> true 的文章类型才有列表页。
评论弹出窗口
是否在「评论弹出窗口」中。
任何包含文章的页面
当前文章允许发表评论时,返回 true
当前文章允许 ping 时,返回 true
“PAGE”页面
本节中使用的「page」指的是WordPress的 页面,而不是我网站中的任何网页,或者换言之,指的是内置的「页面」文章类型。
当前网页是「页面」时。
is_page(’42’)
当前页面是 ID 为 42 的页面时,返回 true。
is_page(’About Me’)
当前页面的标题为「About me」时,返回 true。
is_page(’about-me’)
当前页面的别名为「About me」时,返回 true。
is_page( array(42,’about-me’,’About Me’))
当前页面的 ID 是 42,或 post_name 是 「about-me」,或 post_title 是「About Me」 时,返回 true 。
is_page( array(42,54,6) )
当前页面是 ID 为 42、54 或 6 时,返回 true 。
测试页面分页
我们可以使用此代码检查我们是否位于使用 QuickTag <!--nextpage-->
分割为多个页面的文章或页面的第 n 页上 。有时候这会很有用,例如,如果您希望仅在分为多个页面的文章的第一页上显示元数据。
例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 {
// 这是一个有分页的页面
}
?>
测试子页面
WordPress 没有 is_subpage()
函数,但是我们可以使用其他方式来测试当前页面是否为另外一个页面的子页面:
代码片段1
<?php
global $post; // 如果在文章循环外部使用,加上此代码
if ( is_page() && $post->post_parent ) {
// 这是一个子页面
} else {
// 这不是一个子页面
}
?>
我们可以使用 代码片段 2 中的代码创建自己的 is_subpage() 函数。将其添加到functions.php 文件中。它以与 Snippet 1 以相同的方式来测试是否为子页面,但如果有,则返回父页面的 ID,如果没有,则返回 false。
代码片段 2
function is_subpage() {
global $post;
if ( is_page() && $post->post_parent ) {
return $post->post_parent;
} else {
return false;
}
}
如果我们需要经常测试子页面,建议使用 Snippet 2 中的函数,而不是像 Snippet 1 那样类每次需要测试时复制。
要测试页面的父级页面是否是特定页面,例如 “About”(页面 ID 为 2),我们可以使用 Snippet 3 中的测试。这些测试可以检查我们是否正在查看指定页面或其子页面。这对于为网站不同部分设置特定的内容非常重要,如,我们可以为不同的页面、子页面设置不同的标题和 Banner。
代码段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'; // 在其他页面中时
}
?>
Snippet 4 是一个可以让我们更轻松地执行上述测试的函数。如果我们正在查看指定页面(如“About”)或其中一个子页面(此页面的父级 ID 为“2”),此函数将返回 true。
代码片段4
function is_tree( $pid ) {
global $post;
if ( is_page($pid) ){
return true;
}
$anc = get_post_ancestors( $post->ID );
foreach ( $anc as $ancestor ) {
if( is_page() && $ancestor == $pid ) {
return true;
}
}
return false;
}
将 Snippet 4 添加到主题的 functions.php 文件中,并调用is_tree(‘id’) 来查看当前页面是否为页面,或是页面的子页面。在 Snippet 3 中,is_tree(‘2’) 将替换第一个 if 标签内的 "is_page('about') || '2'== $ post-> post_parent"
请注意,如果我们有多个页面级别,则父页面是当前页面的直接父页面,而不是层次结构最顶层的页面。
是否为页面模板
WordPress 允许我们确定当前页面是否使用了页面模版或是否使用了特定的页面模版。
是否使用了页面模板?
is_page_template(‘about.php’)
是否使用了 「about.php」页面模版?请注意,与其他判断函数不同,如果要指定页面模板,则需要使用文件名,例如 about.php 或 my_page_template.php。
注意:如果模版文件位于子目录中,参数中还需要包含目录,例如 ‘page-templates/about.php’。
分类页面
显示 “分类目录存档”页面时,返回 true
is_category(‘9’)
显示 ID 为 9 的分类目录存档页面时,返回 true
is_category(‘Stinky Cheeses’)
当显示名称为 “Stinky Cheeses” 的分类目录存档页面时,返回 true
is_category(’blue-cheese’)
显示别名为 “blue-cheese” 的分类目录存档页面时,返回 true
is_category( array(9,’blue-cheese’,’Stinky Cheeses’) )
显示 ID 为 9,或别名为 「blue-cheese」,或名称为「Stiky Cheeses」的分类目录存档页面时,返回 true。
in_category(‘5’)
如果当前文章在 ID 为 5 的分类目录中时,返回 true。
in_category(array(1,2,3))
如果当前文章在 ID 为1、2或 3 的分类目录中时,返回 true。
!in_category( array(4,5,6))
如果当前分类不在 ID 为 4、5 或 6 的分类目录中时,返回 true。
注意:使用上面的函数时,一定要注意拼写,“is” 和 “in” 的区别很大。
另请参见 is_archive() 和 分类目录模板。
标签存档页
是否为标签存档页面
is_tag(‘文章类型’)
是否为名称为「文章类型」的标签存档页面。
is_tag(array(‘sharp’,’mild’,’extreme’))
标签别名为 “sharp”,“mild” 或 “extreme” 时,返回 true。
当前文章有标签时,返回 true。必须在文章循环中使用。
has_tag(‘文章类型’)
当前文章的标签为“文章类型”时,返回 true。
has_tag( array(‘sharp’,’mild’,’extreme’) )
当前文章有别名为数组中的任意一个时,返回 true.
另请参见 is_archive() 和 标签模板。
分类法存档页
是否为分类法存档页面
is_tax(‘flavor’)
显示为名为 flavor 的分类法存档页面时,返回 true。
is_tax(‘flavor’,’mild’)
显示 Flavor 为 mild 的分类法项目存档页面时。
is_tax(‘flavor’,array(‘sharp’,’mild’,’extreme’))
显示别名为 “sharp”,“mild” 或 “extreme” 的 flavor 分类法项目存档页面时,返回 true。
检查当前文章是否包含指定的分类法项目。第一个参数应该是空字符串。需要分类法项目别名/名称作为第二个参数。
has_term(‘green’,’color’)
当前文章有颜色为绿色的分类法项目。
has_term(array(‘green’,’orange’,’blue’),’color’)
当前文章有颜色为绿色、橙色、蓝色的分类法项目。
另请参见 is_archive()。
注册分类标准
当某个分类法已通过 register_taxonomy() 注册时,返回 true 。以前的 is_taxonomy() 在3.0版中已弃用。
作者页面
显示作者存档页面时,返回 true。
is_author(‘4’)
显示 ID 为 4 的作者存档页面时,返回 true 。
is_author(‘Vivian’)
显示昵称为 “Vivian”的作者的存档页面时。
is_author(’john-jones’)
显示 nicename 为 “john-jones” 的存档页面时,返回 true。
is_author( array(4,’john-jones’,’Vivian’) )
显示 ID 4 或 user_nicename 为 “john-jones” 或 昵称 为 “Vivian” 的作者存档页面时,返回 true。
另请参见 is_archive() 和 作者模板。
多作者网站
当多位作者发布网站文章时。适用于3.2版。
日期页面
显示任何日期存档页面时,返回 true。
显示年度存档时,返回 true。
何时月度存档,返回 true。
显示每日存档时,返回 true。
当显示每小时,“分钟”或“每秒”存档时,返回 true。
确定循环中当前文章的发布日期是否与上一篇的不同。
任何档案页面
显示任何类型的存档页面时(如分类目录,标签,作者和日期存档),返回 true
搜索结果页面
显示搜索结果页面存档时,返回 true。
404 页面
在 “HTTP 404:Not Found” 错误发生时,返回 true。
单附件页面
当前页面为文章或页面的附件时,返回 true。附件是通过文章编辑器上传的图像或其他文件,可以显示在他们自己的 “页面” 或模板上。
单页,单个文章或附件
当以下任何一个函数返回 true时: is_single()
, is_page()
或 is_attachment()
,该函数返回 true。
is_singular(‘book’)
但是文章类型为 ‘book’ 的单页面时, 返回 true。
is_singular(array(‘newspaper’, ‘book’))
显示文章类型为 ‘newspaper’ 或 ‘book’ 的单页面时,返回 true。
订阅源
当前页面为订阅源页面时,返回 true。该函数在主题开发时不常用,一般在 WordPress 内部或在插件开发时使用。
引用
当请求的页面是 WordPress 的 Trackback 引擎时,返回 true。该函数在主题开发时不常用,一般在 WordPress 内部或在插件开发时使用。
预览
在预览模式为查看文章或页面时,返回 true。
有摘要
当前文章有摘要时,返回 true。
has_excerpt()
当 ID 为 42 的文章有摘要时,返回 true。
<?php
if ( empty( $post->post_excerpt ) ) {
// 此文章没摘要
} else {
// 此文章要摘要
}
?>
其他用法
当我们需要隐藏自动摘要,只显示手动摘要时,可使用以下代码。
<?php
if ( !has_excerpt() ) {
echo '';
} else {
the_excerpt();
}
?>
替换文本或代码的自动摘要。
<?php
if ( ! has_excerpt() ) {
// 你的文字或代码
}
?>
是否已分配导航菜单
注册的导航菜单位置是否已分配菜单
返回:已分配(true)或未分配(false)
在循环内
检查你是否 “在文章循环内”。这个函数对于插件开发者很有用,当我们在循环中时,这个条件会返回 true。
侧边栏是否已激活(有小工具)
检查指定侧边栏是否处于活动状态(侧边栏中有小工具)。如果使用侧栏(由名称,标识或编号标识)中有小工具,则返回 true,否则 false。
当前站点是否为网络的一部分(多站点)
检查当前站点是否在 WordPress MultiSite 安装中。
主站点(多站点)
确定站点是否为网络中的主站点。
网络管理员(多站点)
确定用户是否是网络(超级)管理员。
插件是否已激活
检查插件是否已激活。
子主题
检查当前站点是否正在使用子主题。
主题是否支持一项功能
检查主题是否支持某项功能。
代码示例
以下是条件函数的各种使用示例,演示我们可以如何使用这些条件标记。
文章详情
此示例演示了如何使用 is_single()
设置特定内容仅在查看单文章页面时显示:
if ( is_single() ) {
echo 'This is just one of many fabulous entries in the ' . single_cat_title() . ' category!';
}
这是一个在循环中使用条件函数的实例,当我们正在查看首页或单文章页面时,显示文章的完整内容,其他情况显示摘要。
if ( is_home() || is_single() ) {
the_content();
} else {
the_excerpt();
}
当我们需要在除了首页的其他页面显示某些内容时,可以使用如下代码。
<?php
if ( ! is_home() ) {
// Insert your markup ...
}
?>
检查多个条件
我们可以使用 PHP运算符 在单个 if 语句中判断多个条件。当我们需要检查当前页面是否满足多个条件时,这种处理方法非常有用。
if ( is_single() || is_page() ) {
// 如果当前页面是单文章页面或页面详情时,显示此处的内容
}
if ( is_archive() && ! is_category( 'nachos' ) ) {
// 如果当前页面时存档页面,单不是 ‘nachos’ 分类时,显示此处的内容
}
if ( $query->is_main_query() && is_post_type_archive( 'products' ) && ! is_admin() ) {
// 如果当前页面有一个主查询,并且为 ‘products’ 文章类型存档页面,并且不在管理页面时,显示这里的内容not in the WordPress admin, then do something special
}
if ( is_post_type_archive( 'movies' ) || is_tax( 'genre' ) || is_tax( 'actor' ) ) {
// 如果时‘movies’ 文章类型的存档页面
// 或者是 ‘genre’ 分类法的存档页面
// 或者是分类法 ‘actor’ 的存档页面
}
基于日期的差异
如果有人按日期浏览我们的网站,让我们使用不同的颜色区分各个年份的帖子:
<?php
if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<h2 id="post-<?php the_ID(); ?>">
<a href="<?php the_permalink() ?>" rel="bookmark">
<?php the_title(); ?>
</a>
</h2>
<small><?php the_time('F jS, Y') ?> by <?php the_author() ?></small>
<?php
if ( is_date() ) {
if ( date( 'Y' ) != get_the_date( 'Y' ) ) {
// 这是去年的文章,我们添加一个 “oldentry” 的类
// 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>
可变边栏内容
下面的示例根据用户访问的页面显示不同的侧边栏。
<div id="sidebar">
<?php
if ( is_home() ) {
// 我们在首页,显示所有顶级分类的列表
wp_list_categories( 'optionall=0&sort_column=name&list=1&children=0' );
} elseif ( is_category() ) {
// 我们在单页面,显示所有分类列表
wp_list_categories( 'optionall=1&sort_column=name&list=1&children=1&hierarchical=1' )
} elseif ( is_single() ) {
// 我们在单文章页面,不显示任何内容
} elseif ( is_page() ) {
// 我们在页面中,接下来检查在哪一个页面
if ( is_page( 'About' ) ) {
// 关于我们页面
echo "这是关于我们页面!";
} elseif ( is_page( 'contact' ) ) {
echo "这是联系我们页面。";
} else {
echo "其他页面";
}
} else {
echo "其他页面";
}
</div>
友好的 404 页面
创建一个友好的 404 页面可以让用户更方便的浏览网站,如在出现 404 错误时,提示用户返回首页或搜索。
if ( is_404() ) {
ehco "当前页面未找到,请返回首页或搜索您需要的内容。";
}
在主题的 footer.php 文件中
有时在其他模板(如 sidebar.php)中执行的查询可能会损坏某些条件标记。例如,在 header.php 中,条件标记可以正常工作,但在主题的 footer.php 中不起作用。解决这个问题的诀窍是在页脚中的条件测试之前放置 wp_reset_query。例如:
<?php
wp_reset_query();
if ( is_page( '2' ) ) {
echo 'This is page 2!';
}
?>
条件标签函数索引
- comments_open
- has_tag
- has_term
- in_category
- is_404
- is_admin
- is_archive
- is_attachment
- is_author
- is_category
- is_child_theme
- is_comments_popup
- is_date
- is_day
- is_feed
- is_front_page
- is_home
- is_month
- is_multi_author
- is_multisite
- is_main_site
- is_page
- is_page_template
- is_paged
- is_preview
- is_rtl
- is_search
- is_single
- is_singular
- is_sticky
- is_super_admin
- is_tag
- is_tax
- is_time
- is_trackback
- is_year
- pings_open
函数参考
- 函数: comments_open()
函数: is_404()
函数: is_admin()
函数: is_admin_bar_showing()
函数: is_archive()
函数: is_attachment()
函数: is_author()
函数: is_category()
函数: is_comments_popup()
函数: is_date()
函数: is_day()
函数: is_feed()
函数: is_front_page()
函数: is_home()
函数: is_local_attachment()
函数: is_main_query
函数: is_multi_author
函数: is_month()
函数: is_new_day()
函数: is_page()
函数: is_page_template()
函数: is_paged()
函数: is_plugin_active()
函数: is_plugin_active_for_network()
函数: is_plugin_inactive()
函数: is_plugin_page()
函数: is_post_type_archive()
函数: is_preview()
函数: is_search()
函数: is_single()
函数: is_singular()
函数: is_sticky()
函数: is_tag()
函数: is_tax()
函数: is_taxonomy_hierarchical()
函数: is_time()
函数: is_trackback()
函数: is_year()
函数: in_category()
函数: in_the_loop()
函数: is_active_sidebar()
函数: is_active_widget()
函数: is_blog_installed()
函数: is_rtl()
函数: is_dynamic_sidebar()
函数: is_user_logged_in()
函数: has_excerpt()
函数: has_post_thumbnail()
函数: has_tag()
函数: pings_open()
函数: email exists()
函数: post_type_exists()
函数: taxonomy_exists()
函数: term_exists()
函数: username exists()
函数: wp_attachment_is_image()
函数: wp_script_is()