ユーザーに基づいて管理言語を変更する(単一サイト内)


9

ドイツのクライアントのいくつかのサイトにインストールする小さなプラグインを作成しようとしています。

私はドイツ語でWordPressを回避できますが、英語の方が簡単です。

これを管理するプラグイン(WPネイティブダッシュボード)があり、それは素晴らしいことですが、私が必要とするものに対しては重すぎます。クライアントはこれを必要としません。
無駄にエミュレートしようとしました...の代わりにスワッピングをチェックするデータベースオプションを保存します$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
カイザー2012年

@kaiser-いいえ、admin_initどちらでもありません-はい、設定され$current_userています。デバッグにはFirePHPを使用します...ありがとう!
ブラソフィロ

わかりました、値$current_user->dataが入力されているかどうかを尋ねました:)プラス:チェックなしで機能しますか?
カイザー2012年

@kaiser-質問のコードを変更しました$current_user- 確認しなくても機能します
brasofilo

@kaiser-うまくいった、どう思いますか?ありがとう!
ブラソフィロ2012年

回答:


8

さて、ようやくWPネイティブダッシュボードの基本コンセプトの中核に到達し、現在は機能しています。

ファイルには、として使用されているmu-plugin、と私はから名前を変更し、サイトで作業する必要がありますたびset-user-locale.phpaset-user-locale.php、その後再び、と。したがって、プラグインがクライアントの目の前にない状態でアクティブ化および非アクティブ化します。

[更新]
kaiserのヒントに従って、このプラグインは、クラスの開始時に定義されたユーザー(言語が変更されたものと同じもの)のプラグインリストにのみ表示されます。
プラグインは、通常のプラグインフォルダのルートにあります。

[更新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
カイザー2012年

1
@kaiser-素晴らしいインスピレーションですが、この他のフィルターの使用を終了しました...そしてコードを更新しました。これでスムーズで
ローリングする

1
これはひどくきちんとしています。それはWPMSでうまくいくのだろうか?これは多言語チームに最適です。ありがとう!
moraleida

1
@moraleida:はい、そうです!muプラグインとして、2人の特権管理者ユーザーでテストされました。
ブラソフィロ

1
驚くばかり!できれば2回賛成します。:)
moraleida '31年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.