カスタムロール機能を作成するにはどうすればよいですか?


26

プラグインのインターフェースにアクセスするためのカスタム機能を作成したい。

  • プラグインは、アクティベーション時にすべての管理者アカウントにこの機能を追加して管理する必要がありますか?
  • その場合:WordPressは、サブブログのすべての管理者とマルチサイトインストールのスーパー管理者に機能を追加することを管理していますか、またはその機能をプラグインで処理する必要がありますか?

詳細ブログ:goo.gl/xNuafH
Suresh Kamrushi

回答:


11

追加したものを削除する

まず、あなたはすべてのものことを確認して下さい活性化に追加しますが、また取得し、アンインストールで削除しますサンプルコード含む短いチュートリアルを入手しまし

小さなプラグインでテストします。

私は本当にMUについてあまり知りませんが、私が知る限り、rolesオブジェクトはすべてのブログでグローバルです。この小さなプラグインを試してみて、何が得られるか見てみましょう:

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

注:アクセスを許可せずにロールに機能を追加できます。2番目の引数を設定するだけ$grant = false;です。これにより、最後の引数を含むキャップをtrueとして追加するだけで、単一ユーザーをホワイトリストに登録できます。


17

現在作業中のプラグインの場合、役割ごとにプラグイン設定(つまり、対応する管理メニューページ)へのアクセスを許可/制限したかったのです。
したがって、新しいプラグイン固有capabilityuser 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さて、それはCodexが知らないこれらの関数の1つだと思います...;)もちろん、この関数には存在する権利がありますが、グローバルなWP_Roles配列を壊すことはありません私の場合のプラグイン
-tfrommen

2
一部のプラグインは、特殊なユーザーロールを作成し、機能の正確なセットに依存します。場合によっては、1つの機能がプログラムロジックで別の機能の使用を除外します。それがいつかはわかりません。
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.