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 で隠すだけでは内容は見えてしまう。ページキャッシュの設定もあわせて確認する
関連記事: