2026年5月20日

2026年5月20日

WordPressの投稿者が使える管理画面を制限する方法(メニュー・自分の投稿・メディア)

複数人で WordPress を運営していると、「投稿者には記事を書く画面だけ見せたい」「ほかの人の記事やメディアを一覧に出したくない」という場面があります。この記事では、投稿者(Author)と寄稿者(Contributor)が管理画面で見られる範囲を、コードで絞る方法を説明します。

最初に押さえておきたいのは、メニューを隠すことと、権限を取り上げることは別だという点です。メニューを消しても、その画面の URL を直接開けば表示できる場合があります。操作そのものを止めたいときは、後半の「権限そのものを外す」の方法を使います。

投稿者・寄稿者がもともとできること

WordPress の標準の権限グループ(ロール)では、投稿者と寄稿者の権限は次のとおりです(Roles and Capabilities による)。

ロール 主な権限 できないこと
投稿者 自分の投稿の作成・編集・公開・削除、メディアのアップロード 他人の投稿の編集、固定ページ、設定、プラグイン、テーマ
寄稿者 自分の投稿の作成・編集(下書きと承認待ちまで) 公開、メディアのアップロード、他人の投稿の編集

他人の投稿の編集や、設定・プラグイン・テーマの画面は、もともと開けません。投稿者の管理画面に表示されるのは、ダッシュボード、投稿、メディア、コメント、プロフィール、ツールが中心です。この記事で扱うのは、その中で「見せる必要がないもの」を減らす作業です。

コードを置く場所

以下のコードは、テーマの functions.php ではなく、wp-content/mu-plugins/ に置く小さなプラグインにするのがおすすめです。テーマを変えても設定が外れず、管理画面から無効化もされません。

  1. wp-content/mu-plugins/ フォルダーが無ければ作る
  2. その中に author-restrict.php を作り、先頭に <?php を書いてから、以下の必要なコードを貼る
  3. 保存すると、有効化の操作なしで読み込まれる

確認は、テスト用の投稿者アカウントでログインして行います。管理者のままでは、変化が見えません。

メニューを隠し、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 でロールから権限を外す

お気軽にご相談ください

お見積りへ お問い合わせへ
▲