記事: 1ページに表示する投稿数を変えるでは、アクションフックを使用して表示する投稿数を変える方法を紹介しました。
同じアクションフックを使用すると、投稿数以外にも様々なカスタマイズが出来るようになります。
条件分岐タグとパラメータを用いて制御する
それでは、1ページに表示する投稿数を変えるfunctions.phpのコードをおさらいします。
1 2 3 4 5 6 7 8 |
add_action( 'pre_get_posts', 'custom_query_pre_get_posts' ); function custom_query_pre_get_posts( $query ) { if ( !is_admin() && $query->is_main_query() ) { if ( is_front_page() ) { $query->set( 'posts_per_page', 3 ); } } } |
コード中で、カスタマイズの際に重要なのは、is_frontpage()
と'posts_per_page'
の部分です。
条件分岐タグ
is_frontpage()
は、表示するページがフロントページ(ホーム)であるかどうかをtrue
かfalse
で返す条件分岐タグです。
この条件分岐タグを、適用したいページに合わせて変更します。
条件分岐タグの例
1 2 3 |
is_frontpage() // フロントページ is_category('news') // カテゴリ'news'のアーカイブページ is_date() // 日付アーカイブのページ |
※条件分岐タグについては、記事: 便利な条件分岐タグまとめを参照
パラメータ
'posts_per_page'
は、1ページに表示する投稿数を設定するための、WP_Queryクラス
のクエリ変数のパラメータです。
パラメータは他にも色々あるので、それを一つまたは複数組み合わせることで、絞り込みや並べ替えを制御します。
パラメータの例
1 2 3 4 5 6 7 8 |
category_name // カテゴリのスラッグ tag // タグのスラッグ p // 投稿ID pagename // 固定ページのスラッグ posts_per_page // 1ページに表示する投稿数 offset // 取得する投稿のオフセット order // 順序を降順(DESC・デフォルト)または昇順(ASC)で指定 orderby // 順序のキーになる項目 |
パラメータの詳細や他のパラメータについては、WordPress Codexページなどを参照してください。
関数リファレンス/WP Query – WordPress Codex 日本語版
例1: カテゴリによる絞り込み
フロントページで、newsカテゴリだけを表示する例です。
1 2 3 4 5 6 7 8 9 10 11 |
add_action( 'pre_get_posts', 'custom_query_pre_get_posts' ); function custom_query_pre_get_posts( $query ) { if ( !is_admin() && $query->is_main_query() ) { if ( is_front_page() ) { $category_name = $query->get( 'category_name' ); if ( empty($category_name) ) { $query->set( 'category_name', 'news' ); } } } } |
is_frontpage()
でフロントページに限定し、'category_name'
にカテゴリスラッグ'news'
を設定します。
事前に'category_name'
の値が空かを確認して、上書きを防止しています。
例2: 記事の並び順の変更
dictionaryカテゴリのアーカイブページで、タイトルの昇順に記事を表示する例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
add_action( 'pre_get_posts', 'custom_query_pre_get_posts' ); function custom_query_pre_get_posts( $query ) { if ( !is_admin() && $query->is_main_query() ) { if ( is_category('dictionary') ) { $orderby = $query->get( 'orderby' ); if ( empty($orderby) ) { $query->set( 'orderby', 'title' ); } $order = $query->get( 'order' ); if ( empty($order) ) { $query->set( 'order', 'ASC' ); } } } } |
ここでは、'orderby'
と'order'
の2つパラメータに値を設定しています。
例1と同様、値をセットする前に、値が空になっているかを確認しています。
例3: カスタムフィールドの値による絞り込み
日付アーカイブのページで、カスタムフィールドで‘重要度’を‘3’以上に設定した記事だけを表示する例です。
このような場合は、次のようにmeta_query
を用いたカスタムフィールド値での絞り込みができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
add_action( 'pre_get_posts', 'custom_query_pre_get_posts' ); function custom_query_pre_get_posts( $query ) { if ( !is_admin() && $query->is_main_query() ) { if ( is_date() ) { $query->set( 'meta_query', array( array( 'key' => '重要度', 'value' => '3', 'type' => 'NUMERIC', 'compare'=> '>=' ), )); } } } |
このアクションフックのWP_Query
クラスのパラメータは、テンプレート内で使用できるquery_posts
関数やget_posts
関数のパラメータと同じものです。
メインループの絞り込み・並べ替えの場合には、query_posts
関数を使うよりも、ここで紹介したアクションフックを使った方法がおすすめです。