is_main_query, pre_get_post を使う。

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