详解 WordPress 条件标签源码:`is_singular()` 与 `is_archive()` 的判断逻辑。

咳咳,各位观众老爷们,晚上好!我是今天的主讲人,咱们今儿个就来聊聊WordPress条件标签里头那俩“老熟人”—— is_singular()is_archive()。别看它们名字简单,肚子里面的道道可不少。今天咱们就扒开它们的皮,看看里面的筋骨,保证让各位以后用起来得心应手,再也不犯迷糊。

开场白:条件标签是个啥?

在深入讲解 is_singular()is_archive() 之前,咱们先简单回顾一下啥是条件标签。简单来说,条件标签就是WordPress提供的一系列函数,它们的作用是判断当前页面是否符合某种特定的条件。就好比咱们玩游戏时候的“if…else…”语句,根据不同的情况执行不同的代码。

这些条件标签可以让我们在主题模板文件中灵活地控制内容的显示,比如:

  • 只在文章页显示“分享”按钮。
  • 在分类存档页显示分类描述。
  • 不在首页显示侧边栏。

总而言之,条件标签是让你的WordPress主题变得更加智能和可定制的利器。

主角登场:is_singular()

好,现在咱们正式进入今天的主角之一:is_singular()

作用: 判断当前页面是否为单个内容页面(文章、页面、自定义文章类型)。

返回值: 如果是单个内容页面,返回 true,否则返回 false

源码剖析:

想要真正理解 is_singular(),最好的方法就是看看它的源码。咱们直接上代码:

function is_singular( $post_types = '' ) {
    global $wp_query;

    if ( ! isset( $wp_query ) ) {
        return false;
    }

    return $wp_query->is_singular( $post_types );
}

看起来很简单,对不对? 咱们一行一行来分析:

  1. function is_singular( $post_types = '' ):定义了一个名为 is_singular 的函数,它接受一个可选的参数 $post_types,用于指定文章类型。如果不传参,默认匹配所有文章类型。

  2. global $wp_query;:声明使用全局变量 $wp_query$wp_query 是WordPress的核心对象,包含了当前请求的所有查询信息,比如当前页面是文章页还是分类页,等等。

  3. if ( ! isset( $wp_query ) ) { return false; }:这是一个安全检查。如果 $wp_query 对象不存在,说明WordPress还没有完成初始化,直接返回 false

  4. return $wp_query->is_singular( $post_types );:这是最关键的一行代码。它调用了 $wp_query 对象的 is_singular() 方法,并将我们传入的 $post_types 参数传递给它。

所以,is_singular() 实际上只是一个“代理”,它把判断的任务交给了 $wp_query 对象。咱们还得继续深入,看看 $wp_query 对象的 is_singular() 方法是怎么实现的。

public function is_singular( $post_types = '' ) {
    if ( ! $this->is_single && ! $this->is_page && ! $this->is_attachment ) {
        return false;
    }

    if ( empty( $post_types ) ) {
        return true;
    }

    $post_types = (array) $post_types;

    $post_type = get_query_var( 'post_type' );

    if ( is_array( $post_type ) ) {
        if ( empty( $post_type ) ) {
            return false;
        }

        $post_type = reset( $post_type );
    }

    return in_array( $post_type, $post_types, true );
}

这个代码稍微复杂一点,咱们也一点一点来分析:

  1. if ( ! $this->is_single && ! $this->is_page && ! $this->is_attachment ) { return false; }: 这一步首先判断 $wp_query 对象的 $is_single$is_page$is_attachment 属性是否都为 false。如果都为 false,说明当前页面既不是文章页,也不是页面,也不是附件页,那肯定不是单个内容页面,直接返回 false

    • $this->is_single: 用于判断是否是文章页(post)。
    • $this->is_page: 用于判断是否是页面(page)。
    • $this->is_attachment: 用于判断是否是附件页。
  2. if ( empty( $post_types ) ) { return true; }:如果 $post_types 参数为空,说明我们没有指定要匹配的文章类型,只要是文章页、页面或附件页,就返回 true

  3. $post_types = (array) $post_types;:将 $post_types 参数转换为数组。这样可以方便我们同时匹配多种文章类型。

  4. $post_type = get_query_var( 'post_type' );:获取当前页面的文章类型。get_query_var( 'post_type' ) 是WordPress提供的一个函数,用于获取查询变量的值。

  5. if ( is_array( $post_type ) ) { ... }:如果 $post_type 是一个数组(这种情况比较少见,通常是自定义文章类型的存档页),则取数组的第一个元素作为文章类型。

  6. return in_array( $post_type, $post_types, true );:判断当前页面的文章类型是否在 $post_types 数组中。in_array() 是一个PHP函数,用于判断一个值是否存在于一个数组中。第三个参数 true 表示进行严格类型比较。

使用示例:

咱们来看几个 is_singular() 的使用示例:

  • 判断是否是文章页:

    if ( is_singular( 'post' ) ) {
        echo '<p>这是一个文章页。</p>';
    }
  • 判断是否是页面:

    if ( is_singular( 'page' ) ) {
        echo '<p>这是一个页面。</p>';
    }
  • 判断是否是自定义文章类型 book

    if ( is_singular( 'book' ) ) {
        echo '<p>这是一个书籍详情页。</p>';
    }
  • 判断是否是文章页或页面:

    if ( is_singular( array( 'post', 'page' ) ) ) {
        echo '<p>这是一个文章页或页面。</p>';
    }

注意事项:

  • is_singular() 只能在主循环中使用,也就是说,必须在 while ( have_posts() ) : the_post(); 循环内部或循环之后使用。
  • 如果不传 $post_types 参数,is_singular() 会匹配所有文章类型,包括文章、页面、附件和自定义文章类型。
  • is_singular()is_single(), is_page() 存在区别。is_single() 专门用于判断是否是文章页(post),而 is_page() 专门用于判断是否是页面(page)。is_singular() 则更加通用,可以判断是否是任何类型的单个内容页面。

压轴登场:is_archive()

接下来,咱们再来看看今天的另一位主角:is_archive()

作用: 判断当前页面是否为存档页(分类存档、标签存档、作者存档、日期存档、自定义文章类型存档)。

返回值: 如果是存档页,返回 true,否则返回 false

源码剖析:

老规矩,咱们还是先看看源码:

function is_archive() {
    global $wp_query;

    if ( ! isset( $wp_query ) ) {
        return false;
    }

    return $wp_query->is_archive();
}

is_singular() 一样,is_archive() 也是一个“代理”,它把判断的任务交给了 $wp_query 对象的 is_archive() 方法。

public function is_archive() {
    return (bool) $this->is_archive;
}

这次的代码更简单了! is_archive() 直接返回 $wp_query 对象的 $is_archive 属性的值。

所以,问题的关键在于 $wp_query 对象的 $is_archive 属性是什么时候被设置的。答案是:在WordPress解析请求的时候,会根据当前URL判断是否是存档页,如果是,就会将 $is_archive 属性设置为 true

细分:各种存档页

虽然 is_archive() 只是简单地判断 $is_archive 属性,但是WordPress还提供了更具体的条件标签,用于判断不同类型的存档页:

  • is_category():判断是否是分类存档页。
  • is_tag():判断是否是标签存档页。
  • is_author():判断是否是作者存档页。
  • is_date():判断是否是日期存档页。
  • is_post_type_archive():判断是否是自定义文章类型存档页。
  • is_tax():判断是否是自定义分类法(taxonomy)存档页。

这些更具体的条件标签实际上也是基于 $wp_query 对象的属性进行判断的。比如,is_category() 的源码如下:

function is_category( $category = '' ) {
    global $wp_query;

    if ( ! isset( $wp_query ) ) {
        return false;
    }

    return $wp_query->is_category( $category );
}
public function is_category( $category = '' ) {
    if ( ! $this->is_category ) {
        return false;
    }

    if ( empty( $category ) ) {
        return true;
    }

    return $this->is_term( $category, 'category' );
}

可以看到,is_category() 首先判断 $wp_query 对象的 $is_category 属性是否为 true,如果是,再判断是否指定了分类,如果指定了分类,则判断当前页面是否是该分类的存档页。

使用示例:

咱们来看几个 is_archive() 和其他存档页条件标签的使用示例:

  • 判断是否是存档页:

    if ( is_archive() ) {
        echo '<p>这是一个存档页。</p>';
    }
  • 判断是否是分类存档页:

    if ( is_category() ) {
        echo '<p>这是一个分类存档页。</p>';
    }
  • 判断是否是标签存档页:

    if ( is_tag() ) {
        echo '<p>这是一个标签存档页。</p>';
    }
  • 判断是否是作者存档页:

    if ( is_author() ) {
        echo '<p>这是一个作者存档页。</p>';
    }
  • 判断是否是自定义文章类型 book 的存档页:

    if ( is_post_type_archive( 'book' ) ) {
        echo '<p>这是一个书籍存档页。</p>';
    }
  • 在分类存档页显示分类描述:

    if ( is_category() ) {
        echo '<p>' . category_description() . '</p>';
    }

注意事项:

  • is_archive() 只是一个通用的判断,如果你需要判断具体的存档类型,建议使用 is_category()is_tag() 等更具体的条件标签。
  • is_post_type_archive() 需要传入文章类型作为参数。
  • is_tax() 用于判断自定义分类法存档页,需要传入分类法名称作为参数。

总结:

咱们今天深入剖析了 is_singular()is_archive() 这两个常用的WordPress条件标签。

条件标签 作用 源码分析 使用场景 注意事项
is_singular() 判断当前页面是否为单个内容页面(文章、页面、自定义文章类型)。 最终判断 $wp_query 对象的 $is_single$is_page$is_attachment 属性,以及可选的文章类型参数。 在文章、页面或自定义文章类型页面显示特定的内容或功能,例如“分享”按钮、相关文章等。 只能在主循环中使用,可以传入文章类型参数进行更精确的判断。
is_archive() 判断当前页面是否为存档页(分类存档、标签存档、作者存档、日期存档、自定义文章类型存档)。 简单地返回 $wp_query 对象的 $is_archive 属性的值。更具体的存档类型判断(如 is_category()is_tag() 等)也是基于 $wp_query 对象的属性。 在存档页面显示不同的布局或内容,例如分类描述、作者简介、日期归档列表等。 只是一个通用的判断,建议使用更具体的条件标签(如 is_category())来判断具体的存档类型。 is_post_type_archive() 需要传入文章类型作为参数, is_tax() 需要传入分类法名称作为参数。

希望通过今天的讲解,各位对这两个条件标签有了更深入的理解。以后在开发WordPress主题的时候,就能更加灵活地运用它们,打造出更加个性化的网站。

好啦,今天的讲座就到这里,感谢各位的收听!如果大家还有什么疑问,欢迎随时提问。咱们下期再见!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注