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