通常WordPressは管理画面の設定>表示設定>1ページに表示する最大投稿数で、1ページあたりの最大投稿数を設定しますが、トップページは3件カテゴリーは6件アーカイブは20件など複数の設定をする場合はfunctions.phpから設定するのが一元管理できていい感じです。
pre_get_postsで表示件数を調整する
posts_per_pageで表示件数を設定します。
<?php //表示件数制御 add_action('pre_get_posts','my_pre_get_posts'); function my_pre_get_posts( $query ) { if(is_admin() || ! $query -> is_main_query()) return; if($query -> is_front_page()) { //フロントページ $query -> set('posts_per_page',10); //10件 } if($query->is_home()){ // トップページ $query->set( 'posts_per_page',20); //20件 } if($query->is_month()){ // 月別アーカイブ $query->set('posts_per_page',-1); // -1ですべて表示 } if($query->is_year()){ //年別アーカイブ $query->set('posts_per_page',10); //10件 } if($query->is_author()){ // 作成者アーカイブ $query->set('posts_per_page',10); // 10件 } if($query->is_category()){ // カテゴリーアーカイブ $query->set('posts_per_page',9); // 9件 } //newsというカスタム投稿タイプのアーカイブページ if($query -> is_post_type_archive('news')){ $query -> set('posts_per_page',10); //10件 $query -> set('order','ASC'); //昇順 $query -> set('orderby', 'date'); //日 } //newscatというタクソノミーの一覧ページ if ($query -> is_tax('newscat')) { $query -> set('posts_per_page', 10); //10件 $query -> set('order', 'DESC'); //降順 $query -> set('orderby', 'date'); //日 } } ?>
ループから特定のタームを除外する
$tax_queryで特定のタームを指定すればループから特定のタームを除外することができます。
if($query -> is_post_type_archive('news')){ $tax_query = array( array( 'taxonomy' => 'newscat', 'terms' => array('other'), 'field' => 'slug', 'operator' => 'NOT IN',//一致しない場合は実行 ) ); $query -> set('posts_per_page', 10); $query -> set('order', 'DESC'); $query -> set('orderby', 'date'); $query -> set('tax_query', $tax_query); }
特定のカテゴリを除外する場合
以下はトップページに特定のカテゴリーを表示させない例です。カテゴリーIDに「-」をつけます。
if($query->is_home()){ // トップページ $query->set( 'cat', '-カテゴリID' ); }
pre_get_postsでメインのループを制御
メインループに条件を加えて制御する場合はpre_get_postsがやっぱ手軽だと思います。