WordPress 条件标签完全指南:掌控主题显示逻辑
WordPress 主题开发中,你经常需要在不同页面显示不同内容——首页展示新文章,单页显示完整内容,分类页展示特定样式。条件标签就是实现这一切的核心工具。它们是 WordPress 内置的 PHP 函数,用来检测当前页面是什么类型、什么内容,然后让你根据这些信息做出不同的显示决策。
这篇文章基于 WordPress 官方文档,以经典主题(Classic Themes)为背景,帮你从零理解条件标签的原理、用法和实战技巧。我会避开晦涩的术语堆砌,用实际的代码片段和场景例子,让你明白什么时候用、怎么用、为什么要这么用。读完这篇,你至少能解决 80% 的主题判断需求。
条件标签是什么
条件标签本质上就是一组返回 true 或 false 的 PHP 函数。它们通常放在 if 和 else 语句里,根据当前页面是否符合某个条件,决定显示哪一段代码。
php
<?php
if ( is_user_logged_in() ) {
echo '欢迎回来,老朋友!';
} else {
echo '你好,新朋友,欢迎光临!';
}
?>
这段代码问了一句“用户登录了吗?”——登录了就说一句,没登录就说二句。
关键点:条件标签依赖已经查询到的数据。WordPress 加载 functions.php 文件时,数据库查询还没开始,所以你不能在这个文件里直接用条件标签。如果非要在 functions.php 里用,就得把它包在一个函数里,挂载到后面触发的钩子上。
常用的几个条件标签
is_home() — 博客首页
返回 true 的情况:你在访问站点的主博客页,也就是按时间倒序显示文章的那个页面。
注意,如果你在“设置 → 阅读”里把首页设成了一个静态页面,那 is_home() 只在被设为“文章页面”的那个页面上返回 true。
php
<?php
if ( is_home() ) {
echo '这里是博客文章列表';
}
?>
is_front_page() — 站点首页
返回 true 的情况:你在访问整个站点的首页。不管你的首页是文章列表还是静态页面,都算。
php
<?php
if ( is_front_page() ) {
// 多数站点会在首页放一个特别的横幅
echo '<div class="hero-banner">欢迎光临!</div>';
}
?>
is_single() — 单篇文章
判断当前是否在查看某篇单独的文章(包括自定义文章类型)。
它还能接受参数做更精细的判断:
php
<?php
// 判断是不是文章 ID 为 42 的单页
if ( is_single( 42 ) ) {
echo '这是 ID 为 42 的文章';
}
// 判断是不是标题叫“西红柿炖牛腩”的文章
if ( is_single( '西红柿炖牛腩' ) ) {
echo '这是西红柿炖牛腩那篇';
}
// 判断是不是别名(slug)为“beef-stew”的文章
if ( is_single( 'beef-stew' ) ) {
echo '这是牛肉炖菜那篇';
}
// 传入数组:只要符合其中任意一个,就为 true
if ( is_single( array( 42, 'beef-stew', '西红柿炖牛腩' ) ) ) {
echo '这是其中某篇文章';
}
?>
is_page() — 独立页面
和 is_single() 类似,但判断的是 WordPress 的“页面”(Page),就是后台左侧菜单里那个“页面”。
php
<?php
// 判断是不是“关于我们”这个页面
if ( is_page( '关于我们' ) ) {
echo '这是关于我们的页面';
}
// 判断是不是子页面
global $post;
if ( is_page() && $post->post_parent ) {
echo '这是一个子页面,父页面 ID 是:' . $post->post_parent;
}
?>
is_category() 与 in_category()
is_category() 判断当前是否在分类归档页,in_category() 判断当前文章是否属于某个分类。
php
<?php
// 是不是分类 ID 为 9 的归档页
if ( is_category( 9 ) ) {
echo '这是分类 9 的归档页';
}
// 当前文章是不是属于分类 5(用在循环里)
if ( in_category( 5 ) ) {
echo '这篇文章属于分类 5';
}
// 当前文章不属于分类 4、5、6
if ( ! in_category( array( 4, 5, 6 ) ) ) {
echo '这篇文章不在分类 4、5、6 里';
}
?>
is_archive() — 各种归档页
任何归档页面——分类、标签、作者、日期归档,都会返回 true。它是个总开关。
php
<?php
if ( is_archive() ) {
echo '你正在浏览某种归档页面';
}
?>
is_search() — 搜索结果页
php
<?php
if ( is_search() ) {
echo '这是搜索结果页';
}
?>
is_404() — 404 页面
php
<?php
if ( is_404() ) {
echo '页面走丢了,但我们还在';
}
?>
页面模板的判断
is_page_template()
判断当前页面是否使用了某个特定的页面模板。注意:参数要填模板文件名,包括可能的子目录路径。
php
<?php
// 判断是否使用了 about.php 这个模板
if ( is_page_template( 'about.php' ) ) {
echo '这个页面用的是 about.php 模板';
}
// 如果模板在子目录里
if ( is_page_template( 'page-templates/landing.php' ) ) {
echo '这是落地页模板';
}
?>
文章特有的判断
is_sticky() — 置顶文章
php
<?php
// 当前文章是否被置顶(用在循环里)
if ( is_sticky() ) {
echo '这是置顶文章,显示时加个特殊样式';
}
// 判断某篇文章是不是置顶
if ( is_sticky( 17 ) ) {
echo '文章 17 是置顶的';
}
?>
has_excerpt() — 是否有摘要
php
<?php
if ( has_excerpt() ) {
the_excerpt();
} else {
echo '这篇文章没有摘要,显示前 30 个字吧';
}
?>
comments_open() 与 pings_open()
判断当前文章是否允许评论或引用通知。
php
<?php
if ( comments_open() ) {
comment_form();
} else {
echo '评论已关闭';
}
?>
作者与日期
is_author() — 作者归档页
php
<?php
// 判断是不是作者 ID 为 4 的归档页
if ( is_author( 4 ) ) {
echo '这是作者 4 的页面';
}
// 判断是不是别名为“john-doe”的作者
if ( is_author( 'john-doe' ) ) {
echo '这是 John Doe 的作者页';
}
?>
is_year() / is_month() / is_day()
php
<?php
if ( is_year() ) {
echo '按年份归档';
} elseif ( is_month() ) {
echo '按月份归档';
} elseif ( is_day() ) {
echo '按日归档';
}
?>
is_multi_author()
检查这个站点是否有多位作者发表过文章。
php
<?php
if ( is_multi_author() ) {
echo '这个站有多个作者,显示作者信息框';
}
?>
自定义文章类型与分类
is_singular() — 通用单页
is_single()、is_page()、is_attachment() 的总和,还能指定自定义文章类型。
php
<?php
// 判断是不是“图书”这个自定义文章类型的单页
if ( is_singular( 'book' ) ) {
echo '这是一本图书的详情页';
}
// 判断是不是“报刊”或“图书”
if ( is_singular( array( 'newspaper', 'book' ) ) ) {
echo '这是报刊或图书的单页';
}
?>
get_post_type() — 获取当前文章类型
严格来说它不是条件标签,但经常配合使用。
php
<?php
if ( 'book' == get_post_type() ) {
echo '当前文章类型是 book';
}
?>
is_post_type_archive() — 自定义文章类型归档
php
<?php
if ( is_post_type_archive( 'book' ) ) {
echo '这是图书归档页';
}
?>
注意:使用 is_post_type_archive() 前,你注册自定义文章类型时要把 has_archive 设为 true。
has_term() — 是否有某个分类术语
php
<?php
// 当前文章是否有“绿色”这个颜色分类
if ( has_term( '绿色', 'color' ) ) {
echo '这篇文章是绿色的';
}
// 是否有颜色分类中的红、蓝、绿之一
if ( has_term( array( '红', '蓝', '绿' ), 'color' ) ) {
echo '这篇文章是彩色分类之一';
}
?>
在循环中判断
in_the_loop()
检查当前是否在“循环”内部。这对插件开发者比较有用。
php
<?php
if ( in_the_loop() ) {
// 在循环内,可以安全使用 the_title() 等函数
the_title();
}
?>
组合使用多个条件
用 PHP 的逻辑运算符把多个条件串起来,能做出更精细的判断。
php
<?php
// 既不是首页,又不是单页
if ( ! is_home() && ! is_single() ) {
echo '既不是首页也不是单篇文章页';
}
// 是归档页,但不是“美食”分类
if ( is_archive() && ! is_category( '美食' ) ) {
echo '这是归档页,但排除掉了美食分类';
}
// 是主查询,且是产品归档页,且不在后台
if ( $wp_query->is_main_query() && is_post_type_archive( 'product' ) && ! is_admin() ) {
echo '这是产品归档页的主查询,且不是后台操作';
}
?>
在 footer.php 里使用条件标签
如果你在侧边栏或其他模板里做了额外的查询,可能会干扰主查询的状态,导致条件标签在 footer.php 里失效。解决办法是在判断前重置查询:
php
<?php
wp_reset_query();
if ( is_page( 2 ) ) {
echo '这是页面 2!';
}
?>
将条件标签应用到实际场景
场景一:不同页面显示不同侧边栏
php
<div id="sidebar">
<?php
if ( is_home() ) {
// 首页显示所有分类
wp_list_categories( 'title_li=&depth=1' );
} elseif ( is_category() ) {
// 分类页显示所有分类(含子分类)
wp_list_categories( 'title_li=&depth=0' );
} elseif ( is_page( '关于' ) ) {
// 关于页面显示一段固定文字
echo '<p>这是关于页面专属的侧边栏内容</p>';
} else {
// 其他所有情况
echo '<p>默认侧边栏内容</p>';
}
?>
</div>
场景二:日期归档中,给不同年份的文章不同样式
php
<?php if ( have_posts() ) : while ( have_posts() ) : the_post(); ?>
<h2><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h2>
<small><?php the_time( 'Y年m月d日' ); ?> 作者:<?php the_author(); ?></small>
<?php
if ( is_date() && date( 'Y' ) != get_the_date( 'Y' ) ) {
// 日期归档下,当前文章属于往年,加一个灰色样式
echo '<div class="entry old-post">';
} else {
echo '<div class="entry">';
}
the_content( '继续阅读 »' );
echo '</div>';
?>
<?php endwhile; endif; ?>
场景三:判断某个页面是否为子页面
WordPress 没有直接提供 is_subpage(),但你可以自己写一个。
php
function is_subpage() {
global $post;
if ( is_page() && $post->post_parent ) {
return $post->post_parent;
}
return false;
}
// 用法
if ( is_subpage() ) {
echo '这是一个子页面,父页面 ID:' . is_subpage();
}
总结
条件标签是 WordPress 主题开发中基础也常用的工具,掌握了它们,你就掌握了控制页面内容展示的主动权。这篇文章覆盖了从简单的 is_home() 到组合条件、自定义文章类型判断的全部内容。
核心要点:
- 条件标签返回
true或false,配合if/else控制显示逻辑。 - 它们依赖已经完成的数据库查询,不要在
functions.php顶层直接使用。 - 单页判断用
is_single(),页面判断用is_page(),归档判断用is_archive()。 - 组合多个条件能实现更精准的控制。
- 侧边栏或 footer 中使用前,注意查询状态是否被污染。
动手在你的主题里试试这些例子,改一改参数,看看会发生什么。好的学习方式就是把代码敲进去,看它跑起来的效果。