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>
パスワード保護された投稿を除外したい、というのはけっこう需要あるカスタマイズだと思うんですが、解説されているブログが少なかったので書いてみました。
どなたかのお役に立てれば幸いです。