WordPress译文数据库存储及多语言文章映射调取方案咨询
WordPress多语言译文存储与调取实现方案
一、存储方案选型
方案1:自定义表存储(推荐,适合文章量大的场景)
沿用你建自定义表的思路,优化表结构和索引规则,适配WordPress生态的同时保证查询效率,表字段设计如下:
- 表名统一加WordPress前缀命名为
wp_translated_posts,避免和其他插件表冲突 - 核心字段配置:
id:自增主键original_post_id:原文文章的WordPress原生ID,对应你提到的id=7这类原文标识,单独加普通索引lang_code:译文语言编码,统一采用ISO 639-1标准(比如法语用fr、西班牙语用es),和original_post_id做联合唯一索引,避免同篇文章同语言重复存储翻译结果translated_title:译文标题translated_content:译文正文translated_meta:长文本字段,JSON格式存储译文的SEO标题、描述、自定义字段等额外信息update_time:时间戳,记录译文更新时间,方便后续译文迭代更新
方案2:原生Post Meta存储(适合小站点、文章量低于1万的场景)
不用新建数据库表,直接用WordPress原生的自定义字段存储译文,键名按规则命名即可,比如translated_{lang_code}_title、translated_{lang_code}_content,优点是不用写自定义SQL,直接用原生函数get_post_meta()、update_post_meta()就能读写,缺点是文章量和语言数多了之后post_meta表会膨胀,查询效率低于自定义表方案。
二、原文与译文映射逻辑
- 先在主题
functions.php或者自定义插件里定义全局支持的语言列表,避免硬编码:
define('SUPPORTED_TRANSLATION_LANGS', [ 'en' => 'English', 'fr' => 'French', 'es' => 'Spanish', 'de' => 'German' ]);
- 统一用户语言偏好获取优先级:
- 优先取登录用户账户设置的首选语言
- 未登录用户优先取URL参数(比如
?lang=fr)或者Cookie存储的上次选择的语言 - 兜底取浏览器
Accept-Language请求头的首选项
- 映射规则:拿到原文ID(
original_post_id)和当前用户语言编码(lang_code)两个参数即可唯一匹配到对应译文,匹配不到直接返回原文兜底。
三、译文调取与前端展示实现
直接用WordPress原生钩子拦截文章渲染逻辑,不用修改现有主题的文章模板代码,侵入性最低:
1. 拦截文章标题、正文输出
// 自定义函数:获取当前用户的语言编码 function get_user_current_lang() { // 优先级判断逻辑自行实现,返回对应lang_code即可,兜底返回en $default_lang = 'en'; if (isset($_COOKIE['user_selected_lang']) && in_array($_COOKIE['user_selected_lang'], array_keys(SUPPORTED_TRANSLATION_LANGS))) { return $_COOKIE['user_selected_lang']; } if (isset($_GET['lang']) && in_array($_GET['lang'], array_keys(SUPPORTED_TRANSLATION_LANGS))) { return $_GET['lang']; } return $default_lang; } // 拦截文章标题输出 add_filter('the_title', 'load_translated_title', 10, 2); function load_translated_title($title, $post_id) { // 后台、管理员访问直接返回原文 if (is_admin() || current_user_can('manage_options') || !is_singular('post')) return $title; $current_lang = get_user_current_lang(); if ($current_lang === 'en') return $title; // 自定义表查询译文 global $wpdb; $translated_title = $wpdb->get_var($wpdb->prepare( "SELECT translated_title FROM {$wpdb->prefix}translated_posts WHERE original_post_id = %d AND lang_code = %s", $post_id, $current_lang )); return $translated_title ?: $title; } // 拦截文章正文输出 add_filter('the_content', 'load_translated_content', 10); function load_translated_content($content) { global $post; if (is_admin() || current_user_can('manage_options') || !is_singular('post')) return $content; $current_lang = get_user_current_lang(); if ($current_lang === 'en') return $content; global $wpdb; $translated_content = $wpdb->get_var($wpdb->prepare( "SELECT translated_content FROM {$wpdb->prefix}translated_posts WHERE original_post_id = %d AND lang_code = %s", $post->ID, $current_lang )); return $translated_content ?: $content; }
2. 语言切换按钮实现
在文章页合适位置加切换按钮,点击后设置Cookie存储用户选择的语言,刷新页面自动加载对应译文:
function render_lang_switcher() { $current_lang = get_user_current_lang(); echo '<div class="lang-switcher">'; foreach (SUPPORTED_TRANSLATION_LANGS as $code => $name) { $active = $code === $current_lang ? ' class="active"' : ''; echo "<a href='?lang={$code}'{$active}>{$name}</a>"; } echo '</div>'; } // 选择语言后设置Cookie的逻辑可以用JS实现,也可以在PHP初始化阶段处理
3. 翻译结果写入逻辑
调用你的翻译API拿到结果后,用如下逻辑写入自定义表,自动去重,符合翻译结果仅生成一次的要求:
function save_translation_result($original_post_id, $lang_code, $translated_title, $translated_content) { global $wpdb; $wpdb->query($wpdb->prepare( "INSERT INTO {$wpdb->prefix}translated_posts (original_post_id, lang_code, translated_title, translated_content, update_time) VALUES (%d, %s, %s, %s, %d) ON DUPLICATE KEY UPDATE translated_title = %s, translated_content = %s, update_time = %d", $original_post_id, $lang_code, $translated_title, $translated_content, time(), $translated_title, $translated_content, time() )); }
内容的提问来源于stack exchange,提问作者ovicko
相关产品推荐
相关产品推荐

