探究 WordPress `get_template()` 和 `get_stylesheet()` 函数的源码:如何获取当前主题的目录名。

嘿,大家好!我是你们今天的WordPress主题目录名侦探,代号“代码猎手”。今天咱们来扒一扒WordPress里get_template()get_stylesheet()这两个小家伙的底裤,看看它们是怎么帮我们搞到当前主题的目录名的。准备好,我们要开始解剖源码了!

第一幕:案发现场——get_template()get_stylesheet() 的基本案情

首先,我们先来了解一下这两个函数的基本情况。

  • get_template():这个函数返回的是主主题(Parent Theme)的目录名。注意,是目录名,不是主题的完整路径。比如,你的主主题放在 /wp-content/themes/my-parent-theme/ 下,那么 get_template() 返回的就是 my-parent-theme

  • get_stylesheet():这个函数返回的是当前使用主题的目录名。如果你的主题是子主题,那么它返回的是子主题的目录名;如果不是子主题,那么它返回的就是主主题的目录名。

为了更清晰,我们用表格来总结一下:

函数 返回值 场景
get_template() 主主题的目录名 始终返回主主题的目录名,即使当前使用的是子主题。
get_stylesheet() 当前使用主题的目录名(子主题优先,否则返回主主题目录名) 如果当前使用子主题,返回子主题目录名;如果当前使用主主题,返回主主题目录名。

第二幕:深入虎穴——源码解剖

现在,我们要深入WordPress的核心代码,看看这两个函数到底是怎么工作的。为了简化,我们只关注关键部分。

1. get_template() 的源码追踪

get_template() 函数定义在 wp-includes/theme.php 文件中。它的简化版代码如下:

function get_template() {
    return get_option( 'template' );
}

是不是很简单? get_template() 实际上只是调用了 get_option('template')get_option() 函数是WordPress用来读取数据库选项的函数。在这里,它读取了名为 'template' 的选项。

那么,'template' 这个选项是在哪里设置的呢?它是在主题切换的时候设置的。当你激活一个主题时,WordPress会把这个主题的目录名保存到 'template' 选项中。

2. get_stylesheet() 的源码追踪

get_stylesheet() 函数同样定义在 wp-includes/theme.php 文件中。它的简化版代码如下:

function get_stylesheet() {
    return get_option( 'stylesheet' );
}

get_template() 类似,get_stylesheet() 也只是调用了 get_option('stylesheet')。 区别在于它读取的是 'stylesheet' 选项。

'stylesheet' 选项也一样是在主题切换的时候设置的。如果当前激活的是一个子主题,那么 'stylesheet' 选项保存的是子主题的目录名;如果激活的是一个主主题,那么 'stylesheet' 选项保存的是主主题的目录名。

第三幕:幕后黑手——switch_theme() 函数

现在,我们知道了 get_template()get_stylesheet() 实际上是从数据库中读取选项的值。那么,是谁把这些值写到数据库里的呢?答案是 switch_theme() 函数。

switch_theme() 函数负责处理主题切换的逻辑。当你点击“激活”按钮来切换主题时,WordPress会调用 switch_theme() 函数来更新数据库中的主题相关选项。

虽然 switch_theme() 函数的代码比较复杂,但我们可以简化一下,只关注和 'template''stylesheet' 选项相关的部分:

function switch_theme( $stylesheet, $template = '' ) {
    // ... 一些代码 ...

    update_option( 'stylesheet', $stylesheet );

    if ( empty( $template ) ) {
        $template = $stylesheet;
    }

    update_option( 'template', $template );

    // ... 更多代码 ...
}

可以看到,switch_theme() 函数接收两个参数:$stylesheet$template

  • $stylesheet:表示当前使用主题的目录名。
  • $template:表示主主题的目录名。

如果当前激活的是一个子主题,那么 $stylesheet 就是子主题的目录名,而 $template 就是主主题的目录名。如果当前激活的是一个主主题,那么 $stylesheet$template 都是主主题的目录名。

switch_theme() 函数会调用 update_option() 函数来更新数据库中的 'stylesheet''template' 选项。

第四幕:案例分析——实战演练

为了更好地理解 get_template()get_stylesheet() 的用法,我们来看几个实际的例子。

案例 1:当前使用主主题

假设你的主题目录结构如下:

/wp-content/themes/
    |- my-theme/
        |- style.css
        |- index.php

你激活了 my-theme 这个主题。那么:

echo get_template(); // 输出:my-theme
echo get_stylesheet(); // 输出:my-theme

案例 2:当前使用子主题

假设你的主题目录结构如下:

/wp-content/themes/
    |- my-parent-theme/
        |- style.css
        |- index.php
    |- my-child-theme/
        |- style.css
        |- functions.php

my-child-thememy-parent-theme 的子主题,并且你已经激活了 my-child-theme 这个主题。那么:

echo get_template(); // 输出:my-parent-theme
echo get_stylesheet(); // 输出:my-child-theme

案例 3:在主题文件中使用

通常,我们会把 get_template()get_stylesheet() 用在主题文件中,比如 header.phpfooter.php 中。 我们可以用它们来构建主题的资源路径。

例如,假设你想在主题的 header.php 文件中引入一个 CSS 文件,你可以这样写:

<link rel="stylesheet" href="<?php echo get_stylesheet_directory_uri(); ?>/css/style.css">

这里,get_stylesheet_directory_uri() 函数返回的是当前使用主题的目录的 URL。 如果当前使用的是子主题,那么它返回的是子主题的 URL;如果当前使用的是主主题,那么它返回的是主主题的 URL。

第五幕:进阶技巧——更多关于主题目录的函数

除了 get_template()get_stylesheet() 之外,WordPress还提供了一些其他的函数来获取主题目录的信息。

函数 返回值
get_template_directory() 主主题的目录的绝对路径。
get_stylesheet_directory() 当前使用主题的目录的绝对路径。
get_template_directory_uri() 主主题的目录的 URL。
get_stylesheet_directory_uri() 当前使用主题的目录的 URL。
get_theme_root() 主题根目录的绝对路径(通常是 /wp-content/themes/)。
get_theme_root_uri() 主题根目录的 URL(通常是 http://example.com/wp-content/themes/)。
get_parent_theme_file_path( $path ) 获取主主题目录下指定文件的绝对路径。
get_stylesheet_directory_uri() 获取当前主题(包括子主题)的目录的URL。
get_theme_file_path( $path ) 获取当前主题(包括子主题)目录下指定文件的绝对路径。
get_theme_file_uri( $path ) 获取当前主题(包括子主题)目录下指定文件的URL。

这些函数可以帮助我们更灵活地构建主题,并处理各种主题相关的逻辑。

第六幕:疑难解答——常见问题

  • 问:get_template()get_stylesheet() 有什么区别?

    答:get_template() 返回的是主主题的目录名,而 get_stylesheet() 返回的是当前使用主题的目录名(子主题优先)。

  • 问:什么时候应该使用 get_template(),什么时候应该使用 get_stylesheet()

    答:如果你需要获取主主题的信息,就使用 get_template()。如果你需要获取当前使用主题的信息,就使用 get_stylesheet()。通常,在构建主题的资源路径时,你应该使用 get_stylesheet_directory_uri()get_stylesheet_directory(),因为它们会根据当前使用的主题(包括子主题)返回正确的路径。

  • 问:为什么我使用 get_template() 返回的是一个空字符串?

    答:这种情况通常发生在主题切换的过程中。在某些情况下,'template' 选项可能还没有被正确设置。你可以尝试刷新页面或者重新激活主题。

第七幕:结案陈词——总结

好了,经过一番抽丝剥茧,我们终于搞清楚了 get_template()get_stylesheet() 这两个函数的秘密。它们实际上只是从数据库中读取选项的值,而这些选项是在主题切换的时候设置的。

掌握了这些知识,你就可以更好地理解WordPress的主题机制,并更灵活地构建自己的主题了。

希望今天的讲座对大家有所帮助!下次再见!

发表回复

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