WordPress多语言站点:单文章模板版本切换问题
解决方案
方案一:关联同成员的多语言文章(推荐,符合多语言站点逻辑)
这种方式给每个成员的不同语言版本文章添加关联标识,切换语言时跳转到对应语言的同成员文章,自动加载对应模板。
1. 添加关联字段
给team-member和team-member-pl两种自定义文章类型添加相同的自定义字段(比如member_unique_id),用来标记同一个成员的不同语言版本(比如Tom的英文和波兰语文章,这个字段的值都设为tom-baker)。
- 可以用ACF插件可视化添加,或者在主题
functions.php里手动注册:
function register_member_meta() { register_meta('post', 'member_unique_id', array( 'type' => 'string', 'single' => true, 'show_in_rest' => true, 'sanitize_callback' => 'sanitize_text_field', 'auth_callback' => function() { return current_user_can('edit_posts'); } )); } add_action('init', 'register_member_meta');
2. 编写获取对应语言文章的函数
在functions.php里添加函数,根据当前文章的类型和关联字段,找到对应语言的同成员文章:
function get_corresponding_member_post() { global $post; if (!is_singular(array('team-member', 'team-member-pl'))) return false; $current_post_type = get_post_type(); $member_id = get_post_meta($post->ID, 'member_unique_id', true); if (!$member_id) return false; // 确定目标文章类型 $target_post_type = ($current_post_type === 'team-member') ? 'team-member-pl' : 'team-member'; // 查询对应关联ID的目标文章 $query_args = array( 'post_type' => $target_post_type, 'meta_key' => 'member_unique_id', 'meta_value' => $member_id, 'posts_per_page' => 1, 'post_status' => 'publish', 'no_found_rows' => true // 优化查询,不需要分页计数 ); $target_query = new WP_Query($query_args); if ($target_query->have_posts()) { $target_post = $target_query->posts[0]; wp_reset_postdata(); return $target_post; } return false; }
3. 头部语言切换器实现
在头部模板(比如header.php)里添加切换链接:
<?php $target_member = get_corresponding_member_post(); $current_lang = (get_post_type() === 'team-member') ? 'English' : 'Polish'; $target_lang = ($current_lang === 'English') ? 'Polish' : 'English'; if ($target_member): $switch_url = get_permalink($target_member->ID); ?> <a href="<?php echo esc_url($switch_url); ?>" class="language-switcher"> 切换到<?php echo $target_lang; ?> </a> <?php else: ?> <!-- 没有对应语言的成员时,跳转到对应语言的团队列表页 --> $team_page_slug = (get_post_type() === 'team-member') ? 'our-team-pl' : 'our-team'; $team_page = get_page_by_path($team_page_slug); if ($team_page): $switch_url = get_permalink($team_page->ID); ?> <a href="<?php echo esc_url($switch_url); ?>" class="language-switcher"> 切换到<?php echo $target_lang; ?>团队列表 </a> <?php endif; ?> <?php endif; ?>
4. 模板自动加载
WordPress会根据文章类型自动匹配对应的单页模板:team-member类型的文章加载single-team-member.php,team-member-pl类型加载single-team-member-pl.php,无需额外配置。
方案二:仅切换模板(无需多语言内容,仅模板UI文本切换)
如果需求是保持当前文章内容不变,仅切换模板的语言UI(比如模板里的“职位”“简介”等静态文本换语言),可以用以下方式:
1. 修改模板加载规则
在functions.php里添加过滤器,根据URL参数切换模板:
function switch_member_template($template) { global $post; // 仅处理团队成员单页,且存在语言切换参数 if (is_singular(array('team-member', 'team-member-pl')) && isset($_GET['switch_lang'])) { $target_lang = sanitize_text_field($_GET['switch_lang']); if ($target_lang === 'pl') { $custom_template = locate_template('single-team-member-pl.php'); } else { $custom_template = locate_template('single-team-member.php'); } // 如果找到对应模板,就返回它 if ($custom_template) return $custom_template; } return $template; } add_filter('template_include', 'switch_member_template');
2. 头部切换链接实现
在header.php里生成带参数的切换链接:
<?php $current_type = get_post_type(); $target_lang = ($current_type === 'team-member') ? 'pl' : 'en'; $switch_text = ($current_type === 'team-member') ? 'Polish' : 'English'; $switch_url = add_query_arg('switch_lang', $target_lang, get_permalink()); ?> <a href="<?php echo esc_url($switch_url); ?>" class="language-switcher"> 切换到<?php echo $switch_text; ?> </a>
这种方式下,点击切换链接后,页面加载对应语言的模板,但内容还是当前文章的内容,适合模板静态文本多语言、动态内容无需翻译的场景。
内容的提问来源于stack exchange,提问作者Maryando
相关产品推荐
相关产品推荐

