我们可以尝试过滤WPLANG
选项区域设置(see e.g. this approach from the related list here on the right 作者@brasofilo,这是基于this one 作者@toscho):
/**
* Override locale settings for the current (non-admin) user
*/
is_admin() && add_filter( \'locale\', function( $locale )
{
// Modify locale for non-admins (we don\'t want to override this on the settings pages)
if( ! current_user_can( \'manage_options\' ) )
{
// Get admin language for the current user
$lang = get_user_meta( get_current_user_id(), \'wpse_lang\', true );
// Use \'en_US\' as default
$locale = ! empty( $lang ) ? sanitize_text_field( $lang ) : \'en_US\';
}
return $locale;
} );
检查当前用户是否具有
wpse_lang
用户元键集,值如下
is_IS
,
da_DK
, ...
然后,我们可以在用户设置页面上为每个用户添加语言选择。
在那里我们可以使用wp_dropdown_languages()
函数,具有get_available_languages()
函数,显示可用语言的选择框。
这是一个example 通过@sanchothefat介绍如何添加自定义用户设置。
我们可以通过以下方式显示用户语言选择:
/**
* Display available language dropdown
*/
function wpse_user_language( $user )
{
// Only display for non-admins, but allow admins to edit for other users
if( current_user_can( \'manage_options\' ) && $user->ID == get_current_user_id() )
return;
// Get the current \'wp_lang\' settings
$lang = get_user_meta( $user->ID, \'wpse_lang\', true );
?>
<table class="form-table">
<tr id="wpse-lang-selection">
<th scope="row">
<label for="wpse_lang">
<?php _e( \'WPSE\' ); ?> - <?php _e( \'Site Language\' ); ?>
</label>
</th>
<td><?php wp_dropdown_languages(
[
\'id\' => \'wpse_lang\',
\'name\' => \'wpse_lang\',
\'languages\' => get_available_languages(),
\'translations\' => [],
\'selected\' => $lang,
\'show_available_translations\' => false,
]
);
?></td>
</tr>
</table>
<?php
}
add_action( \'show_user_profile\', \'wpse_user_language\' );
add_action( \'edit_user_profile\', \'wpse_user_language\' );
请注意,这里我们重复使用站点语言字符串,因为它是经过翻译的。
更新部分为:
/**
* Update the \'wp_lang\' user settings
*/
function wpse_user_language_save( $user_id )
{
if( current_user_can( \'edit_user\', $user_id ) && isset( $_POST[\'wpse_lang\'] ) )
return update_user_meta( $user_id, \'wpse_lang\', $_POST[\'wpse_lang\'] );
return false;
}
add_action( \'personal_options_update\', \'wpse_user_language_save\' );
add_action( \'edit_user_profile_update\', \'wpse_user_language_save\' );
以下是一个示例输出:
希望您可以根据自己的需要进行调整。将其封装在一个类中是一个好主意,在这个类中,我们可以使用自定义设置对其进行初始化,并重复使用以获得更好的性能。我们还可以考虑删除
is_admin()
检查以在前端也应用此功能,但我们可能需要额外的
is_user_logged_in()
检查