Ubah bahasa admin berdasarkan pengguna (dalam satu situs)

9

Saya mencoba membuat plugin kecil untuk dipasang di beberapa situs klien Jerman.

Saya dapat menjelajahi WordPress dalam bahasa Jerman, tetapi akan lebih mudah jika menggunakan bahasa Inggris.

Ada sebuah plugin yang mengelola ini ( WP Native Dashboard ) dan meskipun melakukannya dengan luar biasa, itu terlalu berat untuk apa yang saya butuhkan. Klien tidak membutuhkan ini, saya perlu.
Mencoba meniru itu tidak berhasil ... Ini menyimpan opsi database untuk memeriksa swapping bukan $current_user. Tetapi saya tidak mendapatkan logika untuk ini bekerja.

Jadi, saya mencoba untuk mengadaptasi solusi yang diberikan oleh toscho ini , tetapi sepertinya saya tidak membuat kaitan dengan poin yang benar dari proses WordPress.

Pertanyaannya adalah: bit apa yang hilang (atau saya main-main) dalam kode berikut?

<?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
sumber
Coba admin_init. Kemudian jatuhkan is_admin();dan lihat apakah $current_userbenar-benar berisi sub objek bernama data.
kaiser
@iser - tidak, admin_inittidak - dan ya, $current_usersudah diisi, saya menggunakan FirePHP untuk debugging ... terima kasih!
brasofilo
Ok, saya bertanya apakah $current_user->datasudah terisi :) Plus: apakah berfungsi tanpa cek?
kaiser
@iser - Saya telah memodifikasi kode dalam pertanyaan - Ini berfungsi jika saya tidak memeriksa $current_user- Cukup lucu karena informasinya ada ...
brasofilo
@iser - membuatnya bekerja, bagaimana? Terima kasih!
brasofilo

Jawaban:

8

Ok, akhirnya sampai pada inti konsep dasar WP Native Dashboard dan itu berfungsi sekarang.

File sedang digunakan sebagai mu-plugin, dan setiap kali saya harus bekerja di situs saya ganti namanya dari set-user-locale.phpamenjadi set-user-locale.php, dan kemudian kembali lagi. Dengan demikian mengaktifkan dan menonaktifkan tanpa plugin yang ada di hadapan klien.

[update]
Mengikuti petunjuk kaiser, plugin ini hanya muncul di daftar plugins untuk pengguna yang ditentukan saat memulai kelas (yang sama untuk bahasa yang diubah).
Plugin sekarang terletak di root folder plugins reguler.

[pembaruan 2]
Versi baru: hanya membahas inti dari pertanyaan. Untuk bagian persembunyiannya saya menggunakan teknik lain . Sebagai versi 1.2 memiliki kelemahan hanya bersembunyi otomatis saat aktif.

<?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
sumber
Tidakkah hanya mengklik de-/activatelebih mudah? ;) Baik melihatnya bekerja. +1
kaiser
1
@kaiser - inspirasi yang bagus tetapi berakhir menggunakan filter lain ini ... dan memperbarui kodenya, sekarang lancar dan siap untuk bergulir; o)
brasofilo
1
Ini benar-benar rapi. Saya ingin tahu apakah ini akan berhasil untuk WPMS? Ini akan luar biasa untuk tim multibahasa. Terima kasih!
moraleida
1
@moraleida: ya, benar! Baru saja diuji sebagai plugin-mu dan dengan dua pengguna super-admin.
brasofilo
1
Luar biasa! Saya akan memilih ini dua kali jika saya bisa. :)
moraleida