You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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表会膨胀,查询效率低于自定义表方案。

二、原文与译文映射逻辑

  1. 先在主题functions.php或者自定义插件里定义全局支持的语言列表,避免硬编码:
define('SUPPORTED_TRANSLATION_LANGS', [
    'en' => 'English',
    'fr' => 'French',
    'es' => 'Spanish',
    'de' => 'German'
]);
  1. 统一用户语言偏好获取优先级:
  • 优先取登录用户账户设置的首选语言
  • 未登录用户优先取URL参数(比如?lang=fr)或者Cookie存储的上次选择的语言
  • 兜底取浏览器Accept-Language请求头的首选项
  1. 映射规则:拿到原文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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 17:06:03