Alterar o idioma do administrador com base no usuário (em site único)

9

Estou tentando fazer um pequeno plugin para instalar em alguns sites de um cliente alemão.

Posso percorrer o WordPress em alemão, mas seria mais fácil se fosse em inglês.

Existe um plug-in que gerencia isso ( WP Native Dashboard ) e, embora o faça maravilhosamente, é muito pesado para o que eu preciso. O cliente não precisa disso, eu preciso.
Tentou emular sem sucesso ... Ele armazena uma opção de banco de dados para verificar a troca em vez de $current_user. Mas não entendi a lógica para que isso funcionasse.

Então, eu estou tentando adaptar essa solução dada pelo toscho , mas parece que não estou conseguindo entender os pontos corretos do processo do WordPress.

A questão é: que bit está faltando (ou estou mexendo) no código a seguir?

<?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
fonte
Tente admin_init. Em seguida, solte is_admin();e veja se $current_userrealmente contém um subobjeto chamado data.
Kaiser
@kaiser - não, admin_initnem - e sim, $current_useré preenchido, eu uso o FirePHP para depuração ... obrigado!
Brasofilo 25/05
Ok, perguntei se $current_user->dataestá preenchido :) Além disso: funciona sem os cheques?
Kaiser #
@kaiser - Eu já modificou o código em questão - Ele funciona se eu não verificar o $current_user- É muito engraçado porque a informação está lá ...
brasofilo
@ Kaiser - conseguiu funcionar, o que você acha? Obrigado!
Brasofilo

Respostas:

8

Ok, finalmente cheguei ao cerne do conceito básico do WP Native Dashboard e está funcionando agora.

O arquivo está sendo usado como um mu-plugine, sempre que eu tiver que trabalhar no site, o renomeio de set-user-locale.phpapara set-user-locale.phpe, em seguida, novamente. Assim, ativar e desativar sem que o plug-in esteja à vista do cliente.

[update]
Seguindo a dica do kaiser, este plugin só aparece na lista de plugins para o usuário definido ao iniciar a classe (a mesma para a qual o idioma foi alterado).
O plug-in agora está localizado na raiz da pasta regular de plug-ins.

[atualização 2]
Nova versão: trata apenas do núcleo da questão. Para a parte escondida, estou usando outra técnica . Como a versão 1.2, havia a falha de apenas ocultar automaticamente quando ativo.

<?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
fonte
O clique não de-/activateseria mais fácil? ;) Bem, vendo isso funcionar. +1
kaiser
11
@kaiser - agradável inspiração, mas acabou usando este outro filtro ... e atualizado o código, agora é liso e pronto para rolar; o)
brasofilo
11
Isso é realmente limpo. Gostaria de saber se funcionaria para o WPMS? Isso seria incrível para equipes multilíngues. Obrigado!
Moraleida 31/05
11
@moraleida: sim, tem! Apenas testado como um mu-plugin e com dois usuários superadministradores.
Brasofilo 31/05
11
Impressionante! Eu votaria isso duas vezes, se pudesse. :)
moraleida