사용자 정의 역할 기능을 작성하는 방법


26

플러그인 인터페이스에 액세스하기위한 사용자 지정 기능을 만들고 싶습니다.

  • 플러그인이 활성화 할 때이 기능을 모든 관리자 계정에 추가해야합니까?
  • 그렇다면 : WordPress는 멀티 사이트 설치에서 하위 블로그 및 최고 관리자의 모든 관리자에게 기능 추가를 관리합니까, 아니면 해당 기능을 플러그인에서 처리해야합니까?

세부 블로그 : goo.gl/xNuafH
Suresh Kamrushi

답변:


11

추가 한 내용 제거

먼저, 활성화시 추가 한 모든 항목 이 제거시 제거되어야 합니다. 예제 코드포함 된 간단한 자습서를 받았습니다 .

작은 플러그인으로 테스트하십시오.

나는 MU에 대해 많이 알지 못하지만 내가 알 수있는 한 역할 객체는 모든 블로그에서 전역 적입니다. 이 작은 플러그인을 사용 해보고 얻을 수있는 것을보십시오.

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

기능 추가

/**
 * 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 );
    }
}

참고 : 액세스 권한을 부여하지 않고 역할에 기능을 추가 할 수 있습니다 $grant = false;. 두 번째 인수 만 설정하면 됩니다. 이를 통해 단일 사용자를 화이트리스트에 추가하여 마지막 인수를 포함하여 한도를 간단히 추가 할 수 있습니다.


17

현재 작업중 인 플러그인의 경우 역할 기반 별로 플러그인 설정 (즉, 해당 관리자 메뉴 페이지)에 대한 액세스 권한을 부여 / 제한하고 싶었습니다 .
따라서에 새로운 플러그인 전용 capability을 추가 해야했습니다user roles .

불행히도 카이저의 대답 은 더 이상 작동하지 않는 것 같습니다. 따라서 위에서 언급 한 기능을 허용하는 방법을 알아 내려고 시간을 보냈습니다.


일정

코드를 여러분과 공유하기 전에 여기에 모든 내용이 일반 텍스트로 표시되어 있습니다.

  1. 플러그인 활성화시 THE_NEW_CAP특정 내장 기능 이있는 역할에 새 기능 을 추가하십시오 BUILT_IN_CAP(필자의 경우 :) edit_pages.
  2. 각 페이지로드시 1을 수행 하십시오 (즉, 기능을 다시 추가하십시오). 플러그인 활성화 후 생성 된 가능한 새 역할을 설명하려는 경우에만 필요합니다. 따라서 이러한 새로운 역할에는 필요한 내장 기능이 있어도 플러그인 별 기능이 없습니다.
  3. 원하는대로 새로운 기능을 사용하십시오. 앞에서 설명한대로 플러그인의 관리 메뉴 페이지에 대한 액세스 권한을 부여 / 제한하는 데 사용하므로 다음 코드 예제에서 수행됩니다.
  4. 플러그인 비활성화시 기능을 제거하십시오. 물론 플러그인을 제거 할 때이 작업을 수행 할 수도 있습니다. 어느 쪽이든, 결국하십시오.

코드

위 코드는 코드로 변환 된 것입니다.

»설정

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

»사용

    // 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', ...);
    }

»청소

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

}

참고 : 대문자 기능을 사용하지 마십시오. 이것은 가독성을위한 것입니다.


1
항상 get_editable_roles()편집하려는 역할을 가져 오려면 사용하십시오 . 당신은 것입니다 , 그렇지 않으면 플러그인을 휴식.
fuxia

1
@toscho 글쎄, 좋아, 내가 그조차 코덱스 약을 모르는 이들 기능 중 하나 ... 겠;) 물론,이 기능이 존재하는 권리를 가지고, 그러나, 나는 세계 WP_Roles 배열 사용하여 표시되지 않습니다 파괴를 내 경우에는 모든 플러그인 .
tfrommen

2
일부 플러그인은 특수한 사용자 역할을 생성하고 정확한 기능 세트에 의존합니다. 어떤 경우에는 하나의 기능이 프로그램 논리에서 다른 기능의 사용을 배제합니다. 언제 그런지 알 수 없습니다.
fuxia

0

이것은 나를 위해 작동합니다 :

    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 );
                }
            }
        }
    }

역할 의 글로벌 을 수정하지 마십시오 ! 못. 하지마! 후크를 트리거하지 않고 필터를 거부하지 않고 코드를 움직이는 대상으로 만듭니다. 언제, 어디서 그 역할을 등록했는지는 아무도 모릅니다 (어떻게하지 않더라도 어딘가에 어딘가에 그 역할을했을뿐입니다). 제발 : 절대 그렇게하지 마십시오. 특히 역할이 아닙니다.
카이저
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.