在WordPress中实现多语言选择时,使用POST方法是一种常见的表单提交方式。POST方法将表单数据作为HTTP请求的正文发送,而不是像GET方法那样附加在URL上。
<form method="post" action="">
<select name="language_selector">
<option value="en_US">English</option>
<option value="zh_CN">中文</option>
<option value="es_ES">Español</option>
</select>
<input type="submit" name="change_language" value="<?php _e('Change Language', 'text-domain'); ?>">
<?php wp_nonce_field('language_switch_action', 'language_switch_nonce'); ?>
</form>
add_action('init', 'handle_language_switch');
function handle_language_switch() {
if (isset($_POST['change_language']) && isset($_POST['language_selector'])) {
// 验证nonce
if (!isset($_POST['language_switch_nonce']) || !wp_verify_nonce($_POST['language_switch_nonce'], 'language_switch_action')) {
wp_die('Security check failed');
}
$selected_language = sanitize_text_field($_POST['language_selector']);
// 设置cookie或session
if (defined('ICL_LANGUAGE_CODE')) {
// WPML插件
do_action('wpml_switch_language', $selected_language);
} elseif (function_exists('pll_current_language')) {
// Polylang插件
PLL()->curlang = PLL()->model->get_language($selected_language);
}
// 设置cookie
setcookie('user_language', $selected_language, time() + (86400 * 30), COOKIEPATH, COOKIE_DOMAIN);
// 重定向到当前页面避免重复提交
wp_redirect(remove_query_arg('lang', $_SERVER['REQUEST_URI']));
exit;
}
}
原因:可能没有正确设置cookie或session 解决:确保在设置语言后正确存储用户选择,并检查多语言插件是否已正确安装和配置
原因:没有处理重定向
解决:在表单处理逻辑中添加wp_redirect()
并退出
原因:缺少nonce验证 解决:始终在表单中添加并验证nonce字段
这种方法可以与大多数WordPress多语言插件(如WPML、Polylang)兼容,也可以作为独立解决方案实现。