motoyamayuki.com

Blog

WordPressでパスワード保護している投稿を一覧から除外する方法

2015.07.22

クライアントへの確認などでパスワード保護を利用することがありますが、その際に困る点として

・the_content 以外の部分は表示されてしまう
・記事一覧ではパスワード保護されている投稿も表示される

この2点があります。
今回は、後者の問題を解決する方法をご紹介します。

前者のカスタマイズは「WordPressでパスワード保護している投稿ページの本文以外も非表示にする方法」をご覧ください。

 

やりたいこと

WordPressの設定で、公開状態を「パスワード保護」にした投稿は、記事一覧ページなどのアーカイブから除外したい。
exclude

 

解決方法

どのようにして記事一覧を表示させているかによりますが、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>

 

パスワード保護された投稿を除外したい、というのはけっこう需要あるカスタマイズだと思うんですが、解説されているブログが少なかったので書いてみました。

どなたかのお役に立てれば幸いです。

  • このブログをはてなブックマークに追加

Contact

お仕事のご依頼、面白いことのお誘い、一度お話してみたい!などなど、完山祐毅へのお問い合わせは、下記のフォームよりお願いします。送信後、 info@motoyamayuki.com より確認のメールが届きます。
※多くのご相談・ご依頼をいただき誠にありがとうございます。当面のスケジュールが決まっているため、直近での作業が必要なご依頼についてはお請けいたしかねます。大変恐縮ではありますが、あらかじめご了承くださいませ。

お問い合わせフォーム
お名前
メールアドレス
メールアドレス(確認用)
内容
Treble