【WordPress】記事一覧のループでログインユーザー以外にパスワード保護された投稿を非表示にする方法

WordPressを使用してブログやウェブサイトを運営していると、特定の投稿をパスワードで保護したい場合があります。しかし、すべての訪問者がこれらの保護された投稿を見る必要はありません。今回は、ログインしていないユーザーに対してパスワード保護された投稿を非表示にする方法をご紹介します。

スポンサーリンク

functions.php ファイルにコードを追加

テーマの functions.php ファイルに以下のコードを追加します。

function exclude_protected_posts($query) {
    if (!is_admin() && $query->is_main_query()) {
        if (!is_user_logged_in()) {
            $query->set('has_password', false);
        }
    }
}
add_action('pre_get_posts', 'exclude_protected_posts');

このコードは、メインクエリが実行される前に特定の条件をチェックし、条件に応じてクエリをカスタマイズします。

  1. pre_get_posts アクションフックを使用:このフックは、メインクエリが実行される前に呼び出されます。
  2. 管理画面かどうかのチェック:is_admin() 関数を使用して、現在のページが管理画面かどうかをチェックします。管理画面でない場合にのみ次の条件を確認します。
  3. メインクエリかどうかのチェック:is_main_query() 関数を使用して、現在のクエリがメインクエリかどうかをチェックします。
  4. ユーザーがログインしているかどうかのチェック:is_user_logged_in() 関数を使用して、ユーザーがログインしているかどうかを確認します。ログインしていない場合、パスワード保護された投稿を除外するために has_password パラメータを false に設定します。

よくある質問(FAQ)

Q. パスワード保護された記事をループでログインユーザーのみ表示するには?
A. is_user_logged_in()でログイン確認し、post_statusにarray(‘publish’, ‘private’)を指定したWP_Queryを使います。または post_password_required()でパスワード要求チェックをして表示を切り替えます。
Q. post_password_required()関数の使い方を教えてください
A. post_password_required($post)はその投稿がパスワード保護されていてまだ認証されていない場合にtrueを返します。ループ内でif(!post_password_required()){}で表示/非表示を切り替えられます。
Q. パスワード保護記事の一覧でタイトルのみ表示してコンテンツは隠す方法は?
A. post_password_required()がtrueの場合は「パスワードで保護されています」などのメッセージを表示し、falseの場合はthe_content()で本文を表示します。get_the_excerpt()はWordPress側でパスワード保護時に自動的に保護メッセージを返します。

まとめ

このシンプルなコードを functions.php ファイルに追加することで、ログインしていないユーザーにはパスワード保護された投稿が表示されなくなります。これにより、訪問者に見せたい情報のみを効果的に管理することができます