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