Zmień język administratora na podstawie użytkownika (w pojedynczej witrynie)

9

Próbuję zrobić małą wtyczkę do zainstalowania na niektórych stronach niemieckiego klienta.

Poradzę sobie z WordPress po niemiecku, ale byłoby łatwiej, gdyby był po angielsku.

Istnieje wtyczka, która zarządza tym ( WP Native Dashboard ) i chociaż robi to wspaniale, jest zbyt ciężka na to, czego potrzebuję. Klient tego nie potrzebuje.
Próbowałem emulować go bezskutecznie ... Przechowuje opcję bazy danych, aby sprawdzić zamianę zamiast $current_user. Ale nie zrozumiałem logiki, żeby to zadziałało.

Próbuję więc dostosować to rozwiązanie podane przez toscho , ale wygląda na to, że nie robię haków we właściwych punktach procesu WordPress.

Pytanie brzmi: czego brakuje (lub mam problemy) w poniższym kodzie?

<?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
źródło
Spróbować admin_init. Następnie upuść is_admin();i sprawdź, czy $current_usernaprawdę zawiera podrzędny obiekt o nazwie data.
kaiser
@kaiser - admin_initnie , nie - i tak, $current_userjest zapełniony, używam FirePHP do debugowania ... dzięki!
brasofilo
Ok, zapytałem, czy $current_user->datajest wypełnione :) Plus: czy to działa bez kontroli?
kaiser
@kaiser - Zmodyfikowałem kod w pytaniu - Działa, jeśli nie sprawdzam $current_user- To dość zabawne, ponieważ informacje są tam ...
brasofilo
@kaiser - działało, co myślisz? Dzięki!
brasofilo

Odpowiedzi:

8

Ok, w końcu dotarłem do sedna podstawowej koncepcji WP Native Dashboard i teraz działa.

Plik jest używany jako plik mu-plugini za każdym razem, gdy muszę pracować w witrynie, zmieniam jego nazwę z set-user-locale.phpana set-user-locale.php, a następnie ponownie. W ten sposób aktywacja i dezaktywacja bez wtyczki na widoku klienta.

[aktualizacja]
Zgodnie ze wskazówkami Kaiser, ta wtyczka pojawia się tylko na liście wtyczek dla użytkownika zdefiniowanego podczas inicjowania klasy (tej samej, dla której język został zmieniony).
Wtyczka znajduje się teraz w katalogu głównym zwykłego folderu wtyczek.

[aktualizacja 2]
Nowa wersja: dotyczy tylko sedna pytania. Do ukrycia używam innej techniki . Ponieważ wersja 1.2 miała wadę automatycznego ukrywania się, gdy była aktywna.

<?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
źródło
Czy kliknięcie nie de-/activatebyłoby łatwiejsze? ;) Dobrze widzieć, jak to działa. +1
kaiser
1
@kaiser - fajna inspiracja, ale przestałem używać tego innego filtra ... i zaktualizowałem kod, teraz jest płynny i gotowy do uruchomienia; o)
brasofilo
1
To jest naprawdę fajne. Zastanawiam się, czy to zadziała dla WPMS? To byłoby niesamowite dla wielojęzycznych zespołów. Dzięki!
moraleida
1
@moraleida: tak, robi! Właśnie przetestowany jako wtyczka mu z dwoma superużytkownikami.
brasofilo
1
Niesamowite! Głosowałbym za tym dwa razy, gdybym mógł. :)
moraleida