【WordPress】プラグインなしで特定ユーザーのみ投稿を編集可能にする方法

WordPressの標準機能だけを使い、特定のユーザー以外は投稿を編集できないように制御したい場合があります。たとえば「クライアントサイトで管理者アカウントだけ投稿を編集できるようにしたい」「特定チームメンバーのみ公開済みの投稿を修正できるようにしたい」などのケースです。今回は、プラグインを使わずに簡単に実現する方法をご紹介します。

なぜ特定ユーザーのみ編集権限を与えるのか?

更新時の誤操作を防ぐ
間違えて投稿を削除したり、タイトルを編集してしまったりといったトラブルを回避できます。

権限のきめ細かな設定を可能にする
WordPressのユーザー権限システムは柔軟ですが、オリジナルの要件に合わせて細かく調整しようとすると、プラグインを使うよりも自前のコードで制御する方が分かりやすい場合があります。

プラグイン導入のコストを省く
プラグインを増やすほど管理が複雑になり、パフォーマンス面でも影響が出る可能性があります。カスタマイズ内容が明確であれば自作コードで十分です。

user_has_cap フックで投稿編集を制限する

以下のコードをテーマの functions.php や独自プラグインに追加すると、ユーザーIDが 123 のユーザーのみ投稿を編集可能になります。

/**
 * 特定ユーザー(例としてユーザーIDが123)のみ投稿を編集可能にするサンプル
 */
function my_limit_editing_to_specific_user( $allcaps, $caps, $args ) {
    // $args[0]: 実行しようとしているケイパビリティ (例: 'edit_post')
    // $args[1]: ユーザーID
    // $args[2]: 対象となる投稿ID (edit_postなどの場合)

    // 投稿または固定ページを編集しようとしているかどうかチェック
    if ( in_array( $args[0], array( 'edit_post', 'edit_page' ), true ) ) {
        $user_id  = $args[1];
        $post_id  = $args[2];
        $the_post = get_post( $post_id );

        // 投稿が存在し、かつユーザーIDが 123 ではない場合
        if ( $the_post && ( $user_id !== 123 ) ) {
            // 投稿を編集するための権限を外す
            unset( $allcaps['edit_post'] );
            unset( $allcaps['edit_posts'] );
            unset( $allcaps['edit_others_posts'] );
        }
    }
    return $allcaps;
}
add_filter( 'user_has_cap', 'my_limit_editing_to_specific_user', 10, 3 );
  • $args[0] で実行しようとしているケイパビリティ(例:edit_post)をチェックします。
  • ユーザーID($args[1])が 123 以外であれば、投稿編集権限を外すようにしています。
  • edit_posts や edit_others_posts など、関連するケイパビリティもまとめて解除すると、より安全です。

ユーザーIDを調べる方法

WordPress管理画面
「ユーザー」一覧を開き、該当ユーザーをクリックすると、URLのクエリパラメータ user_id=数字 で確認できます。

テンプレートに出力
テーマの適切な箇所に echo get_current_user_id(); や var_dump( wp_get_current_user() ); を入れれば、IDが確認できます。

Show User IDなどのプラグイン
プラグインなしで行う方がシンプルですが、どうしても管理画面で手軽に確認したい場合は、ユーザーIDを表示するプラグインを導入する手もあります。

運用上の注意点

他のカスタマイズとの競合
user_has_cap フックは、他のプラグインやテーマで同じフックが使われている場合、上書きや競合が起きることがあります。テスト環境で動作確認を行いましょう。

複数のユーザーに権限を与えたい場合
$user_id !== 123 の条件を複数に拡張し、配列チェックなどを行えば、複数IDでも簡単に対応できます。

投稿タイプごとに制限したい場合
get_post_type( $post_id ) を使って投稿タイプをチェックすれば、投稿(post)と固定ページ(page)などを切り分けて制限可能です。

ロールベースの制御が必要な場合
「管理者権限のみ」や「編集者権限のみ」などロール単位で柔軟に権限を設定したい場合は、User Role Editorのような権限管理プラグインを使うほうが安全でわかりやすいことがあります。

まとめ

プラグインを使わずに特定のユーザーだけ投稿を編集可能にするには、user_has_cap や map_meta_cap といったフィルターフックを活用する方法が便利です。ちょっとしたカスタマイズで、細かい要件にも対応しやすくなります。

  • コードを追加するだけで済むため、プラグイン導入を最小限に抑えられる
  • 権限管理はWordPressの中核的な仕組みなので、テストや影響範囲の確認は入念に行う

複雑な運用が必要になったら、無理に自作コードで賄わず、権限管理プラグインを検討するのも良い選択肢です。要件やサイト規模に合わせて最適な方法を取り入れてみてください。