剖析 WordPress `get_bloginfo(‘language’)` 函数的源码:它如何获取站点的语言。

各位码农好!今天咱们来扒一扒 WordPress 里那个小巧玲珑却又至关重要的 get_bloginfo('language') 函数的底裤,看看它到底是怎么知道你的网站用的是哪门子语言。准备好了吗?发车!

开场白:语言的重要性,以及get_bloginfo() 的角色

在构建一个全球通用的网站时,语言支持是重中之重。WordPress 作为一款强大的内容管理系统,自然考虑到了这一点。get_bloginfo() 函数就是 WordPress 提供的一个信息获取工具箱,它能告诉你网站的各种信息,比如站点名称、描述,当然也包括我们今天要重点研究的“语言”。

想象一下,你是一个翻译机器人,需要根据网站的语言来提供翻译服务。那你首先得知道网站用的是什么语言吧?get_bloginfo('language') 就像是你的寻语雷达,嗖的一下就能帮你找到目标语言。

准备工作:定位源码

要彻底了解 get_bloginfo('language'),我们需要找到它的源码。在 WordPress 的核心文件中,这个函数位于 wp-includes/general-template.php 文件中。你可以用你喜欢的代码编辑器打开这个文件,然后搜索 function get_bloginfo,就能找到它的真身。

深入源码:get_bloginfo() 函数的骨架

get_bloginfo() 函数的源码大致如下(简化版,忽略了一些不常用的参数和过滤):

function get_bloginfo( string $show = '', string $filter = 'raw' ) {
    global $wp_version, $wpdb, $blog_id;

    $output = '';

    switch ( $show ) {
        case 'name':
            $output = get_option( 'blogname' );
            break;
        case 'description':
            $output = get_option( 'blogdescription' );
            break;
        case 'wpurl':
        case 'url':
            $output = get_option( 'siteurl' );
            break;
        case 'language':
            $output = get_option( 'WPLANG' );
            if ( ! $output ) {
                $output = 'en-US'; // 默认值
            }
            break;
        // ... 其他 case ...
    }

    if ( 'raw' === $filter ) {
        return $output;
    }

    return apply_filters( 'get_bloginfo', $output, $show );
}

这个函数的核心是一个 switch 语句,根据传入的 $show 参数来决定返回什么信息。当我们调用 get_bloginfo('language') 时,$show 的值就是 'language',于是代码会进入 case 'language' 这个分支。

核心逻辑:get_option('WPLANG') 和默认值

case 'language' 分支中,关键代码是 get_option( 'WPLANG' )get_option() 函数是 WordPress 用来从数据库的 wp_options 表中读取配置项的。'WPLANG' 是一个特殊的配置项,它存储了网站的语言代码。

如果 get_option( 'WPLANG' ) 返回了非空值,说明网站已经设置了语言,那么这个值就会被赋值给 $output,然后返回。

但是,如果 get_option( 'WPLANG' ) 返回了空值(比如网站是第一次安装,还没有设置语言),那么 $output 就会被赋值为 'en-US',也就是英语(美国)的语言代码。这是一种默认行为,保证即使没有明确设置语言,也能返回一个默认值。

wp_options 表:语言的藏身之所

wp_options 表是 WordPress 存储各种配置信息的地方。你可以通过 phpMyAdmin 或者类似的数据库管理工具来查看这个表。你会发现,网站的名称、描述、URL 等信息都存储在这个表中。

当你在 WordPress 后台的“设置” -> “常规” 页面中选择网站语言时,WordPress 实际上就是将你选择的语言代码写入了 wp_options 表的 WPLANG 字段中。

apply_filters():灵活的扩展机制

get_bloginfo() 函数的最后,还有一个 apply_filters( 'get_bloginfo', $output, $show ) 调用。这是一个 WordPress 的钩子(Hook)机制,允许开发者通过过滤器来修改 get_bloginfo() 函数的返回值。

这意味着,你可以编写一个插件,利用 get_bloginfo 过滤器来修改网站的语言代码,比如根据用户的 IP 地址来动态地设置语言。这为网站的国际化提供了极大的灵活性。

总结:get_bloginfo('language') 的工作流程

为了更清晰地了解 get_bloginfo('language') 的工作流程,我们可以用一张表格来概括:

步骤 描述 代码
1 调用 get_bloginfo('language') get_bloginfo('language')
2 进入 case 'language' 分支 switch ( $show ) { case 'language': ... }
3 从数据库读取 WPLANG 配置项 $output = get_option( 'WPLANG' );
4 如果 WPLANG 存在,则返回其值 if ( ! $output ) { ... } else { return $output; }
5 如果 WPLANG 不存在,则返回默认值 'en-US' $output = 'en-US';
6 应用 get_bloginfo 过滤器 apply_filters( 'get_bloginfo', $output, $show );
7 返回最终的语言代码 return $output;

实际应用:在主题和插件中使用 get_bloginfo('language')

现在我们知道了 get_bloginfo('language') 的工作原理,那么该如何在主题和插件中使用它呢?

  • 在主题中使用:

    你可以在主题的任何地方使用 get_bloginfo('language') 来获取网站的语言代码。比如,你可以在 <html> 标签中添加 lang 属性:

    <html <?php language_attributes(); ?>>

    language_attributes() 函数会自动输出 lang 属性,其值就是 get_bloginfo('language') 的返回值。

  • 在插件中使用:

    在插件中,你可以使用 get_bloginfo('language') 来根据网站的语言加载不同的资源文件。比如,你可以根据语言代码加载不同的翻译文件:

    $language = get_bloginfo('language');
    if ( 'zh-CN' === $language ) {
       // 加载中文翻译文件
       load_plugin_textdomain( 'my-plugin', false, dirname( plugin_basename( __FILE__ ) ) . '/languages' );
    }

一些补充说明:

  1. 语言代码的格式: WordPress 使用的语言代码通常是 ISO 639-1ISO 3166-1 alpha-2 的组合,比如 en-US(英语(美国))、zh-CN(中文(中国))、fr-FR(法语(法国))等。

  2. 多语言插件: 虽然 get_bloginfo('language') 可以告诉你网站的默认语言,但如果你需要支持多种语言,就需要使用专门的多语言插件,比如 WPML、Polylang 等。这些插件通常会提供更高级的语言管理功能,比如根据用户的语言偏好显示不同的内容。

  3. WPLANG 配置项的优先级: WPLANG 配置项的优先级比较高。即使你安装了多语言插件,并且设置了不同的语言,get_bloginfo('language') 仍然会返回 WPLANG 的值,除非多语言插件修改了 get_bloginfo 过滤器。

代码示例:利用 get_bloginfo 过滤器修改语言代码

下面是一个简单的插件示例,演示了如何使用 get_bloginfo 过滤器来修改语言代码:

<?php
/**
 * Plugin Name: Custom Language Code
 * Description: Modifies the language code returned by get_bloginfo('language').
 * Version: 1.0.0
 */

add_filter( 'get_bloginfo', 'custom_language_code', 10, 2 );

function custom_language_code( $output, $show ) {
    if ( 'language' === $show ) {
        // 根据某些条件修改语言代码
        $output = 'en-GB'; // 修改为英语(英国)
    }
    return $output;
}

这个插件定义了一个 custom_language_code 函数,它接受两个参数:$outputget_bloginfo() 函数的原始返回值,$show 是传入 get_bloginfo() 函数的参数。

custom_language_code 函数中,我们判断 $show 是否为 'language'。如果是,则将 $output 修改为 'en-GB',也就是英语(英国)的语言代码。

这样,当你调用 get_bloginfo('language') 时,它就会返回 'en-GB',而不是网站的默认语言代码。

总结的总结:get_bloginfo('language') 的价值

get_bloginfo('language') 函数虽然简单,但它却是 WordPress 国际化和本地化的基石。通过它,你可以轻松地获取网站的语言代码,并根据语言代码来定制网站的内容和行为。理解了它的工作原理,你就能更好地利用 WordPress 来构建全球通用的网站。

希望今天的讲座能让你对 get_bloginfo('language') 函数有一个更深入的了解。记住,源码是最好的老师!多多阅读源码,你也能成为 WordPress 大师! 下课!

发表回复

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