我发现在WordPress中有一种方法可以做到这一点:
假设您在名为“news-sub”的子类别下发布了一些内容,其父类别为“新闻”。通过deafult,wordpress post将在新闻和新闻子下发布,即使你只选择它发布在类别news-sub下。我已经找到了一种方法,当您选择仅在其子类别中发布帖子时,只会在其子类别中发布。以下是在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;
}
这段代码很棒。但是,它不适用于插件。例如......我有一个插件可以为您选择的类别发布缩略图和标题。假设我选择它只显示“新闻”类别..如果我在“news-sub”类别下发布了一些内容,它仍会通过插件显示,无论我之前提到的功能代码如何。我尝试将功能代码复制并粘贴到插件中,但它不起作用。 :(
那么,我如何使用此功能来处理显示类别的插件?我会修改它并将其保留在functions.php文件中,我会修改它并将其复制并粘贴到我的插件文件中,或者我将如何修改它?任何帮助将非常感谢! :)
答案 0 :(得分:1)
您所描述的行为是绝对可取的。 Categories are hierarchical,因此父类别应包含子类别及其帖子。
您的posts_where
过滤器正在尝试将行为更改为更像标签。但有些功能如get_posts()
do not run these filters:
某些检索帖子的函数不会运行过滤器,因此您附加的posts_where过滤器函数不会修改查询。要解决此问题,请在传递给函数的参数数组中将suppress_filters设置为false。以下代码示例说明了这一点。
$posts = get_posts( array( 'suppress_filters' => FALSE ) );
如果观察到过滤器,则取决于您的插件代码,因此没有干净的方法来重写类别逻辑。对于您似乎需要的非分层语义,最好使用标记。或者查看custom taxonomies
是一种以各种方式对各种项目进行分组的极其强大的方法。