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

WordPress Multisite+WPML:子目录站点+顶级域名区分语言方案问询

实现WPML多站点下「顶级域名区分语言+子目录区分站点」的解决方案

问题概述

当前采用单域名单语言多站点架构:

  • domain1.com/site1
  • domain2.com/site2
  • ...
  • domain1.com/site50

期望调整为顶级域名区分语言、子目录区分站点的架构:

  • domain1.com/site1(英文)
  • domain2.com/site1(法文)
  • 以此类推对应其他语言和子站点

但WPML的「单语言对应单域名」配置选项明确提示不支持多站点,官方文档无解决方案,旧版域名重定向插件已废弃。

可行解决方案思路

1. 自定义重写规则+WPML钩子覆盖

通过自定义WordPress重写规则,结合WPML的核心钩子,强制实现域名与语言的绑定,同时保留子站点的目录结构。

核心代码示例

// 1. 添加自定义重写规则,将不同域名下的子站点请求映射到对应站点
add_filter('rewrite_rules_array', 'custom_lang_domain_rewrite_rules');
function custom_lang_domain_rewrite_rules($rules) {
    $new_rules = [];
    // 动态生成所有子站点的重写规则(假设子站点slug为site1、site2...site50)
    for ($i = 1; $i <= 50; $i++) {
        $site_slug = "site{$i}";
        // 匹配domain2.com/site1这类路径,指向对应子站点并设置语言参数
        $new_rules["^{$site_slug}/?(.*)$"] = "index.php?site={$site_slug}&lang=fr&$matches[1]";
    }
    // 将自定义规则优先于默认规则执行
    return array_merge($new_rules, $rules);
}

// 2. 覆盖WPML的当前语言检测逻辑,从域名判断语言
add_filter('wpml_current_language', 'custom_detect_lang_from_domain');
function custom_detect_lang_from_domain($default_lang) {
    $host = $_SERVER['HTTP_HOST'];
    $domain_lang_map = [
        'domain1.com' => 'en',
        'domain2.com' => 'fr',
        // 可添加更多语言域名映射
    ];
    return $domain_lang_map[$host] ?? $default_lang;
}

// 3. 覆盖WPML的翻译链接生成逻辑,生成对应域名下的子站点链接
add_filter('wpml_element_link', 'custom_generate_translation_link', 10, 4);
function custom_generate_translation_link($link, $element_id, $element_type, $target_lang) {
    $domain_lang_map = [
        'en' => 'domain1.com',
        'fr' => 'domain2.com',
    ];
    // 提取当前请求的子站点slug
    $current_path = parse_url(get_permalink($element_id), PHP_URL_PATH);
    preg_match('/^\/(site\d+)/', $current_path, $matches);
    $site_slug = $matches[1] ?? '';
    
    if (isset($domain_lang_map[$target_lang]) && $site_slug) {
        // 构建目标语言域名下的子站点链接
        $target_domain = $domain_lang_map[$target_lang];
        $target_path = str_replace("/{$site_slug}", "", parse_url($link, PHP_URL_PATH));
        return "https://{$target_domain}/{$site_slug}{$target_path}";
    }
    return $link;
}

潜在风险与注意事项

  • 重写规则冲突:添加规则后需在WordPress后台「设置-固定链接」页面点击「保存更改」刷新规则,同时测试是否与WPML默认规则、多站点原生规则冲突。
  • 缓存污染:若使用Redis、WP Rocket等缓存工具,需配置缓存键区分不同域名,避免不同语言内容互相覆盖。
  • WPML版本兼容:WPML的钩子可能随版本更新调整,需定期测试兼容性,若钩子失效需及时调整代码。
  • 后台访问逻辑:管理员访问不同域名的子站点后台时,需确保语言环境自动切换,可额外添加后台语言检测逻辑。

2. 多站点域名映射+WPML内容关联

利用WordPress多站点的原生域名映射功能,为每个子站点创建对应语言的「镜像站点」,再通过WPML关联内容:

  1. 为英文子站点site1创建法文镜像子站点site1-fr;
  2. 在多站点后台将site1-fr的域名映射为domain2.com/site1;
  3. 使用WPML的「内容关联」功能,将site1与site1-fr的文章、页面等内容一一绑定;
  4. 自定义语言切换器,实现不同域名下子站点的跳转。

优缺点

  • 优点:依赖WordPress和WPML的原生功能,稳定性更高,无需复杂的自定义代码。
  • 缺点:子站点数量翻倍(50个英文站点对应50个法文站点),站点维护、插件配置的工作量增加。

不推荐方案

搭建两个独立的多站点集群(一个英文、一个法文),虽然看似直接,但会导致内容同步、用户数据同步、插件配置同步等一系列问题,长期维护成本极高,非必要不建议采用。

内容的提问来源于stack exchange,提问作者Tom Auger

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 03:07:40