Làm cách nào để tạo khả năng vai trò tùy chỉnh?


26

Tôi muốn tạo một khả năng tùy chỉnh để truy cập vào giao diện của plugin của tôi.

  • Plugin có nên quản lý thêm khả năng này cho tất cả các tài khoản quản trị viên khi kích hoạt không?
  • Nếu vậy: WordPress có quản lý việc thêm khả năng cho tất cả quản trị viên của blog phụ và siêu quản trị viên trong cài đặt nhiều trang hay chức năng đó cần được xử lý bởi plugin không?

Một blog chi tiết: goo.gl/xNuafH
Suresh Kamrushi

Câu trả lời:


11

Xóa những gì bạn thêm

Trước tiên, hãy đảm bảo rằng mọi thứ bạn thêm khi kích hoạt cũng sẽ bị xóa khi gỡ cài đặt . Tôi có một hướng dẫn ngắn bao gồm mã ví dụ cho bạn.

Kiểm tra với một plugin nhỏ:

Tôi thực sự không biết nhiều về MU, nhưng theo như tôi có thể nói, đối tượng vai trò là toàn cầu trên tất cả các blog. Chỉ cần thử plugin nhỏ này và xem những gì bạn có thể nhận được:

<?php
/*
Plugin Name:    MU Roles check
Plugin URI:     https://github.com/franz-josef-kaiser/
Description:    Check roles during viewing a blog
Author:     Franz Josef Kaiser
Author URI:     https://plus.google.com/u/0/107110219316412982437
Version:        0.1
Text Domain:    murc
License:        GPL v2 - http://www.gnu.org/licenses/old-licenses/gpl-2.0.html
*/

/**
 * Show the blog data and the role names in this blog
 * Also shows if the custom capability was successfully added, or displays n/a for the role
 * 
 * @return void
 */
function wpse35165_role_check()
{
    $blog = get_current_site();
    $custom_cap = 'name_of_your_custom_capability';

    $html = "<hr /><table>";
    $html .= "<caption>List roles in (Blog) {$blog->site_name} / ID#{$blog->id}</caption>"
    $html .= "<thead><tr><th>Role Name</th><th>Capabilties</th></tr></thead><tbody>";
    foreach ( $GLOBALS['wp_roles'] as $name => $role_obj )
    {
        $cap = in_array( $custom_cap, $role_obj->caps ) ? $custom_cap : 'n/a';
        $cap = $cap OR in_array( $custom_cap, $role_obj->allcaps ) ? $custom_cap : 'n/a';
        $html .= "<tr><td>{$name}</td><td>{$cap}</td></tr>";
    }
    $html .= '</tbody></table>';

    print $html;
}
add_action( 'shutdown', 'wpse35165_role_check' );

Thêm khả năng

/**
 * Add the capability to the role objects
 * Should be in your activation function and done before you inspect with your plugin
 * 
 * @return void
 */
function wpse35165_add_cap()
{
    $custom_cap = 'name_of_your_custom_capability';
    $min_cap    = 'the_minimum_required_built_in_cap'; // Check "Roles and objects table in codex!
    $grant      = true; 

    foreach ( $GLOBALS['wp_roles'] as $role_obj )
    {
        if ( 
            ! $role_obj->has_cap( $custom_cap ) 
            AND $role_obj->has_cap( $min_cap )
        )
            $role_obj->add_cap( $custom_cap, $grant );
    }
}

Lưu ý: Bạn có thể thêm khả năng cho vai trò mà không cấp quyền truy cập cho vai trò đó - chỉ cần đặt đối số thứ hai $grant = false;. Điều này cho phép người dùng đơn danh sách trắng chỉ cần thêm giới hạn bao gồm cả đối số cuối cùng là đúng.


17

Đối với một plugin tôi hiện đang làm việc, tôi muốn cấp / hạn chế quyền truy cập vào các cài đặt plugin (nghĩa là các trang menu theo quản trị viên) trên cơ sở mỗi vai trò .
Do đó, tôi đã phải thêm một plugin mới dành riêng capabilitychouser roles .

Thật không may, câu trả lời của kaiser dường như không còn hoạt động nữa, vì vậy tôi đã dành thời gian cố gắng tìm ra cách cho phép các chức năng được đề cập ở trên.


Thời khóa biểu

Trước khi tôi chia sẻ mã của mình với bạn, đây là tất cả những gì về nó, bằng văn bản thuần túy:

  1. Khi kích hoạt plugin, hãy thêm khả năng mới THE_NEW_CAPcho các vai trò có khả năng tích hợp nhất định BUILT_IN_CAP(trong trường hợp của tôi edit_pages:).
  2. Trên mỗi lần tải trang, làm 1. (nghĩa là thêm khả năng, một lần nữa). Điều này chỉ cần thiết nếu bạn muốn tính đến các vai trò mới có thể đã được tạo sau khi kích hoạt plugin. Do đó, các vai trò mới này không có khả năng dành riêng cho plugin, ngay cả khi chúng có khả năng tích hợp sẵn theo yêu cầu.
  3. Sử dụng khả năng mới cho bất cứ điều gì bạn muốn. Như đã giải thích trước đây, tôi sử dụng nó để cấp / hạn chế quyền truy cập vào các trang menu quản trị viên của plugin, vì vậy đó là cách nó được thực hiện trong ví dụ mã sau.
  4. Khi tắt plugin, loại bỏ khả năng. Tất nhiên, bạn cũng có thể làm điều này khi plugin đang được gỡ cài đặt. Dù bằng cách nào, hãy làm điều đó cuối cùng.

Mật mã

Và đây là danh sách trên được chuyển đổi thành mã:

»Thiết lập nó

class WPSE35165Plugin {

    public function __construct() {
        // Register hooks
        register_activation_hook(__FILE__, array(__CLASS__, 'activation'));
        register_deactivation_hook(__FILE__, array(__CLASS__, 'deactivation'));

        // Add actions
        add_action('admin_menu', array(__CLASS__, 'admin_menu'));
    }

    public function activation() {
        self::add_cap();
    }

    // Add the new capability to all roles having a certain built-in capability
    private static function add_cap() {
        $roles = get_editable_roles();
        foreach ($GLOBALS['wp_roles']->role_objects as $key => $role) {
            if (isset($roles[$key]) && $role->has_cap('BUILT_IN_CAP')) {
                $role->add_cap('THE_NEW_CAP');
            }
        }
    }

" Sử dụng nó

    // Add plugin menu pages to admin menu
    public function admin_menu() {
        // Remove the following line if you don't care about new roles
        // that have been created after plugin activation
        self::add_cap();

        // Set up the plugin admin menu
        add_menu_page('Menu', 'Menu', 'THE_NEW_CAP', …);
        add_submenu_page('wpse35165', 'Submenu', 'Submenu', 'THE_NEW_CAP', ...);
    }

»Dọn dẹp

    public function deactivation() {
        self::remove_cap();
    }

    // Remove the plugin-specific custom capability
    private static function remove_cap() {
        $roles = get_editable_roles();
        foreach ($GLOBALS['wp_roles']->role_objects as $key => $role) {
            if (isset($roles[$key]) && $role->has_cap('THE_NEW_CAP')) {
                $role->remove_cap('THE_NEW_CAP');
            }
        }
    }

}

Lưu ý: Vui lòng không sử dụng khả năng viết hoa. Điều này chỉ để đọc.


1
Luôn sử dụng get_editable_roles()để tìm nạp các vai trò bạn muốn chỉnh sửa. Bạn sẽ phá vỡ các plugin khác.
fuxia

1
@toscho Vâng, được rồi, tôi cho rằng đó là một trong những chức năng ngay cả những Codex không biết về ...;) Tất nhiên, chức năng này có quyền của mình để tồn tại, tuy nhiên, tôi không nhìn thấy bằng cách sử dụng WP_Roles mảng toàn cầu phá bất kỳ bổ trợ nào trong trường hợp của tôi.
tfrommen

2
Một số plugin tạo vai trò người dùng chuyên biệt và dựa trên bộ khả năng chính xác. Trong một số trường hợp, một khả năng loại trừ việc sử dụng một khả năng khác trong logic chương trình. Bạn không thể biết khi nào thì như vậy.
fuxia

0

Điều này làm việc cho tôi:

    add_action('admin_init', 'add_custom_cap');
    function add_custom_cap()
    {
        $custom_cap = 'test_cap';
        $min_cap    = 'read';
        $grant      = true;
        $to_role = 'your_user_role';
        $role = 'user_role';

        foreach ( $GLOBALS['wp_roles'] as $role_obj )
        {
            if (is_object($role_obj[$role])) {
                if (!$role_obj[$role]->has_cap( $custom_cap ) && $role_obj[$role]->has_cap( $min_cap )) {
                    $role_obj[$role]->add_cap( $custom_cap, $grant );
                }
            }
        }
    }

Đừng bao giờ thay đổi globals vai trò! Không bao giờ. Đừng! Bạn sẽ không kích hoạt bất kỳ hook và từ chối bộ lọc nào và làm cho mã của bạn trở thành mục tiêu di động. Sẽ không ai biết bạn đã đăng ký vai trò đó khi nào và ở đâu (bạn không, bạn chỉ nhét nó vào đó ở đâu đó, đôi khi, bằng cách nào đó). Xin vui lòng: Đừng bao giờ làm điều đó. Đặc biệt là không có vai trò.
kaiser
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.