博客 / WordPress 教程

WordPress开发中,如何为不同语言的配置不同的网站名称?

在 WordPress 开发中,为了根据不同语言(通过 $lang 变量,如 en、ja、de 等)配置不同的网站标题(Site Title),可以使用以下方法动态设置标题。以下是几种实现方式,假设你已经在代码中定义了 $lang 变量:

方法 1:使用 pre_get_document_title 过滤器

这是最推荐的方式,因为它直接控制页面标题的输出,适用于前端显示的标题。

add_filter('pre_get_document_title', 'custom_site_title_by_language', 10, 1);

function custom_site_title_by_language($title) {
    global $lang; // 假设 $lang 是全局变量,包含语言代码如 'en', 'ja', 'de'

    // 定义不同语言的网站标题
    $site_titles = array(
        'en' => 'My Website',        // 英文标题
        'ja' => '私のウェブサイト',   // 日文标题
        'de' => 'Meine Webseite',    // 德文标题
    );

    // 获取当前语言的标题,默认为英文
    $custom_title = isset($site_titles[$lang]) ? $site_titles[$lang] : $site_titles['en'];

    return $custom_title;
}

说明

  • 将代码添加到主题的 functions.php 文件中。
  • pre_get_document_title 过滤器会在 WordPress 生成 <title> 标签时被调用。
  • 根据 $lang 的值返回对应的标题。如果 $lang 未定义或不在数组中,默认为英文标题。

方法 2:使用 bloginfo 过滤器动态修改 name

如果你希望通过 bloginfo(‘name’) 获取的网站标题也根据语言动态变化,可以使用 bloginfo 过滤器。

add_filter('bloginfo', 'custom_site_title_for_bloginfo', 10, 2);

function custom_site_title_for_bloginfo($output, $show) {
    global $lang; // 假设 $lang 是全局变量

    if ($show === 'name') { // 只针对 bloginfo('name') 的调用
        $site_titles = array(
            'en' => 'My Website',
            'ja' => '私のウェブサイト',
            'de' => 'Meine Webseite',
        );

        // 返回当前语言的标题,默认为英文
        $output = isset($site_titles[$lang]) ? $site_titles[$lang] : $site_titles['en'];
    }

    return $output;
}

说明

  • 这个方法会影响 bloginfo(‘name’) 或 get_bloginfo(‘name’) 的输出,适用于主题中直接调用网站名称的地方(如头部标题或导航)。
  • 如果你的主题或插件使用 bloginfo(‘name’),这个方法会动态替换输出的标题。

方法 3:结合多语言插件(如 WPML 或 Polylang)

如果你的网站使用多语言插件(如 WPML 或 Polylang),可以通过这些插件提供的 API 来设置不同语言的网站标题。以下以 WPML 为例:

使用 WPML

假设你已经通过 WPML 设置了多语言环境,并且 $lang 与 WPML 的语言代码一致。

add_filter('pre_get_document_title', 'wpml_custom_site_title', 10, 1);

function wpml_custom_site_title($title) {
    global $lang;

    $site_titles = array(
        'en' => 'My Website',
        'ja' => '私のウェブサイト',
        'de' => 'Meine Webseite',
    );

    // 使用 WPML 的当前语言(如果 $lang 未定义)
    $current_lang = function_exists('wpml_get_current_language') ? wpml_get_current_language() : $lang;

    // 返回当前语言的标题
    return isset($site_titles[$current_lang]) ? $site_titles[$current_lang] : $site_titles['en'];
}

说明

  • 如果你使用 WPML,语言代码会由 wpml_get_current_language() 提供,你可以直接使用它代替 $lang。
  • 对于 Polylang,可以使用 pll_current_language() 来获取当前语言代码。

方法 4:通过 wp_title 过滤器(旧版 WordPress)

如果你使用的是较老版本的 WordPress(4.4 之前),可以使用 wp_title 过滤器:

add_filter('wp_title', 'custom_wp_title_by_language', 10, 3);

function custom_wp_title_by_language($title, $sep, $seplocation) {
    global $lang;

    $site_titles = array(
        'en' => 'My Website',
        'ja' => '私のウェブサイト',
        'de' => 'Meine Webseite',
    );

    $custom_title = isset($site_titles[$lang]) ? $site_titles[$lang] : $site_titles['en'];

    return $custom_title . " $sep ";
}

说明

  • wp_title 过滤器在 WordPress 4.4 之后被 pre_get_document_title 取代,建议优先使用方法 1。
  • 如果你的主题仍然使用 wp_title(),可以采用此方法。

注意事项

  1. 确保 $lang 可访问:确认 $lang 变量在过滤器函数中是可用的。如果它是动态生成的(例如通过查询参数或多语言插件),可能需要通过其他方式(如 $_GET[‘lang’] 或插件 API)获取。
  2. SEO 考虑:动态标题对搜索引擎优化(SEO)很重要,确保标题准确反映页面内容,并与多语言插件(如 Yoast SEO)兼容。
  3. 默认标题:始终提供一个默认标题(如英文),以防止未定义语言代码时出现空标题。
  4. 测试多语言切换:在前端测试语言切换功能,确保标题正确显示为对应语言。

示例:结合查询参数

如果 $lang 是通过 URL 查询参数传递的(例如 ?lang=ja),可以这样获取:

add_filter('pre_get_document_title', 'custom_site_title_by_query', 10, 1);

function custom_site_title_by_query($title) {
    $lang = isset($_GET['lang']) ? sanitize_text_field($_GET['lang']) : 'en';

    $site_titles = array(
        'en' => 'My Website',
        'ja' => '私のウェブサイト',
        'de' => 'Meine Webseite',
    );

    return isset($site_titles[$lang]) ? $site_titles[$lang] : $site_titles['en'];
}

总结

  • 推荐使用 方法 1(pre_get_document_title),因为它直接、灵活且适用于现代 WordPress。
  • 如果使用多语言插件,结合插件的语言 API(如方法 3)会更高效。
  • 确保代码放在主题的 functions.php 或自定义插件中,并测试不同语言的标题显示是否正确。

评论留言

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