0

我发现在 WordPress 中可以做到这一点:

假设您在名为“news-sub”的子类别下发布了一些内容,而父类别是“news”。默认情况下,即使您只选择将其发布在新闻子类别下,wordpress 帖子也会发布在新闻和新闻子目录下。我找到了一种方法,当您选择将帖子仅发布在其子类别中时,该帖子仅发布在其子类别中。这是插入到functions.php中的代码:

add_action( 'pre_get_posts', 'my_post_queries' );
function my_post_queries( $query ) {
  // not an admin page and is the main query
  if (!is_admin() && $query->is_main_query()){
    if(is_category()){
      add_action('posts_where', 'current_category_only');
    }
  }
}

function current_category_only($where) {
  $current_cat = get_query_var('cat');
  if($current_cat){
    global $wpdb;
    return " AND ( $wpdb->term_relationships.term_taxonomy_id IN ($current_cat) ) 
    AND $wpdb->posts.post_type = 'post' AND ($wpdb->posts.post_status = 'publish'
    OR  $wpdb->posts.post_status = 'private')";
  }
  return $where;
}

这段代码很棒。但是,它不适用于插件。例如...我有一个插件,可以为您选择的类别发布缩略图和标题。假设我选择它以仅显示“新闻”类别..如果我在“新闻子”类别下发布了一些内容,它仍然会通过插件显示,无论我之前提到的功能代码如何。我尝试将功能代码复制并粘贴到插件中,但它不起作用。:(

那么,如何让这个功能与显示类别的插件一起使用?我会修改它并将其保留在 functions.php 文件中,我会修改它并将其复制并粘贴到我的插件文件中,还是我将如何修改它?任何帮助将不胜感激!:)

4

1 回答 1

1

您所描述的行为是绝对可以预期的。类别是分层的,因此父类别应包含子类别及其帖子

您的posts_where过滤器正在尝试将行为更改为更像标签。但是某些功能,例如get_posts() 不运行这些过滤器

某些检索帖子的函数不运行过滤器,因此您附加的 posts_where 过滤器函数不会修改查询。为了克服这个问题,在传递给函数的参数数组中将 suppress_filters 设置为 false。以下代码示例说明了这一点。

$posts = get_posts( array( 'suppress_filters' => FALSE ) );

是否观察到过滤器取决于您的插件代码,因此没有干净的方法来重写类别逻辑。您可能最好将标签用于您似乎需要的非分层语义。或者看看自定义分类

是以各种方式对各种项目进行分组的一种非常强大的方式。

于 2012-12-01T01:31:42.623 回答