y.o.designers-works

WordPressのpre_get_postsとis_main_queryについて

pre_get_postsとは

pre_get_postsは、WordPressがクエリを取得する前に実行される「アクションフック」のひとつです。
アクションフックとはWordPressで発生する特定のイベントに合わせて実行することができる機能です。
WordPressがメインクエリを取得する前にも、pre_get_postsが実行されます。
このアクションフックを使うとメインクエリを改変できるようになります。

is_main_queryとは

is_main_queryは条件分岐関数です、現在のクエリ(ループ内など)がメインクエリかどうかというのをチェックします。
WordPress の「メイン」クエリ(固定ページ、投稿、またはアーカイブ)とカスタム/サブクエリを区別するために使われます。

記述方法

例では、TOPページの場合投稿を10件表示し、カテゴリID1の記事を除外するという記述です。

functions.phpに追記

function custom_posts_per_page($query) {
 if( is_admin() || ! $query->is_main_query() ){
     return;
 }
 
 /* カテゴリーページの表示件数を5件にする */
 if ( $query->is_home() ) {
     $query->set( 'posts_per_page', '10' );
     $query->set( 'cat','-1' ); //カテゴリID1を除外
     return;
 }
 
}
add_action( 'pre_get_posts', 'custom_posts_per_page' );

最初のis_admin()でダッシュボードまたは管理パネルが表示されているかどうかをチェックしています。
ダッシュボードが表示されている場合はreturnとなって以降の処理を中断します。
メインクエリを変更するため、ダッシュボード等の表示に影響が出るのを防いでいます。
同じようにis_main_query()でメインクエリかをチェックしています。「!」がついているので「メインクエリではない場合」に処理を中断します。
「->」はアロー演算子と呼ばれるもので、クラスやオブジェクトのプロパティやメソッドを参照するという意味です。

指定できる条件分岐


/* TOPページ */
$query->is_home()
 
/* 詳細ページ */
$query->is_single()
 
/* 固定ページ */
$query->is_page()
 
/* アーカイブページ */
$query->is_archive()
 
/* カスタム投稿タイプアーカイブページ カスタム投稿タイプを入れてください */
$query->is_post_type_archive( 'post_type' )
 
/* 日付アーカイブページ */
$query->is_date()
 
/* 年別アーカイブページ */
$query->is_year()
 
/* 月別アーカイブページ */
$query->is_month()
 
/* 制作者アーカイブページ */
$query->is_author()
 
/* カテゴリーページ */
$query->is_category()
 
/* カテゴリーページ 配列での指定(カテゴリID1,カテゴリスラッグ'●●●,カテゴリ名▲▲▲か■■■のいずれか) */
$query->is_category( array(1,'●●●','▲▲▲ ■■■') )
 
/* タグページ */
$query->is_tag()
 
/* タクソノミーページ */
$query->is_tax()
 
/* タクソノミーページ fooというスラッグのタクソノミーアーカイブが表示された時 */
$query->is_tax( '●●●' )
 
/* タクソノミーページ ▲▲▲,■■■のスラッグが●●●タクソノミーアーカイブで表示された時 */
$query->is_tax( '●●●', array('▲▲▲','■■■') )
 
/* 検索結果ページ */
$query->is_search()
 
/* フィードページ */
$query->is_feed()

クエリの設定方法について

$query->set( 'パラメータ', 'パラメータ値'  );
/* 現在のページ番号を取得 */
$query->set( 'paged',get_query_var( 'paged' ) );
 
/* 表示数の変更 */
$query->set( 'posts_per_page',5  );
 
/* 特定タクソノミーの取得 タクソノミー:●●●,ターム:▲▲▲と■■■*/
$taxquery = array(
 array(
   'taxonomy' => '●●●',
   'field' => 'slug',
   'terms' => array( '▲▲▲','■■■' )
 )
);
$query->set( 'tax_query' , $taxquery );
 
/* カテゴリーID1の記事取得 */
$query->set( 'cat','1' );
 
/* カテゴリーID2の記事を除外する */
$query->set( 'cat','-2' );

/* 記事の並び順を昇順に */
$query->set('order', 'ASC');
 
/* 特定カテゴリー名の記事を取得する(スラッグ指定) */
$query->set( 'category_name','$slug' )
 
/* 特定カテゴリーを除外する */
$query->set( 'category__not_in',array(2,3) );
 
/* 取得する記事のタイプを投稿のみにする(固定ページやカスタム投稿タイプを除外する) */
$query->set( 'post_type','post' );

まとめ

メインクエリの改変はpre_get_postsを使用し、 サブクエリの作成はget_postsWP_Queryを使用しましょう。

参考にさせて頂いたサイト

スポンサーリンク

他にオススメな記事