web-dev-qa-db-ja.com

CPTを追加するためにpre_get_postsでアーカイブクエリを変更する方法

pre_get_postsをこのように使うと

function ef_company_query($query) {
  if ( !is_admin() && $query->is_main_query() && $query->is_post_type_archive( 'company' ) ) {
    $query->set('post_type', array( 'company', 'mission', 'values', 'staff' ) );
  }
}

add_action('pre_get_posts','ef_company_query');

wordpressはarchive-company.phpではなくarchive.phpをロードしないようです。

アーカイブページに余分なCPTを追加するためにpre_get_postsを使用するにはどうすればよいですか?

編集1

私はURL www.website.com/companyで追加のCPTをロードしたいのでarchive-company.phpに言及しました。

編集2

URL www.website.com/companyに基づいて特定のテンプレートを取得し、追加のCPTを追加できるようにする(できればpre_get_postsを使用して、パフォーマンス的には)任意の解決策を選択できます。

編集3

ここで物事をより明確にしようとしている!

Www.website.com/companyのURLで複数のCPTをロードできるようにしたいです。

  1. どのテンプレートを使えばいいですか?
  2. CPTをメインのクエリに追加する方法(できればpre_get_posts、パフォーマンスの観点から)。

私はnew WP_Query()の使用を避け、ページ内に複数のループを入れようとしています。

1
Diogo Bento

あなたはそれが first のために複数の投稿タイプのアーカイブをつかむと仮定するようです。しかし、なぜ?この場合の順序は、いかなる種類の優先順位も示していません。

WPはその論理も同様に考慮しているようです。 get_archive_template()を見てみると、個々のテンプレートは、クエリに 1つだけ postタイプがある場合にのみ考慮されます。

ご覧のとおり、クエリに複数の投稿タイプがあるとarchive.phpが読み込まれます。

もっと具体的なテンプレートをロードしたい場合は、archive_template one(get_query_template()内の動的なもの)のように、フィルタを介してそれを上書きする必要があります。

1
Rarst