WordPressでパスワード保護している投稿を一覧から除外する方法
2015.07.22
クライアントへの確認などでパスワード保護を利用することがありますが、その際に困る点として
・the_content 以外の部分は表示されてしまう
・記事一覧ではパスワード保護されている投稿も表示される
この2点があります。
今回は、後者の問題を解決する方法をご紹介します。
前者のカスタマイズは「WordPressでパスワード保護している投稿ページの本文以外も非表示にする方法」をご覧ください。
やりたいこと
WordPressの設定で、公開状態を「パスワード保護」にした投稿は、記事一覧ページなどのアーカイブから除外したい。
解決方法
どのようにして記事一覧を表示させているかによりますが、archive.phpやcategory.phpで表示させている場合は、functions.phpに下記のコードを追記します。
/* pre_get_posts */ function customize_main_query ( $query ) { if ( ! is_admin() || $query->is_main_query() ) { //管理画面以外 かつ メインクエリー if ( $query->is_archive() ) { $query->set( 'has_password', false ); } } } add_action( 'pre_get_posts', 'customize_main_query' ); // pre_get_postsにフック
pre_get_postsフィルターを使って、取得する投稿データを調整します。
パスワード関連のパラメーターに”has_password”というものがあり、これを使ってパスワード保護されている投稿かどうかが判定できます。
“has_password”が”false”。つまり、「パスワード保護されていない投稿だけ取得してね」という設定にします。
これで、パスワード保護された投稿はアーカイブページから除外されます。
もしトップページや固定ページで、get_postsを使用して投稿一覧を取得している場合も考え方は同じですので、
・”product”というカスタム投稿タイプ
・新着10件を表示
・パスワード保護された投稿は除外
このような条件の投稿を取得したい場合、下記のようなコードで実現できます。
<ul> <?php $args = array( 'post_type' => 'product', 'numberposts' => 10, 'has_password' => false, ); $postslist = get_posts( $args ); foreach ($postslist as $post) : setup_postdata($post); ?> <li> <a href="<?php the_permalink(); ?>"> <?php the_title(); ?> </a> </li> <?php endforeach; ?> </ul>
パスワード保護された投稿を除外したい、というのはけっこう需要あるカスタマイズだと思うんですが、解説されているブログが少なかったので書いてみました。
どなたかのお役に立てれば幸いです。