Зміна мови адміністратора на основі користувача (в одному веб-сайті)


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();

Спробуйте admin_init. Потім відпустіть is_admin();і подивіться, чи $current_userдійсно містить суб'єкт з назвою data.
кайзер

@kaiser - admin_initні , ні - і так $current_user, я заповнений, я використовую FirePHP для налагодження ... дякую!
brasofilo

Гаразд, я запитав, чи $current_user->dataне заселено :) Плюс: чи працює це без чеків?
кайзер

@kaiser - Я змінив код у запитанні - Він працює, якщо я не перевіряю його $current_user- Це дуже смішно, оскільки інформація є ...
brasofilo

@kaiser - спрацював, як ти думаєш? Дякую!
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' ) );

Не було б просто натиснути de-/activateлегше? ;) Чудово бачити, як це працює. +1
кайзер

1
@kaiser - приємний натхнення, але закінчився використанням цього іншого фільтра ... та оновив код, тепер він гладкий і готовий до прокатки; o)
brasofilo

1
Це дуже акуратно. Цікаво, чи буде це працювати для WPMS? Це було б дивним для багатомовних колективів. Дякую!
moraleida

1
@moraleida: так, так і є! Просто перевірена як му-плагін і з двома користувачами супер-адміністратора.
brasofilo

1
Дивовижно! Я б схвалив це двічі, якби міг. :)
moraleida
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.