web-dev-qa-db-ja.com

管理ページからメニュー項目を削除して機能を制限する

デフォルトで、私は人々が彼らに特定の行動を許す私のサイトへの貢献者として購読することを許可しています。

私がしたいのは、投稿、コメント、連絡先(ContactForm7)、およびツールを削除し、新しいイベントを追加するオプション(events plugin)だけを残すことです。

また、これらのボタンが非表示になっていても、方法がわかっていれば、人々はこれらのPostTypeに送信できないことを確認したいと思います。

私は現時点ではProfessional WordPressプラグイン開発の本を読んでいます。取り込むのはたくさんあるので、今のところ私のテーマの機能ページでこれを行いたいと思います。

これは私がコーデックスに従って試しているものです:

    add_action( 'admin_menu', 'jh_remove_menu_pages' );
    function jh_remove_menu_pages() {
        remove_menu_page('edit-comments.php');  
        remove_menu_page('tools.php');  
        remove_menu_page('edit.php');   
        remove_menu_page('wp-contact-form-7.php');  
    }

隠す必要があるすべてのphpファイルを見つけるためにこのページでfind を実行することに成功しました が、ContactForm7ファイルについてはよくわかりません。編集:管理メニューからContact Form 7を削除するためにここに解決策 を見つけることができました

しかしコーデックスによれば、上記のコードはスクリーン(投稿、ツールなど)に直接アクセスするためのパーミッションを削除せず、方法を知っていればまだ送信します: "ユーザーがこれらの画面に直接アクセスすることを防ぎます。メニューを削除しても、必要に応じてユーザーのアクセス許可をフィルタする必要がなくなるわけではありません。」

EventsとProfile以外のすべての機能を削除するにはどうすればいいですか?コーデックスのremove_capを読んでいますが、Posts機能を削除した場合に誤ってPost Eventsのスイッチをオフにしてしまう可能性があることを心配していますか?

最後に、その時点でログインしているユーザーの関連イベントのみを表示する方法を教えてください。

どうもありがとう。

1
SixfootJames

あなたの場合の最善の解決策はあなた自身のカスタマーロールを作成し、それらにあなたがユーザが必要とする能力だけを割り当てることです。ワードプレスに関しては、私があなたの質問から理解できるのはあなたがそれらに与えるべき唯一の可能性はreadです。

このようにして、彼らはプロフィールだけを見るでしょう。問題はプラグインから始まります。あなたが使用しているプラ​​グインがどれなのかわかりません(または私は理解できません)。

多くがプラグインのコーディング方法に依存することを考慮してください。あなたはコードの中で何かを見つけます

if ( currrent_user_can('edit_posts') ) { // do stuff

それがうまくいくためには、あなたの役割にedit_postsキャップを割り当てる必要があります。しかし、これは問題です。その機能を割り当てると、adminのPostメニューが表示されます。もちろんあなたはremove_menu_pageを使ってそれを削除することができます、しかしあなたが問題で言ったように、これは彼らがする方法を知っていればその管理画面への直接ユーザーアクセスを妨げません。

だから私はあなたに提案するものです:

  1. あなたのカスタムロールを作成し、readキャップだけを割り当てることから始めましょう
  2. プラグインのドキュメントを参照したり、機能を動作させるために必要な機能を理解するためのコードを調べてください。
  3. あなたの役割にこれらの必要な機能を追加してください。標準的な上限が必要な場合(そして標準的なメニューが表示される場合は、remove_menu_pageを使ってそれらを削除します。
  4. その場合、直接アクセスを防ぐために、カスタムロールを作成したという事実のおかげで、管理画面へのアクセスがload-{$page}アクションにフックするのを防ぎ、カスタムロールへのアクセスを防ぐことができます。
  5. バックエンドで、Settings -> Generalに行き、のような 'カスタムロール'を新しいユーザデフォルトロールにします

の仕方

1)ロールを作成する

$subscriber = get_role( 'subscriber');
$plugin_caps = array('edit_posts', 'cap_required_by_event_plugin');
$all_caps = array_merge($subscriber->capabilities, $plugin_caps);
add_role('custom_role', 'Custom Role', $all_caps );

2)プラグインに必要な機能を理解する

プラグインのドキュメントを見てください。 pluginsフォルダを複数ファイル検索し、'current_user_can''user_can''has_cap'のようなキーワードを検索します。もし問題がある場合は(もしあれば)プラグインサポートフォーラムで質問してみてください。開発者は頑張っています! ;)

3)あなたの役割に必要な機能を追加する

最も簡単な方法は、1)で定義した$plugin_caps配列に必要な上限を追加することです。

4)機能がカスタムロールに割り当てられている場合でも画面へのアクセスを禁止する

イベントプラグインを機能させるためにあなたのロールにedit_postsキャップを追加しなければならないと仮定します。まず最初にメニューを削除してください。

add_action( 'admin_menu', 'custom_remove_menu_pages' );

function custom_remove_menu_pages() {
  $user = wp_get_current_user();
  if ( in_array('custom_role', $user->roles) ) {
    remove_menu_page('edit-comments.php');  
    remove_menu_page('tools.php');  
    remove_menu_page('edit.php'); 
  }
}

その後アクセスを防止します。

add_action( 'load-edit.php', 'custom_prevent_admin_access' );
add_action( 'load-tools.php', 'custom_prevent_admin_access' );
add_action( 'load-post.php', 'custom_prevent_admin_access' );
add_action( 'load-post-new.php', 'custom_prevent_admin_access' );

function custom_prevent_admin_access() {
  $user = wp_get_current_user();
  if ( in_array('custom_role', $user->roles) ) {
    wp_die("Sorry, you can't stay here.");
    exit();
  }
}

5)「カスタムロール」を新規ユーザーデフォルトロールに設定します。

enter image description here


それがすべてです、それが役立つことを願っています。

3
gmazzap