Thay đổi ngôn ngữ quản trị viên dựa trên người dùng (trong một trang web)


9

Tôi đang cố gắng tạo một plugin nhỏ để cài đặt trong một số trang web của một khách hàng Đức.

Tôi có thể thực hiện theo cách của mình xung quanh WordPress bằng tiếng Đức, nhưng sẽ dễ dàng hơn nếu nó bằng tiếng Anh.

Có một plugin quản lý cái này ( Bảng điều khiển riêng của WP ) và mặc dù nó rất tuyệt vời, nó quá nặng so với những gì tôi cần. Khách hàng không cần điều này, tôi làm.
Đã thử mô phỏng nó vô ích ... Nó lưu trữ một tùy chọn cơ sở dữ liệu để kiểm tra thay thế $current_user. Nhưng tôi đã không có được logic để làm việc này.

Vì vậy, tôi đang cố gắng điều chỉnh giải pháp này do toscho đưa ra , nhưng có vẻ như tôi không tạo ra các móc nối trong các điểm chính xác của quy trình WordPress.

Câu hỏi là: bit nào bị thiếu (hoặc tôi đang làm rối) trong đoạn mã sau?

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

Hãy thử admin_init. Sau đó thả is_admin();và xem nếu $current_userthực sự có chứa một đối tượng phụ có tên data.
kaiser

@kaiser - Không, admin_initkhông - và vâng, $current_userđược điền, tôi sử dụng FirePHP để gỡ lỗi ... cảm ơn!
brasofilo

Ok, tôi đã hỏi nếu $current_user->datacó dân cư :) Plus: nó có hoạt động với các kiểm tra không?
kaiser

@kaiser - Tôi đã sửa đổi mã trong câu hỏi - Nó hoạt động nếu tôi không kiểm tra $current_user- Thật buồn cười vì thông tin ở đó ...
brasofilo

@kaiser - Làm cho nó hoạt động, bạn nghĩ gì? Cảm ơn!
brasofilo

Câu trả lời:


8

Ok, cuối cùng đã đến cốt lõi của khái niệm cơ bản Bảng điều khiển WP và nó đang hoạt động.

Các tập tin đang được sử dụng như một mu-plugin, và bất cứ khi nào tôi phải làm việc trong trang web, tôi đổi tên nó từ set-user-locale.phpathành set-user-locale.php, và sau đó quay lại. Do đó, kích hoạt và hủy kích hoạt mà không cần plugin nằm trong tầm nhìn của khách hàng.

[cập nhật]
Theo gợi ý của kaiser, plugin này chỉ hiển thị trong danh sách bổ trợ cho người dùng được xác định khi bắt đầu lớp (cùng loại với ngôn ngữ được thay đổi).
Các plugin hiện nằm ở thư mục gốc của thư mục plugin thông thường.

[cập nhật 2]
Phiên bản mới: chỉ đề cập đến cốt lõi của câu hỏi. Đối với phần ẩn tôi đang sử dụng một kỹ thuật khác . Vì phiên bản 1.2 có lỗi chỉ tự động ẩn khi hoạt động.

<?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' ) );

Sẽ không chỉ là nhấp chuột de-/activatedễ dàng hơn? ;) Fine thấy nó hoạt động. +1
kaiser

1
@kaiser - nguồn cảm hứng tốt đẹp nhưng đã kết thúc bằng cách sử dụng bộ lọc khác này ... và đã cập nhật mã, giờ đây nó đã hoạt động trơn tru và sẵn sàng hoạt động; o)
brasofilo

1
Đây là gọn gàng thực sự. Tôi tự hỏi nếu nó sẽ làm việc cho WPMS? Điều này sẽ là tuyệt vời cho các đội đa ngôn ngữ. Cảm ơn!
moraleida

1
@moraleida: đúng vậy Chỉ cần thử nghiệm dưới dạng mu-plugin và với hai người dùng siêu quản trị viên.
brasofilo

1
Tuyệt vời! Tôi sẽ nâng cấp điều này hai lần nếu tôi có thể. :)
moraleida
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.