2

私のWordPressテーマには、「コレクション」と呼ばれるカスタム分類法があります。カスタム分類法は階層的であるため、サブコレクションがあります。

「Books」というコレクションと「Novels」というサブコレクションがあります。ちょうど「本」にあるいくつかの投稿と「小説」にあるいくつかの投稿があります。「Books」コレクションのページには、「Novels」サブコレクションの投稿ではなく、メインの「Books」コレクションの投稿のみを表示したいと思います。ただし、デフォルトでは、WordPressは分類法のクエリの「サブコレクション」に投稿を含めます。

子用語の投稿を分類クエリから除外するにはどうすればよいですか?これはカテゴリでは簡単ですが、カスタム分類法でこれを行うための組み込みの方法はないようです。


更新: Janのソリューションは完全に機能しました。これが私が使用したコードで、index.phpのループの上に配置されています。

// if is taxonomy query for 'collections' taxonomy, modify query so only posts in that collection (not posts in subcollections) are shown.
if (is_tax()) {
 if (get_query_var('collection')) {
  $taxonomy_term_id = $wp_query->queried_object_id;
  $taxonomy = 'collection';
  $unwanted_children = get_term_children($taxonomy_term_id, $taxonomy);
  $unwanted_post_ids = get_objects_in_term($unwanted_children, $taxonomy);

  // merge with original query to preserve pagination, etc.
  query_posts( array_merge( array('post__not_in' => $unwanted_post_ids), $wp_query->query) );
 }
}
4

1 に答える 1

3

WP_Queryクラスには、常に階層分類のすべての項目が含まれているようです。これに対抗したい場合は、それらが使用するのと同じトリックを使用できます。分類アイテムのすべてのサブアイテムを取得し、それらのサブアイテムのすべての投稿IDを取得して、post__not_inパラメーターに配置します。

$unwanted_children = get_term_children($taxonomy_term_id, $taxonomy);
$unwanted_post_ids = get_objects_in_term($unwanted_children, $taxonomy);

これにより、が含まれるクエリが生成されAND posts.ID IN (1, 2, 3) AND posts.ID NOT IN (2, 3)、ID 1のこの投稿のみが返されます。非常に不適切ですが、機能します。

もちろん、このルートを使用する場合は、必要な投稿IDを渡すだけで、分類法についてクエリに何も伝えないようにすることもできます。

カテゴリに対してこれをどのように行いますか?クエリコードには、そこにも子が含まれているようです。

于 2010-08-10T21:04:15.950 に答える