代码之家  ›  专栏  ›  技术社区  ›  shipshape

如何从自定义分类查询中排除子分类法中的文章?

  •  2
  • shipshape  · 技术社区  · 14 年前

    我的WordPress主题有一个名为“集合”的自定义分类。自定义分类法是分层的,因此存在子集合。

    我有一本书叫“书”,还有一个子集叫“小说”。有些帖子只是在“书”里,有些帖子是在“小说”里。我希望“书”收藏的页面只显示主要“书”收藏中的帖子,而不是“小说”子集合中的帖子。但默认情况下,WordPress在分类查询的“子集合”中包含了文章。

    如何从分类查询中排除子术语中的文章?分类法很容易做到这一点,但是对于自定义分类法似乎没有内置的方法来做到这一点。


    更新: 简的解决方案非常有效。下面是我使用的代码,位于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) );
     }
    }
    
    1 回复  |  直到 14 年前
        1
  •  3
  •   Jan Fabry    14 年前

    似乎是wp_查询类 always includes all items of hierarchical taxonomies . 如果您想反驳这一点,您可以使用它们使用的相同技巧:获取分类项的所有子项,然后获取这些子项中的所有post 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的此日志。很不合群,但很有效。

    当然,如果您走这条路线,您也可以通过您想要的post-id,并且不告诉查询有关分类的任何信息。

    对于类别,您是如何做到这一点的? The query code seems to include children there too.