query_postは今後はあまり使わないでね。
という方向性になっているようなので
pre_get_postsを今後は使っていこうと思う。
ちょっと使ってみた分にはページ送りなんかの問題が無い分、この上無く素晴らしいと感じた。
ただ、基本的に既存のアーカイブページなどをハックするので全てのものに万能に使える訳でなないみたい。
基本的な使い方
function change_posts_per_page($query) {
/* 管理画面,メインクエリに干渉しないために必須 */
if( !is_admin() && $query->is_main_query() ){
/* 投稿タイプがNEWSのアーカイブページに投稿タイプNEWSとインタビューを合わせて表示する。 */
if ( $query->is_post_type_archive( 'news' ) ) {
$query->set( 'post_type', array('news','interview') );
return;
}
}
}
add_action( 'pre_get_posts', 'change_posts_per_page' );
条件
/*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()
/*カテゴリーページ配列での指定(カテゴリID3,カテゴリスラッグfoo,カテゴリ名Barbarのいずれか)*/
$query->is_category(array(3,'foo','Barbar'))
/*タグページ*/
$query->is_tag()
/*タクソノミーページ*/
$query->is_tax()
/*タクソノミーページfooというスラッグのタクソノミーアーカイブが表示された時*/
$query->is_tax('foo')
/*タクソノミーページbar1,bar2のスラッグがfooタクソノミーアーカイブで表示された時*/
$query->is_tax('foo',array('bar1','bar2'))
/*検索結果ページ*/
$query->is_search()
/*フィードページ*/
$query->is_feed()
/*404ページ*/
$query->is_404()
クエリの設定
$query->set( 'パラメータ', 'パラメータ値' );
/* 現在のページ番号を取得 */
$query->set( 'paged',get_query_var( 'paged' ) );
/* 特定タクソノミーの取得 タクソノミー:foo_cat,ターム:slug_foo */
$taxquery = array(
array(
'taxonomy' => 'foo_cat',
'field' => 'slug',
'terms' => array( 'slug_foo' )
)
);
$query->set( 'tax_query' , $taxquery );
if ( $query->is_search() ) {
$query->set(
'meta_query',
array(
array(
'key' => 'exclude_search',
'value' => '1',
'compare' => '!=',
'type' => 'NUMERIC'
)
)
);
}
細かいクエリについてはWikiを参照。
関数リファレンス/WP Query