2026年5月20日
2026年5月20日
WordPressの投稿者が使える管理画面を制限する方法(メニュー・自分の投稿・メディア)
複数人で WordPress を運営していると、「投稿者には記事を書く画面だけ見せたい」「ほかの人の記事やメディアを一覧に出したくない」という場面があります。この記事では、投稿者(Author)と寄稿者(Contributor)が管理画面で見られる範囲を、コードで絞る方法を説明します。
最初に押さえておきたいのは、メニューを隠すことと、権限を取り上げることは別だという点です。メニューを消しても、その画面の URL を直接開けば表示できる場合があります。操作そのものを止めたいときは、後半の「権限そのものを外す」の方法を使います。
投稿者・寄稿者がもともとできること
WordPress の標準の権限グループ(ロール)では、投稿者と寄稿者の権限は次のとおりです(Roles and Capabilities による)。
| ロール | 主な権限 | できないこと |
|---|---|---|
| 投稿者 | 自分の投稿の作成・編集・公開・削除、メディアのアップロード | 他人の投稿の編集、固定ページ、設定、プラグイン、テーマ |
| 寄稿者 | 自分の投稿の作成・編集(下書きと承認待ちまで) | 公開、メディアのアップロード、他人の投稿の編集 |
他人の投稿の編集や、設定・プラグイン・テーマの画面は、もともと開けません。投稿者の管理画面に表示されるのは、ダッシュボード、投稿、メディア、コメント、プロフィール、ツールが中心です。この記事で扱うのは、その中で「見せる必要がないもの」を減らす作業です。
コードを置く場所
以下のコードは、テーマの functions.php ではなく、wp-content/mu-plugins/ に置く小さなプラグインにするのがおすすめです。テーマを変えても設定が外れず、管理画面から無効化もされません。
wp-content/mu-plugins/フォルダーが無ければ作る- その中に
author-restrict.phpを作り、先頭に<?phpを書いてから、以下の必要なコードを貼る - 保存すると、有効化の操作なしで読み込まれる
確認は、テスト用の投稿者アカウントでログインして行います。管理者のままでは、変化が見えません。
メニューを隠し、URL でも開けないようにする
投稿者と寄稿者に「ツール」と「コメント」を表示しない例です。編集者以上(他人の投稿を編集できる edit_others_posts を持つユーザー)はそのままにします。
<?php
/**
* Plugin Name: 投稿者の管理画面を整理する
*/
// 投稿者・寄稿者には「ツール」と「コメント」のメニューを表示しない
add_action( 'admin_menu', function () {
if ( current_user_can( 'edit_others_posts' ) ) {
return; // 編集者・管理者はそのまま
}
remove_menu_page( 'tools.php' ); // ツール
remove_menu_page( 'edit-comments.php' ); // コメント
}, 999 );
// メニューを隠した画面を URL で直接開いたときも表示しない
function kw_block_screen_for_authors() {
if ( ! current_user_can( 'edit_others_posts' ) ) {
wp_die( 'この画面を表示する権限がありません。', '', array( 'response' => 403 ) );
}
}
add_action( 'load-tools.php', 'kw_block_screen_for_authors' );
add_action( 'load-edit-comments.php', 'kw_block_screen_for_authors' );
remove_menu_page()に渡すのは、メニューの URL のファイル名(tools.phpなど)です。remove_menu_page()はメニューを消すだけです。/wp-admin/tools.phpを直接開くと表示されるため、load-{ファイル名}のフックで止めています。このフックは、管理画面の各画面を読み込む直前に呼ばれます。- 投稿者の「ユーザー」メニューは、
users.phpではなくprofile.php(プロフィール)です。プロフィールはパスワード変更に使うため、残しておきます。
投稿一覧とメディアを自分の物だけにする
投稿者は、他人の公開済みの記事を編集はできませんが、「投稿一覧」には表示されます。一覧とメディアライブラリを自分の物だけにする例です。
<?php
// 投稿一覧(edit.php)とメディアの一覧表示(upload.php)を自分の物だけにする
add_action( 'pre_get_posts', function ( $query ) {
if ( ! is_admin() || ! $query->is_main_query() ) {
return;
}
if ( current_user_can( 'edit_others_posts' ) ) {
return;
}
global $pagenow;
if ( in_array( $pagenow, array( 'edit.php', 'upload.php' ), true ) ) {
$query->set( 'author', get_current_user_id() );
}
} );
// メディアのグリッド表示と、投稿画面の「メディアを追加」も自分の物だけにする
add_filter( 'ajax_query_attachments_args', function ( $query ) {
if ( ! current_user_can( 'edit_others_posts' ) ) {
$query['author'] = get_current_user_id();
}
return $query;
} );
// 一覧の上の「すべて (12) | 公開済み (10)」の件数はサイト全体の数なので、表示しない
add_filter( 'views_edit-post', function ( $views ) {
if ( current_user_can( 'edit_others_posts' ) ) {
return $views;
}
return array();
} );
- メディアライブラリには、一覧表示(
upload.php?mode=list)とグリッド表示があり、グリッド表示や投稿画面のメディア選択は Ajax で読み込まれます。両方を絞るため、pre_get_postsとajax_query_attachments_argsの2つを使っています。 views_edit-postは「投稿」一覧の上に並ぶ状態別リンクを変えるフィルターです。件数は自分以外の投稿も数えるため、ここでは丸ごと消しています。- これらは表示を絞るだけです。他人の記事の URL を知っていれば、サイトの表側で公開済みの記事は読めます。
ダッシュボードのウィジェットを減らす
投稿者のダッシュボードから、使わないウィジェットを外す例です。
<?php
add_action( 'wp_dashboard_setup', function () {
if ( current_user_can( 'edit_others_posts' ) ) {
return;
}
remove_meta_box( 'dashboard_primary', 'dashboard', 'side' ); // WordPress イベントとニュース
remove_meta_box( 'dashboard_quick_press', 'dashboard', 'side' ); // クイックドラフト
remove_meta_box( 'dashboard_right_now', 'dashboard', 'normal' ); // 概要
remove_meta_box( 'dashboard_activity', 'dashboard', 'normal' ); // アクティビティ
} );
プラグインが追加したウィジェットの ID は、ブラウザーの開発者ツールでウィジェットの枠(<div id="...">)を見ると確認できます。
購読者を管理画面に入れない
会員サイトなどで、記事を書かない購読者(Subscriber)には管理画面を見せず、サイトの表側へ戻したい場合の例です。投稿者・寄稿者は記事を書くのに管理画面が必要なので、対象は edit_posts を持たないユーザーに限ります。
<?php
// 投稿を書けないユーザー(購読者など)は管理画面からトップページへ戻す
add_action( 'admin_init', function () {
if ( current_user_can( 'edit_posts' ) || wp_doing_ajax() ) {
return;
}
global $pagenow;
if ( 'admin-post.php' === $pagenow ) {
return; // フォームの送信先として使われるため止めない
}
wp_safe_redirect( home_url( '/' ) );
exit;
} );
// 同じユーザーには、サイトの表側の上部に出る管理バーも表示しない
add_filter( 'show_admin_bar', function ( $show ) {
return current_user_can( 'edit_posts' ) ? $show : false;
} );
admin_initは、admin-ajax.phpとadmin-post.phpでも実行されます。ここでリダイレクトすると、サイトの表側の Ajax 機能やフォーム送信が動かなくなるため、除外しています。- この設定では購読者がプロフィール画面も開けなくなります。パスワード変更は、ログイン画面の「パスワードをお忘れですか ?」から行う運用になります。
権限そのものを外す
メニューの非表示ではなく、操作そのものをできなくしたい場合は、ロールから権限(capability)を外します。WP-CLI が使える環境では次のように操作します。
# 投稿者が持っている権限を確認する
wp cap list author
# 投稿者からメディアのアップロード権限を外す
wp cap remove author upload_files
# 元に戻す
wp cap add author upload_files
- ロールの権限はデータベースに保存されるため、1回実行すれば残ります。コードのように毎回読み込む必要はありません。
publish_postsを外すと、投稿者は記事を公開できなくなり、「レビュー待ちとして送信」までになります(寄稿者と同じ扱い)。- 標準のロールを変える前に、
wp cap list authorの結果を控えておくと、元に戻すときに迷いません。
独自のロールを作る方法は「ユーザーロールと権限をカスタマイズする方法」、WP-CLI での操作は「WP-CLIで権限グループと権限(capability)を確認・追加・削除する方法」で説明しています。
注意点
current_user_can()には、ロール名(authorなど)ではなく権限名(edit_others_postsなど)を渡します。ロール名で判定すると、権限を調整したときに意図とずれます。- 管理画面を絞るプラグインやメンバー管理プラグインと併用すると、どちらの設定が効いているのかがわかりにくくなります。片方にまとめます。
- 設定を変えたら、投稿者・寄稿者・購読者それぞれのテスト用アカウントでログインし、記事の作成・画像の挿入・プロフィールの変更ができることを確認します。
まとめ
- 投稿者・寄稿者は、もともと他人の投稿の編集や設定画面にはアクセスできない
- メニューは
remove_menu_page()で隠し、URL で開かれないようload-{ファイル名}フックで止める - 投稿一覧とメディアは
pre_get_postsとajax_query_attachments_argsで自分の物だけにする - 購読者のリダイレクトは
admin_initで行い、admin-ajax.phpとadmin-post.phpは除外する - 操作そのものを止めたいときは、
wp cap removeでロールから権限を外す