如何通过页面slug触发WordPress主题翻译?
问题解答
一、能否实现根据页面slug/子页面触发翻译?
完全可以,你的现有代码问题大概率出在自定义函数get_id_by_slug、is_child_of、has_post_parent的实现逻辑上——WordPress核心没有这些函数,若实现有误就会导致页面判断失效。另外,locale过滤器的执行时机也可能影响is_page()这类条件判断的准确性(比如在WP初始化完成前执行,此时页面数据还未加载)。
修正后的完整代码
先补充缺失的自定义函数,再调整判断逻辑:
// 辅助函数:通过slug获取页面ID function get_id_by_slug($slug) { $page = get_page_by_path($slug); return $page ? $page->ID : 0; } // 辅助函数:判断当前页面是否是指定页面的子页面 function is_child_of($parent_id) { global $post; if (!$parent_id || !$post) return false; return in_array($parent_id, get_post_ancestors($post->ID)); } // 辅助函数:判断当前页面是否没有父页面 function has_post_parent() { global $post; return $post && $post->post_parent > 0; } // 修改locale的主函数 add_filter('locale', 'change_locale_slug', 10, 1); function change_locale_slug($locale){ // 确保在WP查询完成后再判断,避免is_page()失效 if (!did_action('wp')) { return $locale; } $es_page_id = get_id_by_slug('es'); $en_page_id = get_id_by_slug('en'); // 匹配/es/页面及其所有子页面 if (is_page('es') || ($es_page_id && is_child_of($es_page_id))) { return 'es_ES'; // 建议用完整locale编码,比如es_ES而非es,避免语言文件匹配问题 } // 匹配首页、/en/页面及其子页面、无父页面的独立页面 elseif (is_front_page() || is_page('en') || ($en_page_id && is_child_of($en_page_id)) || !has_post_parent()) { return 'en_US'; // 同理用完整编码 } return $locale; }
关键修复点:
- 补充
get_id_by_slug的正确实现,基于WordPress核心函数get_page_by_path获取页面ID - 修正
is_child_of逻辑,用get_post_ancestors检查当前页面的所有父级ID - 添加
did_action('wp')判断,确保在WP查询初始化完成后再执行页面判断,避免is_page()返回错误结果 - 建议使用完整的locale编码(如
es_ES、en_US),因为WordPress的语言文件通常用完整命名(比如es_ES.mo),避免加载不到对应翻译文件
二、URL参数触发翻译的原理
你最初的代码是通过WordPress的locale过滤器实现的:
- WordPress默认会根据站点设置的语言加载对应的locale值
locale过滤器允许开发者修改这个默认值- 当URL中存在
lang参数时,函数返回参数指定的locale(比如?lang=es返回es) - WordPress会根据这个修改后的locale,加载对应的语言文件(包括WP核心、主题、插件的翻译文件),从而实现全站内容的翻译切换
三、复现URL参数触发的行为
直接使用你最初的代码即可:
add_filter('locale', 'change_locale_param'); function change_locale_param($locale){ if(isset($_GET['lang'])){ return sanitize_text_field($_GET['lang']); } return $locale; }
使用方式:
- 在任意页面URL后添加
?lang=es,页面会加载西班牙语翻译 - 添加
?lang=en,加载英语翻译 - 注意:需要确保对应的语言文件已存在(可通过WP后台「设置-常规-站点语言」安装,或手动上传到
wp-content/languages目录)
内容的提问来源于stack exchange,提问作者Wildcat0927
相关产品推荐
相关产品推荐

