web-dev-qa-db-ja.com

ループをフィルタまたはフックでオーバーライドする

新しいテンプレートの作成やそこでの新しい$wp_queryオブジェクトの作成を扱うことなく、特定のカテゴリのWP_Queryオブジェクトを置き換えることを試みています。

私の目的は、The Loopで利用可能なデータを、そのリクエストのデフォルトからカスタムクエリに変更することです。

add_filter( 'pre_get_posts', 'custom_wpquery' );

function custom_wpquery( $query ){
global $wp_query;
   if (is_category(121)) {
             if ($wp_query === $query) {
                   $query = new WP_Query('page_id=146');
                   $query->set('page_id', 146);
             }
   }
  return $query;
};

それはThe Loopにまったく影響を与えないようです、私は何を間違っていますか?

4
Andrei

これはうまくいくように思えますが、それがこの種の上書きを提供するための「正しい」方法であるならば、私は他人からのヒアリングに興味があるでしょう。 http://www.example.com/category/computers/ のようなカテゴリアーカイブページにアクセスしているとします。

// landing page = 188
// category = "computers" (#8)

function custom_wpquery( $query ){
    // the main query
    global $wp_the_query;

    if ( 'computers' === $query->get( 'category_name' ) ) {
        if ( $wp_the_query === $query) {
            // reset and override the active query
            $query->init();
            $query->query( 'page_id=188' );
        }
    }
};
add_filter( 'pre_get_posts', 'custom_wpquery' );

これはおそらく$query->is_archiveもテストするはずです。

1