is_main_query, pre_get_post を使う。
これまで、Wordpressのテーマカスタマイズではquery_postsを使って、取得するポストの条件を定義してDBへアクセス、という手法を使っていた。
が、これだとDBへ2度アクセスする事になり、パフォーマンスの低下を招くことになる。
そこで使うのがpre_get_posts フックとis_main_query()関数。
まずpre_get_postsだが、これはテンプレートファイルにアクセスする前に、メインクエリを変更する為のフックだそう。
そして、is_main_query()関数。
これは、Wordpress標準のクエリなのか、テンプレートから呼び出されたのかを判別するもの。
この2つを使い、function.phpに以下のように記載することで、テンプレート呼び出し前にメインクエリに渡すパラメータを定義出来る。
要は奏することで、DBアクセスを一度にしてしまおうという事。
例えば、以下の様な形で使う事ができる。
function get_my_custom_posts( $query ) {
/* 1 */
if ( is_admin() || ! $query->is_main_query() ){
return;
}
/* 2 */
if ( is_home() && $query->is_main_query() ) {
$query->set( 'posts_per_page', 1 );
return;
}
/* 3 */
if ( is_post_type_archive( POSTTYPE ) && $query->is_main_query() ) {
$query->set('post_type', POSTTYPE );
$query->set('posts_per_page', 10 );
if( $_GET["ar"] ):
$query->set(
'tax_query',
array(
array(
'taxonomy' => 'area',
'field' => 'id',
'terms' => h($_GET["ar"]),
'operator' => 'AND'
)
)
);
endif;
return;
}
}
add_action( 'pre_get_posts', 'get_my_custom_posts', 1 );
簡単に解説をすると、
1) 管理画面 または メインクエリ以外 -> 変更なし
2) ホーム かつ メインクエリ -> 一見のみ取得
3) POSTTYPEのアーカイブ かつ メインクエリ -> POSTTYPE の記事を、10件取得
さらに”ar”というパラメータがあった場合、タクソノミも指定。
という事になる。
参考:
http://codex.wordpress.org/Function_Reference/is_main_query
http://codex.wordpress.org/Plugin_API/Action_Reference/pre_get_posts