私は1人の管理者、11人の編集者、そして4000人以上の著者がいるサイトを持っています。作者がメディアをサーバーに追加してすべてのストレージを使い果たすことを防ぐ必要があります。
最初に試した
function removemediabuttons()
{
if($user->wp_user_level >= 1) {
remove_action( 'media_buttons', 'media_buttons' );
global $menu;
unset($menu[10]);
}
}
add_action('admin_head','removemediabuttons');
これは管理者以外のためのAdd Mediaボタンを削除しますが、管理サイドバーメニューへのunset()アプローチは効果がなく、WordPressの知識がある作者なら誰でも単にメディアライブラリURLを入力して使用できると思います。
だから私は効果的にこの問題を排除しました
$wp_roles->remove_cap( 'author', 'upload_files' );
しかしこれは(正しく)作者ロールの WP User Avatar を使用するためのアクセス権を削除しました。厳密にはローカルベースです。
1つのモジュールだけにadd_cap()を使用することは可能ですか?
UPDATE 2015-12-211バグあたりの提案get_current_screen()
でプロファイルをチェックするようにコードを変更しました。これはプロファイルのUIを確実に有効にしますが、uploads.php UIがアップロードのために起動すると、それは再度チェックして拒否されます。この場合のチェックは/wp-admin/includes/ajax-actions.phpで行われているため、プラグイン自体がアップロードを行っているわけではありません(そして正しく行われています)。
global $wp_roles;
$wp_roles->remove_cap( 'author', 'upload_files' );
add_action( 'current_screen', 'allowAvatarUploads' );
function allowAvatarUploads() {
$currentScreen = get_current_screen();
global $wp_roles;
if( $currentScreen->id === "profile" ) {
$wp_roles->add_cap( 'author', 'upload_files' );
// keep their menu consistent
remove_menu_page('upload.php');
} else {
}
}
トピックに対する解決策を作成するためのアイデアに対するさまざまなヒント。
長い間、WPは常にロール名を使用します。レベルは使用しません。アクセストピックでのチェックには、常にロール名を使用してください。関数 current_user_can()
が役に立ちます。
メニュー項目を削除するには、unpではなくwpコア関数 remove_menu_page( $menu_slug );
を使用します。より安定してサポートされています。
フックadmin_head
は、メニューの変更を初期化したりcapを削除するのに最適なフックではありません。 capを削除するには、ロードスタックの早い段階でinit
フックなどを使用します。メニュー項目にはadmin_menu
を使います。
1つのモジュールだけにadd_cap()を使用することは可能ですか?
いいえ、機能はグローバルです。しかし、サイト、バックエンドの画面を確認し、この画面でのみ削除することができます(これが有用かつ可能な場合)。あなたがpackendのページをチェックするなら、関数 https://codex.wordpress.org/Function_Reference/get_current_screen を使ってください。ページに関する多くの情報を含む配列を取得し、これを使用して機能を設定します。
あなたのトピックでは、私はあなたがあなたの考えで能力upload_files
を削除するべきだと思います - $wp_roles->remove_cap( 'author', 'upload_files' );
。アバターまたはプロフィールページを確認して、この機能をユーザーに追加してください。