以下是一个基础版 WordPress 多国语言插件的实现方案,包含核心功能和技术要点:
一、创建插件基础结构
1. 创建插件目录:`wp-content/plugins/multilang-plugin`
2. 主文件 `multilang-plugin.php`:
<?php
/*
Plugin Name: Multilanguage Plugin
Description: 多语言支持插件
Version: 1.0
Author: Your Name
*/
// 安全限制
if (!defined('ABSPATH')) exit;
define('MLP_PATH', plugin_dir_path(__FILE__));
define('MLP_URL', plugin_dir_url(__FILE__));
// 初始化插件
require_once MLP_PATH . 'includes/class-core.php';
MLP_Core::init();
二、核心功能类(includes/class-core.php)
class MLP_Core {
private static $instance;
private $current_lang;
private $available_langs = ['en' => 'English', 'fr' => 'Français'];
public static function init() {
if (!isset(self::$instance)) {
self::$instance = new self();
}
return self::$instance;
}
public function __construct() {
// 初始化语言设置
add_action('init', [$this, 'setup_language']);
// 注册翻译内容类型
add_action('init', [$this, 'register_translation_post_type']);
// 重写规则
add_action('init', [$this, 'rewrite_rules']);
add_filter('query_vars', [$this, 'register_query_vars']);
// 模板重定向
add_filter('template_include', [$this, 'language_template']);
// 添加小工具
add_action('widgets_init', [$this, 'register_widget']);
}
public function setup_language() {
// 检测语言参数
if (isset($_GET['lang']) && array_key_exists($_GET['lang'], $this->available_langs)) {
$this->current_lang = $_GET['lang'];
setcookie('mlp_language', $this->current_lang, time() + YEAR_IN_SECONDS, COOKIEPATH, COOKIE_DOMAIN);
} elseif (isset($_COOKIE['mlp_language'])) {
$this->current_lang = $_COOKIE['mlp_language'];
} else {
$this->current_lang = $this->detect_browser_language();
}
}
private function detect_browser_language() {
$browser_lang = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
return array_key_exists($browser_lang, $this->available_langs) ? $browser_lang : 'en';
}
// 其他方法...
}
三、实现核心功能
1. URL 重写规则:
public function rewrite_rules() {
add_rewrite_rule(
'^([a-z]{2})/(.*)?',
'index.php?lang=$matches[1]&pagename=$matches[2]',
'top'
);
}
public function register_query_vars($vars) {
$vars[] = 'lang';
return $vars;
}
2. 语言模板系统
public function language_template($template) {
global $wp_query;
if ($wp_query->is_main_query() && $lang = get_query_var('lang')) {
$new_template = locate_template(["lang-{$lang}.php", $template]);
return $new_template ?: $template;
}
return $template;
}
3. 翻译关联系统:(使用元数据存储翻译关系)
class MLP_Translation {
public static function get_translation($post_id, $lang) {
return get_post_meta($post_id, "_mlp_translation_{$lang}", true);
}
public static function save_translation($original_id, $translated_id, $lang) {
update_post_meta($original_id, "_mlp_translation_{$lang}", $translated_id);
update_post_meta($translated_id, "_mlp_master_post", $original_id);
}
}
四、语言切换小工具(includes/class-widget.php)
class MLP_Language_Switcher extends WP_Widget {
public function __construct() {
parent::__construct(
'mlp_lang_switcher',
__('Language Switcher', 'mlp'),
['description' => __('Display language selection menu', 'mlp')]
);
}
public function widget($args, $instance) {
$current_url = home_url($_SERVER['REQUEST_URI']);
echo $args['before_widget'];
foreach (MLP_Core::get_available_languages() as $code => $name) {
$url = add_query_arg('lang', $code, $current_url);
echo "<a href='{$url}' class='lang-item {$code}'>{$name}</a>";
}
echo $args['after_widget'];
}
}
五、后台设置界面
1. 创建语言管理页面:
add_action('admin_menu', function() {
add_options_page(
__('Multilanguage Settings', 'mlp'),
__('Multilanguage', 'mlp'),
'manage_options',
'mlp-settings',
[$this, 'render_settings_page']
);
});
2. 实现语言配置表单:
public function render_settings_page() {
?>
<div class="wrap">
<h2><?php _e('Language Settings', 'mlp'); ?></h2>
<form method="post" action="options.php">
<?php settings_fields('mlp_settings_group'); ?>
<table class="form-table">
<tr valign="top">
<th scope="row"><?php _e('Available Languages', 'mlp'); ?></th>
<td>
<div id="mlp-languages-list">
<?php foreach ($this->available_langs as $code => $name) : ?>
<div class="lang-item">
<input type="text" name="mlp_languages[<?php echo $code; ?>]" value="<?php echo $name; ?>">
</div>
<?php endforeach; ?>
</div>
</td>
</tr>
</table>
<?php submit_button(); ?>
</form>
</div>
<?php
}
六、扩展建议
1. 添加以下高级功能:
– 自动机器翻译集成(Google Translate/Deepl API)
– 语言专属菜单系统
– 多语言SEO优化(hreflang标签)
– 翻译记忆库系统
– 前端语言编辑器
2. 性能优化:
// 使用对象缓存
wp_cache_set('mlp_translations', $translations);
$cached = wp_cache_get('mlp_translations');
// 数据库索引优化
add_filter('posts_join', function($join) {
if ($lang = MLP_Core::get_current_lang()) {
$join .= " INNER JOIN $wpdb->postmeta AS mlpmeta ON $wpdb->posts.ID = mlpmeta.post_id";
}
return $join;
});
七、使用示例
1. 在模板中获取翻译内容:
$translated_post_id = MLP_Translation::get_translation(get_the_ID(), 'fr');
if ($translated_post_id) {
$translated_post = get_post($translated_post_id);
echo apply_filters('the_content', $translated_post->post_content);
}
2.添加短代码支持:
add_shortcode('mlp_switcher', function($atts) {
ob_start();
MLP_Core::language_switcher();
return ob_get_clean();
});
这个基础版本实现了:
1. 多语言URL路由
2. 浏览器语言自动检测
3. Cookie记忆功能
4. 翻译内容关联
5. 前端语言切换器
6. 基本后台管理
建议后续完善:
1. 增加导入/导出功能
2. 添加翻译状态指示器
3. 实现字符串翻译(.po文件支持)
4. 创建翻译工作流程系统
5. 添加多语言SEO元字段支持
实际开发时需注意:
1. 处理分类和标签的翻译
2. 兼容各种主题模板
3. 处理分页和归档页面
4. 与缓存插件的兼容性
5. 实现WP CLI支持