通常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がやっぱ手軽だと思います。




