web-dev-qa-db-ja.com

ウィジェットのみを編集でき、他のテーマオプションは編集できない役割

どのようにして特定のロールにアクセスウィジェット管理メニュー(wp-admin/widgets.php)を作成することができますが、notaccess other テーマ管理 menu要素.

_ admin_menueventにバインドして変更することでAppearanceにリンクしてwidgets.phpメニューを表示することができます。グローバル変数$サブメニューwp-admin/widgets.php自体にこのコードがあるように、それは明らかにうまくいきませんが:

    if ( ! current_user_can('edit_theme_options') )
            wp_die( __( 'Cheatin’ uh?' ));

それは明らかです - あなたがedit_theme_options能力を明確に持っていない限り、あなたはこのページにアクセスすることを許されてはいけません。しかし、ウィジェット以外に、この機能の他の要素(現在のユーザー(役割)によって変更可能)が必要ない場合はどうすればいいですか?

メニューから他のオプションを「隠す」のは簡単です。しかし、それはWPがどのように動作するか(少なくともアドレス指定を理解する)を知っているユーザーに自由にアクセスできるようにし、私は明らかに避けたいのです。

事前に助けてくれてありがとう。

3
Justas Butkus

確認しています…

はい、現在(WP 3.4.1)管理メニューページのアクセス引数を変更する方法はありません。唯一のもの、あなたが公共のwp APIを通して修正できるのは"コメント"メニューアイテムです。他のすべては手動で登録されています。

しかし、 @scribu(tracチケットでもっと読む) から助けを得ることができます - /これまでのところ、コアにもっと役に立つものをもたらすために多くの努力をしてきました。

説明

コアをより深く見ると、~/wp-includes/functions.phpの中にwp_widgets_add_menu()という関数があります。 WP 2.2以降、これは基本的にサブメニュー項目を追加します。

function wp_widgets_add_menu() {
    global $submenu;
    $submenu['themes.php'][7] = array( __( 'Widgets' ), 'edit_theme_options', 'widgets.php' );
    ksort( $submenu['themes.php'], SORT_NUMERIC );
}

この関数はwp_maybe_load_widgets()関数によって_admin_menuアクションに追加されます。

メニュー項目とウィジェットページの中間回避策

現在、デフォルトのウィジェットをロードしてサブメニュー項目(すなわちwp_maybe_load_widgets)を登録する関数が、plugins_loadedフックの間に0の優先順位で呼び出されます。

それはそれを通常のプラグインで登録解除するのを難しくします。そのため、あなたはmu-pluginsフォルダの中でプラグインを使う必要があります。

<?php
/* Plugin Name: »Kaisers« Deny Widgets page access */
! defined( 'ABSPATH' ) AND exit;

// Init the plugin
add_action( 'muplugins_loaded', array( 'wpse6106_deny_widgets', 'init' ), 0 );

class wpse6106_deny_widgets
{
    static public $instance;

    public $required_cap = 'SET_CUSTOM_CAP_HERE';

    /**
     * Get the instance of the plugin
     * @since  2012-08-07.1505
     * @return void
     */
    static function init()
    {
        null === self :: $instance AND self :: $instance = new self;
        return self :: $instance;
    }

    /**
     * Setup
     * Removes the default function that registers the widgets.php sub menu item.
     * @since  2012-08-07.1505
     * @return void
     */
    function __construct()
    {
        // remove core function...
        remove_action( 'plugins_loaded', 'wp_maybe_load_widgets', 0 );

        // ...and add our own
        add_action( 'admin_head', array( $this, 'widgets_menu_access' ), 0 );

        // Then abort any attempt to access the widgets page
        add_action( 'load-widgets.php', array( $this, 'widgets_page_access' ), 0 );
    }

    /**
     * Adds an action, that re-registers the sub menu item with a custom capability.
     * @since  2012-08-07.1505
     * @return void
     */
    function widgets_menu_access()
    {
        global $submenu;

        // Call default widgets file
        require_once( ABSPATH . WPINC . '/default-widgets.php' );

        $submenu['themes.php'][7] = array( 
             __( 'Widgets' )
            ,$this->required_cap
            ,'widgets.php'
        );
        ksort( $submenu['themes.php'], SORT_NUMERIC );
    }

    /**
     * Does a second check if someone without the custom cap entered the widgets page and dies.
     * @since  2012-08-07.1505
     * @return void
     */
    function widgets_page_access()
    {
        get_currentuserinfo();
        global $current_user;

        if ( ! current_user_can( $this->required_cap ) )
            wp_die( __( 'Cheatin&#8217; uh?' ) );
    }
}

これをあなたのMU-Pluginsフォルダにドロップして、プラグイン内のSET_CUSTOM_CAP_HERE文字列(上のクラス変数)を調整するだけで準備完了です。ロールマネージャを使用していることを確認してください( Members のように、ウィジェットページにアクセスすることを意図されている人だけにこのロールを付与できます。または独自の/カスタムプラグインを使用して手動で追加します)。

また、ユーザーに機能の余地が残っていないことを確認してください。もしそれがnotworkingなら、allpluginsを無効にし、TwentyTen/Elevenに戻って "WordPress Reset"のようなプラグインであなたのローカルデータベースをリセットしてください。

実証済みの結果

enter image description here

注:プラグインはテストされており、普通のバニラインストールで動作します。


デフォルトのウィジェットとサブメニュー項目を無効にする

注:これは、それをすべて取り除きたいと思う、後の読者のためのものです。

すべてのデフォルトウィジェットを完全に削除したい場合は、呼び出すことができる単純なフィルタがあります。これは~/wp-includes/default-widgets.phpファイルを含めずにページの登録を無効にします。

add_filter( 'load_default_widgets', '__return_false' );
3
kaiser

概要

問題は、編集者の役割をウィジェットのみにアクセスするように制限することでしたが、次の例は、アクセスをメニューのみに制限する方法を示しています。しかし、これからわか​​るように、ウィジェットだけを許可するように簡単に変更することができます。

管理バーについて忘れたので、ステップ#3を追加しました。おっとっと!ダッシュボードにログインしているか、WP Webサイトにログインしているかにかかわらず、 'edit_theme_capablity'サブメニューの編集者が利用できるものを完全に制御できます。

Roles&Capabilities Pluginがインストールされていない場合は、これを実行できます。

(もしそうなら、#1を飛ばして#2に行き、そして#3に行く)

(1)これをあなたのテーマのfunctions.phpに追加してください

// Add all Editors the privilege to edit Themes, Widgets, Menus, Backgrounds

// get the the role object - editor, author, etc. (or those specially created)
$role_object = get_role( 'editor' );

// add $cap capability to this role object
// 'edit_theme_options' enables Dashboard APPEARANCE sub-menus
// for Themes, Widgets, Menus, and Backgrounds for users with that role
$role_object->add_cap( 'edit_theme_options' );


(2)これをadmin-footer.phpに追加します(wp-adminディレクトリにあります)。
これによって、編集者のダッシュボードに表示するオプションを選択できるようになります。
これを読む jQueryスニペットの作者からのより多くの情報のため。

<?php
  //  Using jQuery: How to allow Editors to edit only Menus (or more!)
  //  Placed in admin-footer.php as Dashboard comes from the wp-admin files

  if ( is_user_logged_in() ) { // This IF may be redundant, but safe is better than sorry...
    if ( current_user_can('edit_theme_options') && !current_user_can('manage_options') ) { // Check if non-Admin
?>
      <script>
    jQuery.noConflict();
    jQuery(document).ready(function() {
      //  Comment out the line you WANT to enable, so it displays (is NOT removed).
      //  For example, the jQuery line for MENUS is commented out below so it's not removed.

      // THEMES:  If you want to allow THEMES, also comment out APPEARANCE if you want it to display Themes when clicked. (Default behaviour)
      jQuery('li#menu-appearance.wp-has-submenu li a[href="themes.php"]').remove();
      jQuery('li#menu-appearance.wp-has-submenu a.wp-has-submenu').removeAttr("href");

      // WIDGETS:
      jQuery('li#menu-appearance.wp-has-submenu li a[href="widgets.php"]').remove();

      // MENUS:
      // jQuery('li#menu-appearance.wp-has-submenu li a[href="nav-menus.php"]').remove();

      // BACKGROUND:
      jQuery('li#menu-appearance.wp-has-submenu li a[href="themes.php?page=custom-background"]').remove();
    });
      </script>
<?php
    } // End IF current_user_can...
  } // End IF is_user_logged_in...
?>


(3)これをテーマのfooter.phpに追加してください:
これによって、編集者の管理バーに表示するオプションを選択できるようになります。

<?php
  //  Using jQuery: How to allow Editors to edit only Menus (or more!)
  //  Placed in THEME's footer.php as the Admin Bar is added when a user is logged in

  if ( is_user_logged_in() ) { // This IF may be redundant, but safe is better than sorry...
    if ( current_user_can('edit_theme_options') && !current_user_can('manage_options') ) { // Check if non-Admin
?>
      <script>
    jQuery.noConflict();
    jQuery(document).ready(function() {
      //  Comment out the line you WANT to enable, so it displays (is NOT removed).
      //  For example, the jQuery line for MENUS is commented out below so it's not removed.

      // THEMES:
      jQuery('li#wp-admin-bar-themes').remove();

      // CUSTOMIZE:
      jQuery('li#wp-admin-bar-customize').remove();

      // WIDGETS:
      jQuery('li#wp-admin-bar-widgets').remove();

      // MENUS:
      // jQuery('li#wp-admin-bar-menus').remove();

      // BACKGROUND:
      jQuery('li#wp-admin-bar-background').remove();
    });
      </script>
<?php
    } // End IF current_user_can...
  } // End IF is_user_logged_in...
?>
1
Chris Lemke

これを部分的に回避する方法を見つけました。

バインディングアクション

user_has_capアクションに遅延(優先度= 10)メソッドを追加します。バインドされたメソッドでは、アクセスされたページをチェックし(wp-admin/widgets.phpであることを確認します)、その場合、チェックされているパーミッションはedit_theme_options-その許可return $all_caps + array('edit_theme_options' => true);を付与します。

さらに、非常に遅い(優先度= 999)メソッドをadmin_menuアクションにバインドしました。そのメソッドは、現在のユーザーがウィジェットメニューのみにアクセスする独自の定義された機能を持っていることを考えると(意味がありません-user_can_customize_themes_widgets_only)可能ですグローバル外観に関連する配列セクション($ submenu ['themes.php'])および 'widgets.php'をパス要素として持たない要素を削除します(パスのインデックスは2)です。そして最後に、欠落した場合に備えてwidgets.phpを再追加します。

考慮事項

なぜ部分的だと言うのですか?

回避策だからです。ユーザーedit_theme_optionsの権利を許可します。たとえ短期間であっても、ユーザーがwidgets.phpにアクセスしていないことを確認した後でも他のページ。

また、グローバル変数$ submenuを変更しているため、いつでも変更される可能性があるため、将来のバージョンのWPでこれを使用することはできません。

それを考えると、ソリューションを実装するのは簡単ですが、決してニースではありません。

0
Justas Butkus