2026年5月26日

2026年5月26日

WordPressで特定の投稿・カテゴリーを会員限定にする方法|プラグインとコード

WordPress で「この投稿だけ」「このカテゴリーの記事だけ」を会員に限定したいときは、会員を WordPress にログインできるユーザー として扱い、ログインしていない人には本文を見せないようにします。

この記事では、WordPress 標準の機能でできることとできないこと、Members プラグインで投稿ごとに制限する方法、カテゴリー単位で本文を隠すコードを順に説明します。コードは 2026年11月時点の WordPress 7.1 の検証環境で動作を確かめています。

会員がユーザー登録できるようにする

会員にアカウントを作ってもらう場合は、管理画面の「設定」→「一般」で次の2つを設定します。

  1. 「メンバーシップ」の「だれでもユーザー登録ができるようにする」にチェックを入れる
  2. 「新規ユーザーのデフォルト権限グループ」を「購読者」にする

これで wp-login.php?action=register から登録できるようになります。購読者は管理画面で自分のプロフィールを編集できるだけの権限なので、会員向けに使えます。管理者が会員を個別に追加する運用なら、登録は有効にせず「ユーザー」→「新規ユーザーを追加」で作成します。

登録フォームに項目を足したい、登録を承認制にしたいといった場合は、登録用のプラグインを使います(User Registration プラグインの設定方法)。

標準の「非公開」「パスワード保護」との違い

投稿の公開状態には「非公開」と「パスワード保護」がありますが、どちらも会員限定の用途には合いません。

方法 読める人 会員限定に使えるか
非公開 非公開の投稿を読む権限(read_private_posts)を持つユーザー。標準では編集者と管理者だけ 購読者は読めないので使えない
パスワード保護 投稿ごとに決めたパスワードを入力した人 全員に同じパスワードを配ることになり、会員ごとの管理ができない
ログインしているかで判定(この記事の方法) ログインしたユーザー(役割で絞ることもできる) 使える

カテゴリー単位で制限する機能は WordPress 本体にはありません。プラグインかコードで実現します。

方法1: Members プラグインで投稿ごとに制限する

Members(プラグインのスラッグ members)は、ユーザーの役割(権限グループ)を編集するプラグインで、投稿・固定ページごとに「この役割のユーザーだけが本文を読める」という制限を付けられます。2026年11月時点の版は 3.3.1 です。

設定の手順

  1. 「プラグイン」→「新規プラグインを追加」で「Members」を検索し、インストールして有効化します。
  2. 「Members」→「Settings」を開き、「Content Permissions」の「Enable Permissions」が有効になっていることを確認します(初期状態で有効)。
  3. 同じ画面の「Error Message」で、権限のない人に表示する文を設定します。初期値は「Sorry, but you do not have permission to view this content.」なので、日本語の案内に書き換えておきます。
  4. 会員限定にしたい投稿を開き、ブロックエディターのサイドバーの「Content Permissions (Members)」(クラシックエディターでは「Content Permissions」のボックス)で、読める役割にチェックを入れて更新します。ログインした会員全員に読ませるなら、「購読者」を含めてすべての役割にチェックを入れます。

チェックした役割のどれかを持っていれば本文を読めます。

Members で守られる範囲

プラグインの説明によると、制限されるのは本文・抜粋・コメントです。タイトル、メニュー、検索結果、カスタムフィールド、アップロードしたファイル(PDF や画像)は隠れません。また、制限した投稿は初期設定で REST API の一覧からも外れます(「Hide Protected Posts from WP REST API」)。

Members の Content Permissions は投稿ごとの設定で、カテゴリーを指定してまとめて制限する機能はありません。カテゴリー単位で制限したい場合は、次のコードを使うか、カテゴリー単位の制限ができる会員制プラグインを選びます(WordPressの会員制プラグインの比較)。

方法2: コードでカテゴリーごと本文を隠す

カテゴリー「会員限定」(スラッグ members-only)に入れた投稿の本文を、ログインしていない人には案内文に差し替えるコードです。

準備

  1. 「投稿」→「カテゴリー」で、スラッグを members-only にしたカテゴリーを作ります(名前は自由)。
  2. 会員限定にしたい投稿に、このカテゴリーを付けます。

コード

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で会員制サイトを作る方法)。

動作を確認する

  1. ブラウザのプライベートウィンドウ(ログインしていない状態)で会員限定の投稿を開き、案内文が表示されることを確認します。
  2. https://example.com/feed/ と https://example.com/wp-json/wp/v2/posts を開き、本文が出ていないことを確認します(example.com は自分のサイト)。
  3. 会員のアカウントでログインし、本文が表示されることを確認します。

まとめ

  • 会員は「ログインできるユーザー」として扱い、登録を受け付けるなら「設定」→「一般」で登録を有効にし、既定の権限グループを「購読者」にする。
  • 標準の「非公開」は編集者以上しか読めず、「パスワード保護」は会員ごとの管理ができない。
  • 投稿ごとに制限するなら Members の Content Permissions。本文・抜粋・コメントが守られ、タイトルやファイルは隠れない。
  • カテゴリー単位なら the_content と get_the_excerpt で本文と抜粋を差し替える。転送(template_redirect)だけではフィードと REST API が漏れる。

お気軽にご相談ください

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