会員限定コンテンツや社内向けのサイトでは、ログインしているユーザーのみに見せたい情報を記事一覧に表示する場面があります。たとえば「編集用メモ」や「社内資料へのリンク」、「投稿のステータス情報」などを、一般ユーザーには見せず、ログインユーザーのみに限定して表示したい場合です。
この記事では、WordPressのループ内でログイン状態を判定し、ログインユーザーにのみ特定の項目を表示する方法を紹介します。
is_user_logged_in() を使って条件分岐する
WordPressには is_user_logged_in() という関数があり、ログイン中かどうかを簡単に判定できます。
実装例:記事一覧でログインユーザーに「社内メモ」を表示
以下は記事一覧(index.php や archive.php)などで使えるコード例です。
index.php / archive.php:ループ内でログインユーザーにのみ社内メモを表示
<?php if (have_posts()) : ?>
<ul class="post-list">
<?php while (have_posts()) : the_post(); ?>
<li>
<a href="<?php the_permalink(); ?>"><?php the_title(); ?></a>
<?php
// ログインユーザーだけに表示する項目
if (is_user_logged_in()) :
// カスタムフィールドや任意の内容をここに記述
$internal_note = get_post_meta(get_the_ID(), 'internal_note', true);
if (!empty($internal_note)) :
?>
<div class="internal-note">
<strong>社内メモ:</strong><?php echo esc_html($internal_note); ?>
</div>
<?php
endif;
endif;
?>
</li>
<?php endwhile; ?>
</ul>
<?php endif; ?>
応用:HTML構造を変えて非ログインユーザーに空白を見せないようにする
ログインしていないユーザーには項目自体をレンダリングしないようにすることで、無駄な空要素を省き、表示もすっきりさせることができます。
注意点
ページキャッシュ環境では意図しない表示になることがある
is_user_logged_in()はリクエストごとに判定するだけで、キャッシュを考慮する仕組みはありません。WP Super Cacheなどのページキャッシュを使っている場合、あるページが最初にキャッシュされた時点の判定結果がそのまま固定されます。記事一覧ページにこの方法を使うと、キャッシュ生成時の状態次第で、本来見せてはいけない相手に社内メモが表示され続けてしまう可能性があります。対策としては、該当ページをキャッシュ対象から除外するか、キャッシュプラグインにログイン状態別のキャッシュ設定がある場合はそれを有効にしてください。- 上記例で使用している get_post_meta() によるカスタムフィールド取得は、ACFなどで入力された値にも対応できます。
関連記事
よくある質問(FAQ)
Qループ内でログインユーザーにのみ表示する情報を追加するには?
Ais_user_logged_in()でチェックし、trueの場合にのみHTML要素を出力します。ユーザーロール別に表示内容を変えたい場合はcurrent_user_can()で権限を確認して分岐します。
Qログイン状態に応じてCSSクラスを切り替える方法は?
Ais_user_logged_in() ? ‘logged-in’ : ‘logged-out’のような三項演算子でクラス名を動的に生成します。WordPressはbody_class()にも自動でlogged-inクラスを付与するため、CSSでの制御も可能です。
QJavaScriptで非同期にログイン状態を判定してコンテンツを切り替えることはできますか?
AWordPressのREST APIの/wp/v2/users/meエンドポイントを叩く方法があります。未ログインなら401が返り、ログイン中なら自分のユーザー情報が返るため、ログイン判定に利用できます。ページに埋め込まれたnonce値の有無で判定する方法もありますが、いずれもサーバーサイドでの制御の方がセキュリティ上確実です。
まとめ
WordPressでは、is_user_logged_in() を使うことで、記事一覧内でもログインユーザー専用の情報を表示する処理が簡単に実現できます。ページキャッシュ環境での注意点にも配慮しつつ、ユーザーの閲覧環境に応じた柔軟な表示制御をしていきましょう。

