ブログ
カスタム投稿タイプの表示件数指定でうっかり間違えそうになった
カスタム投稿タイプのアーカイブページにおいて表示件数を指定する場合、サイト共通の表示件数であれば管理画面の表示設定で1ページあたりの表示件数を設定すれば済みますが、カテゴリページとアーカイブページで表示件数を変えたい場合や welcart を導入していたりする場合はページ毎に表示件数を指定する場合があります。
表示件数を明示的に指定する、ということでうっかり query_posts を使いそうになってハタと思い出しました。
query_posts をプラグインやテーマで使用することは推奨されていないことを。
codex では「query_posts() は決して使うべきではありません。」と表現されています。
http://wpdocs.sourceforge.jp/%E3%83%86%E3%83%B3%E3%83%97%E3%83%AC%E3%83%BC%E3%83%88%E3%82%BF%E3%82%B0/query_posts
アーカイブページが表示された時点で WordPress はデータベース検索を終え条件に合致する記事を取得していますので表示件数を設定する為だけにデータベース検索を行うのは資源の無駄遣いです。
query_postsを捨てよ、pre_get_postsを使おう
を参考にしてこんなコードを書きました。
/***********************************************************
* カスタム投稿タイプ(ブログ)1ページあたりの表示件数設定
***********************************************************/
add_action(‘pre_get_posts’, ‘pre_get_posts_post_type_blog’);
function pre_get_posts_post_type_blog( $query ){
if ( is_admin() || !$query->is_main_query() ) return;
if ( is_post_type_archive(‘post_type_blog’) || is_tax(‘blogcat’) ){
$query->set(‘posts_per_page’, 2);
}
}
上記例ではカスタム投稿タイプアーカイブページを表示する時とカスタムタクソノミーページを表示する時に表示件数を2件に設定します。
※カスタム投稿タイプを post_type_blog と定義しています。
※カスタムタクソノミーを blogcat と定義しています。
メインループ以外に検索が必要な場合は get_posts を使い、メインループの条件を変更する場合は pre_get_posts を使う。
忘れがちなので忘備録も兼ねて記事にしてみました。