咳咳,各位观众老爷们,晚上好!我是今天的主讲人,咱们今儿个就来聊聊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 );
}
看起来很简单,对不对? 咱们一行一行来分析:
-
function is_singular( $post_types = '' )
:定义了一个名为is_singular
的函数,它接受一个可选的参数$post_types
,用于指定文章类型。如果不传参,默认匹配所有文章类型。 -
global $wp_query;
:声明使用全局变量$wp_query
。$wp_query
是WordPress的核心对象,包含了当前请求的所有查询信息,比如当前页面是文章页还是分类页,等等。 -
if ( ! isset( $wp_query ) ) { return false; }
:这是一个安全检查。如果$wp_query
对象不存在,说明WordPress还没有完成初始化,直接返回false
。 -
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 );
}
这个代码稍微复杂一点,咱们也一点一点来分析:
-
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
: 用于判断是否是附件页。
-
if ( empty( $post_types ) ) { return true; }
:如果$post_types
参数为空,说明我们没有指定要匹配的文章类型,只要是文章页、页面或附件页,就返回true
。 -
$post_types = (array) $post_types;
:将$post_types
参数转换为数组。这样可以方便我们同时匹配多种文章类型。 -
$post_type = get_query_var( 'post_type' );
:获取当前页面的文章类型。get_query_var( 'post_type' )
是WordPress提供的一个函数,用于获取查询变量的值。 -
if ( is_array( $post_type ) ) { ... }
:如果$post_type
是一个数组(这种情况比较少见,通常是自定义文章类型的存档页),则取数组的第一个元素作为文章类型。 -
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主题的时候,就能更加灵活地运用它们,打造出更加个性化的网站。
好啦,今天的讲座就到这里,感谢各位的收听!如果大家还有什么疑问,欢迎随时提问。咱们下期再见!