2026年5月26日
2026年5月26日
WordPressで特定の投稿・カテゴリーを会員限定にする方法|プラグインとコード
WordPress で「この投稿だけ」「このカテゴリーの記事だけ」を会員に限定したいときは、会員を WordPress にログインできるユーザー として扱い、ログインしていない人には本文を見せないようにします。
この記事では、WordPress 標準の機能でできることとできないこと、Members プラグインで投稿ごとに制限する方法、カテゴリー単位で本文を隠すコードを順に説明します。コードは 2026年11月時点の WordPress 7.1 の検証環境で動作を確かめています。
会員がユーザー登録できるようにする
会員にアカウントを作ってもらう場合は、管理画面の「設定」→「一般」で次の2つを設定します。
- 「メンバーシップ」の「だれでもユーザー登録ができるようにする」にチェックを入れる
- 「新規ユーザーのデフォルト権限グループ」を「購読者」にする
これで wp-login.php?action=register から登録できるようになります。購読者は管理画面で自分のプロフィールを編集できるだけの権限なので、会員向けに使えます。管理者が会員を個別に追加する運用なら、登録は有効にせず「ユーザー」→「新規ユーザーを追加」で作成します。
登録フォームに項目を足したい、登録を承認制にしたいといった場合は、登録用のプラグインを使います(User Registration プラグインの設定方法)。
標準の「非公開」「パスワード保護」との違い
投稿の公開状態には「非公開」と「パスワード保護」がありますが、どちらも会員限定の用途には合いません。
| 方法 | 読める人 | 会員限定に使えるか |
|---|---|---|
| 非公開 | 非公開の投稿を読む権限(read_private_posts)を持つユーザー。標準では編集者と管理者だけ |
購読者は読めないので使えない |
| パスワード保護 | 投稿ごとに決めたパスワードを入力した人 | 全員に同じパスワードを配ることになり、会員ごとの管理ができない |
| ログインしているかで判定(この記事の方法) | ログインしたユーザー(役割で絞ることもできる) | 使える |
カテゴリー単位で制限する機能は WordPress 本体にはありません。プラグインかコードで実現します。
方法1: Members プラグインで投稿ごとに制限する
Members(プラグインのスラッグ members)は、ユーザーの役割(権限グループ)を編集するプラグインで、投稿・固定ページごとに「この役割のユーザーだけが本文を読める」という制限を付けられます。2026年11月時点の版は 3.3.1 です。
設定の手順
- 「プラグイン」→「新規プラグインを追加」で「Members」を検索し、インストールして有効化します。
- 「Members」→「Settings」を開き、「Content Permissions」の「Enable Permissions」が有効になっていることを確認します(初期状態で有効)。
- 同じ画面の「Error Message」で、権限のない人に表示する文を設定します。初期値は「Sorry, but you do not have permission to view this content.」なので、日本語の案内に書き換えておきます。
- 会員限定にしたい投稿を開き、ブロックエディターのサイドバーの「Content Permissions (Members)」(クラシックエディターでは「Content Permissions」のボックス)で、読める役割にチェックを入れて更新します。ログインした会員全員に読ませるなら、「購読者」を含めてすべての役割にチェックを入れます。
チェックした役割のどれかを持っていれば本文を読めます。
Members で守られる範囲
プラグインの説明によると、制限されるのは本文・抜粋・コメントです。タイトル、メニュー、検索結果、カスタムフィールド、アップロードしたファイル(PDF や画像)は隠れません。また、制限した投稿は初期設定で REST API の一覧からも外れます(「Hide Protected Posts from WP REST API」)。
Members の Content Permissions は投稿ごとの設定で、カテゴリーを指定してまとめて制限する機能はありません。カテゴリー単位で制限したい場合は、次のコードを使うか、カテゴリー単位の制限ができる会員制プラグインを選びます(WordPressの会員制プラグインの比較)。
方法2: コードでカテゴリーごと本文を隠す
カテゴリー「会員限定」(スラッグ members-only)に入れた投稿の本文を、ログインしていない人には案内文に差し替えるコードです。
準備
- 「投稿」→「カテゴリー」で、スラッグを
members-onlyにしたカテゴリーを作ります(名前は自由)。 - 会員限定にしたい投稿に、このカテゴリーを付けます。
コード
wp-content/mu-plugins/members-only.php として保存します(mu-plugins フォルダーが無ければ作ります)。このフォルダーの PHP ファイルは自動で読み込まれ、テーマを変えても効き続けます。子テーマの functions.php に書く場合は、先頭の <?php を除いて貼り付けます。
<?php
/**
* Plugin Name: 会員限定カテゴリー
* Description: カテゴリー「members-only」の投稿を、ログインしていない人には本文を見せない。
*/
// 会員限定カテゴリーのスラッグ
const WPDR_MEMBERS_CATEGORY = 'members-only';
/**
* 投稿が会員限定カテゴリーに入っているか。
*/
function wpdr_is_members_only( $post = null ) {
$post = get_post( $post );
return $post && 'post' === $post->post_type && has_category( WPDR_MEMBERS_CATEGORY, $post );
}
/**
* ログインしていない人に見せる案内文。
*/
function wpdr_members_only_notice( $post = null ) {
$login_url = wp_login_url( get_permalink( $post ) );
return '<p>この記事は会員限定です。<a href="' . esc_url( $login_url ) . '">ログイン</a>すると続きを読めます。</p>';
}
// 本文を差し替える(投稿ページ・一覧・フィード・REST API の content.rendered に効く)
add_filter( 'the_content', function ( $content ) {
if ( is_user_logged_in() || ! wpdr_is_members_only() ) {
return $content;
}
return wpdr_members_only_notice();
}, 999 );
// 抜粋を差し替える(手書きの抜粋は the_content を通らないため)
add_filter( 'get_the_excerpt', function ( $excerpt, $post ) {
if ( is_user_logged_in() || ! wpdr_is_members_only( $post ) ) {
return $excerpt;
}
return 'この記事は会員限定です。';
}, 999, 2 );
// ログインしていない人からは、会員限定の投稿へのコメントを受け付けない
add_filter( 'comments_open', function ( $open, $post_id ) {
return ( ! is_user_logged_in() && wpdr_is_members_only( $post_id ) ) ? false : $open;
}, 10, 2 );
本文の差し替えに the_content フィルターを使っているのは、投稿ページだけでなく、RSS フィードや REST API(/wp-json/wp/v2/posts)の本文もこのフィルターを通るためです。検証環境では、ログインしていない状態で投稿ページ・フィード・REST API のどれを見ても本文が案内文に替わり、ログインすると元の本文が表示されることを確認しました。
会員限定のページをログイン画面へ転送する
本文を隠すだけでなく、ログインしていない人がカテゴリーの一覧や投稿ページを開いたらログイン画面へ送りたい場合は、次のコードを追加します。ログイン後は元のページに戻ります。
<?php
// 会員限定カテゴリーの一覧と投稿ページを、ログインしていない人はログイン画面へ転送する
add_action( 'template_redirect', function () {
if ( is_user_logged_in() ) {
return;
}
if ( is_category( 'members-only' ) ) {
$back = get_category_link( get_queried_object_id() );
} elseif ( is_singular( 'post' ) && has_category( 'members-only', get_queried_object_id() ) ) {
$back = get_permalink( get_queried_object_id() );
} else {
return;
}
wp_safe_redirect( wp_login_url( $back ) );
exit;
} );
template_redirect はテーマのページを表示するときだけ実行されるので、フィードと REST API には効きません。転送のコードだけにせず、上の本文を差し替えるコードと組み合わせて使います。
どちらの方法でも隠れないもの
- タイトル・アイキャッチ画像・カテゴリー一覧での表示: 投稿があること自体は分かります。タイトルに内容を書きすぎないようにします。
- アップロードしたファイル: メディアライブラリのファイルは URL を知っていれば誰でも開けます。会員限定の PDF などは、ファイルの配信を制限する別の仕組みが必要です。
- 既存のコメント(方法2): 上のコードは新しいコメントを受け付けないだけで、すでにあるコメントは REST API やコメントのフィードから読めます。会員限定の投稿ではコメントを使わない運用にします。
- キャッシュ: ページキャッシュを使っている場合、ログインした人の表示がキャッシュされると、ほかの人に本文が見えるおそれがあります。多くのキャッシュプラグインはログイン中のユーザーにキャッシュを使いませんが、設定を確認してください。
有料会員や会員ランクごとの出し分け、決済まで必要な場合は、会員制サイト向けのプラグインを検討します(WordPressで会員制サイトを作る方法)。
動作を確認する
- ブラウザのプライベートウィンドウ(ログインしていない状態)で会員限定の投稿を開き、案内文が表示されることを確認します。
https://example.com/feed/とhttps://example.com/wp-json/wp/v2/postsを開き、本文が出ていないことを確認します(example.comは自分のサイト)。- 会員のアカウントでログインし、本文が表示されることを確認します。
まとめ
- 会員は「ログインできるユーザー」として扱い、登録を受け付けるなら「設定」→「一般」で登録を有効にし、既定の権限グループを「購読者」にする。
- 標準の「非公開」は編集者以上しか読めず、「パスワード保護」は会員ごとの管理ができない。
- 投稿ごとに制限するなら Members の Content Permissions。本文・抜粋・コメントが守られ、タイトルやファイルは隠れない。
- カテゴリー単位なら
the_contentとget_the_excerptで本文と抜粋を差し替える。転送(template_redirect)だけではフィードと REST API が漏れる。