【WordPress】アーカイブページによって投稿数などの表示条件を変更|pre_get_posts
WordPressでサイトを作成していると、アーカイブページによって、投稿数などの表示条件を変更したい場合があると思います。
今回は、そのような場合に利用できる方法となり、メインクエリ(データベースへの問い合わせ)を、pre_get_postsフックを使い変更する例となります。
アーカイブページによって投稿数などの表示条件をを変更する例
以下がソースコードの例となりfunctions.phpファイルに記述します。
例では、pre_get_postsフックを使用し以下の条件でクエリを変更しています。
- トップページでは、投稿数を6件、表示順をランダムで表示
- 検索ページでは、投稿数を12件で表示
- その他のページはデフォルトの設定で表示
function my_pre_get_posts( $query ) {
// 管理画面または、メインクエリ以外の場合
if ( is_admin() || !$query->is_main_query() ) {
return;
}
// トップページの場合
if ( $query->is_home ) {
$query->set( 'posts_per_page', '6' );
$query->set( 'orderby', 'rand' );
}
// 検索結果ページの場合
if ( $query->is_search ) {
$query->set( 'posts_per_page', '12' );
}
};
add_action( 'pre_get_posts', 'my_pre_get_posts' );
ソースコードの説明
pre_get_postsフックについて
WordPressにはメインクエリをはじめ、データベースへの問い合わせ(クエリ)全般で使用するWP_Queryクラスがあります。
pre_get_postsフックで登録した関数の引数には、そのWP_Queryオブジェクト($query) が渡され、そのオブジェクトを変更することでクエリの内容を変更できます。
また、pre_get_postsフックが呼び出されるタイミングは、メインクエリによるデータベースへの問い合わせが実行される前となります。
pre_get_postsフックの影響を制限
pre_get_postsフックでクエリを変更すると、管理画面のクエリやメインクエリ以外にも影響がでる場合があります。
そのため、まず、例のソースコード2行目からの箇所で、管理画面やメインクエリ以外では、クエリを変更せず返します。
setメソッドを使用しクエリを変更
pre_get_postsフックで登録した関数内で、クエリを変更するにはsetメソッドを使用します。
setメソッドでは、第1引数にWP_Queryのパラメータ、第2引数にそのパラメータに対応した値を指定してクエリを変更します。
例では、ソースコード6行目からの箇所で、指定したページによってsetメソッドを使いメインクエリを変更しています。
pre_get_postsフックやWP_Queryのパラメータの詳細は、以下のページや参考サイト・書籍を確認してみてください。