2026年8月9日

2026年8月9日

WordPressでログイン中だけコンテンツを表示する方法|ショートコード・ブロック・ページ単位

WordPress で「この部分は会員だけに見せたい」「このページはログインしないと読めないようにしたい」というときは、PHP で is_user_logged_in()(ログイン中なら true を返す関数)を確かめ、表示する内容を切り替えます。この記事では、記事の一部・ブロック単位・ページ全体の3つの範囲ごとに、子テーマの functions.php かコードスニペット用プラグインに書くコードを紹介します(2026年10月時点の WordPress 6.9 で確認した関数を使います)。

先に知っておきたいこと

  • WordPress 標準の「非公開」は「ログインユーザー全員に見せる」設定ではありません。 投稿の公開状態を「非公開」にすると、見られるのはその投稿を読む権限(read_private_posts など)を持つ編集者・管理者と投稿者本人だけです。購読者として登録した会員には表示されません。
  • 「パスワード保護」はログインとは別の仕組みです。 投稿ごとに決めたパスワードを知っている人なら、ログインしていなくても読めます。
  • CSS で隠すだけでは内容は守れません。 HTML には内容が含まれたままなので、ページのソースを表示すれば読めます。見せたくない内容は、PHP の段階で出力しないようにします。

方法1: 記事の一部をショートコードで切り替える

本文の中の一部だけをログイン中のユーザーに見せる方法です。囲み型のショートコードを1つ作り、ログインしていない人にはログインへの案内を出します。

<?php
/**
 * 囲んだ内容をログイン中のユーザーにだけ表示するショートコード。
 * capability を指定すると、その権限を持つユーザーだけに表示する。
 */
add_shortcode( 'members_only', 'mysite_members_only_shortcode' );

function mysite_members_only_shortcode( $atts, $content = null ) {
	$atts = shortcode_atts(
		array(
			'capability' => '',
		),
		$atts,
		'members_only'
	);

	if ( ! is_user_logged_in() ) {
		$login_url = wp_login_url( get_permalink() );
		return '<p class="members-only-notice">この内容はログインすると表示されます。<a href="' . esc_url( $login_url ) . '">ログインする</a></p>';
	}

	if ( '' !== $atts['capability'] && ! current_user_can( $atts['capability'] ) ) {
		return '';
	}

	return do_shortcode( (string) $content );
}

本文では、見せたい部分を次のように囲みます。ブロックエディターでは「ショートコード」ブロックか段落の中に書きます。

[members_only]
ここに会員向けの内容を書きます。
[/members_only]

[members_only capability="edit_posts"]
ここは投稿を編集できるユーザー(寄稿者以上)にだけ表示されます。
[/members_only]
  • wp_login_url( get_permalink() ) は、ログインした後にこのページへ戻ってくるログイン画面の URL を返します。
  • do_shortcode() を通しているため、囲んだ中に別のショートコードを書いても動きます。
  • 権限名(edit_posts、manage_options など)は、ユーザー権限グループごとに決まっています。会員だけのグループを作りたい場合は、権限グループとプラグインの記事も参考にしてください。

ショートコードは、RSS フィードや REST API で本文を返すときも実行されます。そのときはログインしていない扱いになるため、会員向けの内容はフィードにも出ません。

方法2: ブロックごとに切り替える

ブロックエディターで作った本文の中で、特定のブロックだけをログイン中のユーザーに見せたい場合は、ブロックに目印の CSS クラスを付け、render_block フィルター(ブロックを HTML にするときに通るフィルター)で出力を止めます。

<?php
/**
 * 追加 CSS クラスに members-only が付いたブロックを、ログインしていない人には出力しない。
 */
add_filter( 'render_block', 'mysite_hide_members_only_block', 10, 2 );

function mysite_hide_members_only_block( $block_content, $block ) {
	if ( empty( $block['attrs']['className'] ) ) {
		return $block_content;
	}

	$classes = preg_split( '/\s+/', $block['attrs']['className'] );

	if ( in_array( 'members-only', $classes, true ) && ! is_user_logged_in() ) {
		return '';
	}

	return $block_content;
}

使うときは、対象のブロックを選び、右側の設定パネルの「高度な設定」を開いて「追加 CSS クラス」に members-only と入力します。複数のブロックをまとめて切り替えたいときは、「グループ」ブロックで囲んでグループにクラスを付けると、中のブロックごと表示されなくなります。

「追加 CSS クラス」の欄が無いブロック(クラス名の設定に対応していないブロック)には使えません。その場合はグループで囲んでください。

方法3: ページ全体をログイン必須にする

特定の固定ページを丸ごと会員専用にする場合は、template_redirect(テンプレートを読み込む直前に動くアクション)で、ログインしていない人をログイン画面へ転送します。

<?php
/**
 * スラッグが members の固定ページと、その子ページをログイン必須にする。
 */
add_action( 'template_redirect', 'mysite_require_login_for_members_page' );

function mysite_require_login_for_members_page() {
	if ( is_user_logged_in() || ! is_page() ) {
		return;
	}

	$page = get_queried_object();
	if ( ! $page instanceof WP_Post ) {
		return;
	}

	$protected = get_page_by_path( 'members' );
	if ( ! $protected ) {
		return;
	}

	$ancestors = get_post_ancestors( $page );
	if ( $page->ID === $protected->ID || in_array( $protected->ID, $ancestors, true ) ) {
		auth_redirect();
	}
}

auth_redirect() は、ログインしていなければ、ログイン後に元のページへ戻るようにしてログイン画面へ転送し、処理を終える関数です。members の部分は保護したいページのスラッグに変えます。

この方法で止められるのは、そのページの表示だけです。同じ本文は REST API(/wp-json/wp/v2/pages)から取れるため、公開されている固定ページの本文を外から読まれたくない場合は、REST API の制限もあわせて検討してください。

テーマのテンプレートで切り替える

テーマのテンプレートファイル(子テーマの single.php など)を編集できる場合は、テンプレートの中で直接分けられます。

<?php if ( is_user_logged_in() ) : ?>
	<div class="members-area">
		<?php the_content(); ?>
	</div>
<?php else : ?>
	<p>続きはログインすると読めます。<a href="<?php echo esc_url( wp_login_url( get_permalink() ) ); ?>">ログインする</a></p>
<?php endif; ?>

親テーマのファイルを直接編集すると、テーマの更新で消えます。テンプレートを変えるときは子テーマにコピーしてから編集してください。

見た目だけを変えたい場合(CSS)

テーマが body_class() を出力していれば、ログイン中のページの <body> には logged-in というクラスが付きます。これを使うと、ボタンの文言や案内の表示など、見られても困らない部分の見た目を切り替えられます。

/* ログインしていないときだけ表示する案内 */
.login-guide { display: block; }
body.logged-in .login-guide { display: none; }

前に書いたとおり、CSS で隠した内容は HTML に残ります。会員向けの情報には使わないでください。

キャッシュを使っているときの注意

ページキャッシュ(キャッシュプラグイン、サーバー会社のキャッシュ機能、CDN)を使っていると、ログインしていない人向けに作られたページが保存され、ログインした人にも同じページが返ることがあります。逆に、ログイン中に作られたページが保存されると、会員向けの内容が誰にでも見えてしまいます。

  • キャッシュの設定で、ログイン中のユーザーにはキャッシュを返さない(ログイン用 Cookie があるときはキャッシュしない)設定になっているかを確認します。多くのキャッシュプラグインは既定でそうなっていますが、CDN やサーバー側のキャッシュは別に設定が必要なことがあります。
  • 設定した後は、ログインしていないブラウザ(シークレットウィンドウなど)とログイン中のブラウザの両方でページを開き、表示が切り替わることを確かめます。

プラグインを使う場合

会員の登録、有料プラン、プランごとの閲覧制限まで必要な場合は、会員サイト用のプラグインを使うほうが管理しやすくなります。「ログインしているかどうか」だけで分ければよい場合は、ここで紹介したコードで足ります。

まとめ

  • 記事の一部はショートコード、ブロック単位は render_block フィルター、ページ全体は template_redirect と auth_redirect() で切り替える
  • 判定には is_user_logged_in()、権限で分けるなら current_user_can() を使う
  • 標準の「非公開」は編集者・管理者向けで、会員向けの公開範囲ではない
  • CSS で隠すだけでは内容は見えてしまう。ページキャッシュの設定もあわせて確認する

関連記事:

お気軽にご相談ください

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