web-dev-qa-db-ja.com

MultiSiteで管理機能を制限する

    update_core
    update_plugins
    update_themes
    install_plugins
    install_themes
    delete_themes
    edit_plugins
    edit_themes

こんにちは、私はこれらの機能をuser_id = 1に制限したいので、他のスーパー管理者はネットワークファイルを編集できません。 (ところで、足りない場合はお知らせください)。これの正しい方法は何ですか?試しました http://wordpress.org/extend/plugins/extended-super-admins/ しかし、すべてのブログに 'manage_esa_options'の上限が追加されたため、super_adminは管理バーにたくさんのブログを表示します。

4
Ünsal Korkmaz

スーパー管理者機能の編集は、他のすべてのロールの機能の編集とは少し異なります。これは、WPが現在のユーザーの機能をチェックする方法に若干の迂回があるためです。これが864行目のcapabilities.phpにあります。

function has_cap( $cap ) {

    // (...)

    // Multisite super admin has all caps by definition, Unless specifically denied.
    if ( is_multisite() && is_super_admin( $this->ID ) ) {
        if ( in_array('do_not_allow', $caps) )
            return false;
        return true;
    }

つまり、ブロックしたい機能を含む配列に 'do_not_allow'を明示的に追加する必要があります。事実上:

add_filter('map_meta_cap', 'not_so_super_admins', 10, 4);
function not_so_super_admins($caps, $cap, $user_id, $args){

    $super = array(
        'update_core',
        'update_plugins',
        'update_themes',
        'install_plugins',
        'install_themes',
        'delete_themes',
        'edit_plugins',
        'edit_themes'
    );

    if($user_id != 1 && in_array($cap, $super)) {
        $caps[] = 'do_not_allow';
    }

    return $caps;
}

私はこれをテストしました、そしてそれはあなたが防ぐことを望むそれらのことをすることから追加のスーパー管理者をブロックするようです、そしてそれはかなり静かにそうします(すなわちそれらをネットワークダッシュボードにリダイレクトします)。

記録に関しては、私の前の答えは、ほとんどの場合にうまくいくでしょう あなたが求めていたものを除いて 。謝罪いたします :)

add_action('init', 'not_so_super_admins');
function not_so_super_admins() {
    if(is_multisite() && $GLOBALS['blog_id'] == 1) {
        $role = get_role('administrator');
        $super = array(
           'update_core',
           'update_plugins',
           'update_themes',
           'install_plugins',
           'install_themes',
           'delete_themes',
           'edit_plugins',
           'edit_themes'
        );          
        if(get_current_user_id() != 1) {   
            foreach($super as $cap) {
                $role->remove_cap($cap);
            }
        }
        else {
            foreach($super as $cap) {
                $role->add_cap($cap);
            }           
        }
    }
}
7
Tomas Buteler