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 中使用前,注意查询状态是否被污染。

动手在你的主题里试试这些例子,改一改参数,看看会发生什么。好的学习方式就是把代码敲进去,看它跑起来的效果。