Изменить язык администратора в зависимости от пользователя (на одном сайте)

9

Я пытаюсь сделать небольшой плагин для установки на некоторых сайтах немецкого клиента.

Я могу обойти WordPress на немецком языке, но было бы проще, если бы он был на английском.

Есть плагин, который управляет этим ( WP Native Dashboard ), и хотя он делает это чудесно, это слишком тяжелый вес для того, что мне нужно. Клиенту это не нужно, я делаю.
Попытка эмулировать это безрезультатно ... Вместо базы данных хранится опция базы данных, чтобы проверять обмен $current_user. Но я не получил логику, чтобы это сработало.

Итак, я пытаюсь адаптировать это решение, данное toscho , но похоже, что я не проверяю правильные точки процесса WordPress.

Вопрос в том, какой бит отсутствует (или я играю) в следующем коде?

<?php
/*
Plugin Name: Set User Locale
Plugin URI: https://wordpress.stackexchange.com/q/53326/12615
Description: changes the admin language according to user_login
Version: 1.0
Author: wordpress-stackexchange
*/

class Wpse53326_ChangeLocaleOnDemand
{

    public function __construct()
    {       
        add_action('admin_init', array(&$this, 'on_init'));
        add_filter( 'locale', array(&$this, 'on_change_language') );
    }

    public function on_init()
    {
    }

    public function on_change_language( $locale )
    {
        global $current_user;       

        // this prints the current user_login without problems 
        // global $firephp; 
        // $firephp->log($current_user->data->user_login,'user_login');

        //  the following works for backend/frontend
        // but if I try this conditional, it don't: if (is_admin() && 'the_user_login' == $current_user->data->user_login)
        if( is_admin() )
        {
            return 'en_US';         
        }
        return $locale;
    }
}

$wpse53326_ChangeLocaleOnDemand_instance = new Wpse53326_ChangeLocaleOnDemand();
brasofilo
источник
Попробуй admin_init. Затем перейдите is_admin();и посмотрите $current_user, действительно ли в нем содержится подобъект с именем data.
Кайзер
@kaiser - нет, admin_initнет - и да, $current_userон заполнен, я использую FirePHP для отладки ... спасибо!
brasofilo
Хорошо, я спросил, $current_user->dataзаполнен ли он :) Плюс: он работает без проверок?
Кайзер
@kaiser - Я изменил код в вопросе - Это работает, если я не проверяю $current_user- Это довольно забавно, потому что информация есть ...
brasofilo
@ Кайзер - все заработало, как ты думаешь? Спасибо!
brasofilo

Ответы:

8

Итак, наконец-то мы добрались до сути базовой концепции WP Native Dashboard, и теперь она работает.

Файл используется как mu-plugin, и всякий раз, когда мне нужно работать на сайте, я переименовываю его из set-user-locale.phpaв set-user-locale.php, а затем обратно. Таким образом, активация и деактивация без присутствия плагина на виду у клиента.

[обновление]
Следуя подсказке Кайзера, этот плагин отображается только в списке плагинов для пользователя, определенного при запуске класса (того же, для которого язык был изменен).
Плагин теперь находится в корне обычной папки плагинов.

[обновление 2]
Новая версия: касается только сути вопроса. Для сокрытия я использую другую технику . Так как версия 1.2 имела недостаток только автоматического скрытия при активации.

<?php
/*
Plugin Name: Admin interface in English for selected users
Plugin URI: https://wordpress.stackexchange.com/a/52436/12615
Description: Edit this file to add/remove users from the list
Version: 1.5
Author: Rodolfo Buaiz
*/

class Wpse53326_ChangeLocaleOnDemand
{

    public function __construct( $the_user )
    {       
        $this->user = $the_user;
        add_filter( 'locale', array( $this, 'on_change_language' ) );
   }

    public function on_change_language( $loc )
    {
        if ( !is_admin() )
         return $loc;

        if ( function_exists( 'wp_get_current_user' ) ) 
        {
            $u = wp_get_current_user();
            if ( !isset($u->user_locale) ) 
            {
                if ( in_array( $u->data->user_login, $this->user ) )
                    $u->user_locale = '';
                else
                    $u->user_locale = 'de_DE';
            }
            return $u->user_locale;
        }

        return $loc;
    }

}

new Wpse53326_ChangeLocaleOnDemand( array( 'user1', 'User2' ) );
brasofilo
источник
Разве просто щелкнуть не de-/activateбудет легче? ;) Прекрасно видеть, как это работает. +1
кайзер
1
@kaiser - хорошее вдохновение, но он прекратил использовать этот другой фильтр ... и обновил код, теперь он гладкий и готов к работе; o)
brasofilo
1
Это очень мило. Интересно, будет ли это работать для WPMS? Это было бы здорово для многоязычных команд. Спасибо!
Моралейда
1
@moraleida: да, это так! Только что протестирован как mu-плагин и с двумя супер-админами.
brasofilo
1
Потрясающие! Я бы проголосовал за это дважды, если бы мог. :)
Моралейда