【WordPress】管理者権限以外のユーザーは固定ページを編集できないようにする方法

WordPressのサイト運営において、特定のユーザーに固定ページの編集を制限したい場合があります。特に、誤って重要なページが編集されることを防ぎたい場合に有効です。この記事では、管理者権限以外のユーザーが固定ページを編集・新規作成できないようにする方法を紹介します。

この記事でわかること

  • 管理者以外の固定ページ編集を禁止するfunctions.phpコード(新規作成の見落としを修正済み)
  • REST API経由の編集も含めて確実にブロックするmap_meta_capを使った方法
  • プラグインを使って同様の制限を設定する方法
スポンサーリンク

コードを使った方法

WordPressのテーマのfunctions.phpファイルに以下のコードを追加することで、管理者以外のユーザーが固定ページの編集画面・新規作成画面にアクセスできないように設定できます。

functions.php:管理者以外の固定ページ編集・新規作成を制限
function restrict_page_editing_for_non_admins() {
    if ( current_user_can( 'administrator' ) ) {
        return;
    }

    global $pagenow;

    // 既存の固定ページを編集しようとした場合
    if ( 'post.php' === $pagenow && isset( $_GET['post'] ) ) {
        if ( 'page' === get_post_type( absint( $_GET['post'] ) ) ) {
            wp_safe_redirect( admin_url() );
            exit;
        }
    }

    // 新規に固定ページを作成しようとした場合
    if ( 'post-new.php' === $pagenow && isset( $_GET['post_type'] ) && 'page' === $_GET['post_type'] ) {
        wp_safe_redirect( admin_url() );
        exit;
    }
}
add_action( 'admin_init', 'restrict_page_editing_for_non_admins' );

このコードは、管理者権限を持たないユーザーが固定ページの編集画面・新規追加画面にアクセスしようとすると、ダッシュボードのトップページにリダイレクトします。

post-new.phpの判定を忘れると新規作成だけ素通りする
固定ページの新規追加画面(投稿 > 新規追加 ではなく 固定ページ > 新規追加)は post-new.php?post_type=page というURLで開き、既存ページ編集時のような $_GET['post'] は存在しません。post.php だけを判定対象にすると、既存ページの編集はブロックできても新規の固定ページ作成は制限をすり抜けてしまいますpost-new.phppost_type パラメータの両方を確認することが必要です。

より確実に制限する方法(map_meta_capを使う)

上記のadmin_init方式は、あくまで管理画面の編集画面が読み込まれるタイミングで判定するものです。そのため、ブロックエディターの自動保存やREST API経由での直接的な更新リクエストまでは防げません。権限のチェック自体に割り込みたい場合はmap_meta_capフィルターを使います。

functions.php:map_meta_capで固定ページの編集権限自体を制限
function restrict_page_capability( $caps, $cap, $user_id, $args ) {
    if ( ! in_array( $cap, array( 'edit_post', 'delete_post', 'publish_post' ), true ) || empty( $args[0] ) ) {
        return $caps;
    }

    $post = get_post( $args[0] );

    if ( ! $post || 'page' !== $post->post_type ) {
        return $caps;
    }

    if ( ! user_can( $user_id, 'administrator' ) ) {
        return array( 'do_not_allow' );
    }

    return $caps;
}
add_filter( 'map_meta_cap', 'restrict_page_capability', 10, 4 );
UIだけでなく権限判定そのものをブロックする
固定ページであっても、WordPressがmap_meta_capに渡す$capedit_postです(edit_pageという文字列ではありません)。この点を正しく判定に使うことで、管理画面のUIだけでなく、REST APIやブロックエディターの自動保存を含めて非管理者からの編集を確実に拒否できます。

プラグインを使用する方法

コードを直接編集するのが不安な場合は、プラグインを使用して同様の制限を設定することもできます。以下は、人気のある権限管理プラグインです。

User Role Editor
このプラグインを使用すると、ユーザーの権限を詳細にカスタマイズできます。管理者権限以外のユーザーに対して「固定ページを編集する」権限を取り除くことができます。

  1. プラグインをインストールし、有効化します。
  2. WordPressのダッシュボードから「ユーザー > User Role Editor」を開きます。
  3. 編集したいユーザーロールを選択し、「固定ページを編集」の権限をオフにします。

関連する権限制限の実装

よくある質問(FAQ)

Q管理者以外のユーザーが固定ページを編集できないようにする方法は?
Aadmin_initフックで編集画面・新規作成画面へのアクセスをリダイレクトする方法と、map_meta_capフィルターでedit_post判定に割り込みdo_not_allowを返す方法があります。前者は手軽ですが、後者の方がREST APIも含めて確実です。
Q固定ページの新規作成だけ制限をすり抜けてしまうのはなぜですか?
A新規作成画面はpost-new.php?post_type=pageというURLで開き、既存ページ編集時に使う$_GET['post']が存在しないためです。post-new.phppost_typeパラメータの両方を判定に含める必要があります。
Qmap_meta_capフィルターで固定ページを判定するとき、$capは何をチェックすればよいですか?
Aedit_pageではなくedit_postです。WordPressは固定ページの編集判定でもmap_meta_capedit_postというメタ権限を渡すため、$post->post_typepageかどうかで対象を絞り込んで判定します。
Qこの設定後、制限されたユーザーが固定ページ編集URLに直接アクセスするとどうなりますか?
Aadmin_init方式ではダッシュボードへリダイレクトされます。map_meta_cap方式では権限判定そのものが拒否されるため、「このページを編集する権限がありません」といったWordPress標準のエラー表示になり、管理画面のUIだけでなくREST API経由のアクセスも同様に拒否されます。

まとめ

  • 手軽に制限したいadmin_initフックで編集画面・新規作成画面をリダイレクト(post.phppost-new.phpの両方を判定)
  • 確実に制限したいmap_meta_capフィルターでedit_post判定に割り込み、非管理者にdo_not_allowを返す(REST API・ブロックエディター自動保存も防げる)
  • コードを書きたくない:User Role Editorなどのプラグインでロールの権限を直接編集する

運営しているサイトの要件に合わせて、最適な方法を選んで安全にページを管理しましょう。