【WordPress】記事一覧でログインユーザーにだけ表示される項目を追加する方法

【WordPress】記事一覧でログインユーザーにだけ表示される項目を追加する方法 WordPress

会員限定コンテンツや社内向けのサイトでは、ログインしているユーザーのみに見せたい情報を記事一覧に表示する場面があります。たとえば「編集用メモ」や「社内資料へのリンク」、「投稿のステータス情報」などを、一般ユーザーには見せず、ログインユーザーのみに限定して表示したい場合です。

この記事では、WordPressのループ内でログイン状態を判定し、ログインユーザーにのみ特定の項目を表示する方法を紹介します。

スポンサーリンク

is_user_logged_in() を使って条件分岐する

WordPressには is_user_logged_in() という関数があり、ログイン中かどうかを簡単に判定できます。

実装例:記事一覧でログインユーザーに「社内メモ」を表示

以下は記事一覧(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() はフロントエンドでも使用可能ですが、キャッシュ系プラグインを使っている場合は注意(ログイン・非ログインで表示を切り替えると、キャッシュに誤差が生じる可能性あり)。
  • 上記例で使用している get_post_meta() によるカスタムフィールド取得は、ACFなどで入力された値にも対応できます。

よくある質問(FAQ)

Q. ループ内でログインユーザーにのみ表示する情報を追加するには?
A. is_user_logged_in()でチェックし、trueの場合にのみHTML要素を出力します。ユーザーロール別に表示内容を変えたい場合はcurrent_user_can()で権限を確認して分岐します。
Q. ログイン状態に応じてCSSクラスを切り替える方法は?
A. is_user_logged_in() ? ‘logged-in’ : ‘logged-out’のような三項演算子でクラス名を動的に生成します。WordPressはbody_class()にも自動でlogged-inクラスを付与するため、CSSでの制御も可能です。
Q. JavaScriptで非同期にログイン状態を判定してコンテンツを切り替えることはできますか?
A. WordPressのREST APIの/wp/v2/usersエンドポイントを叩いてログイン確認する方法や、ページに埋め込まれたnonce値の有無で判定する方法があります。ただしサーバーサイドでの制御の方がセキュリティ上確実です。

まとめ

WordPressでは、is_user_logged_in() を使うことで、記事一覧内でもログインユーザー専用の情報を表示する処理が簡単に実現できます。セキュリティ面にも配慮しつつ、ユーザーの閲覧環境に応じた柔軟な表示制御をしていきましょう。