将此PHP函数应用于插件?

时间:2012-11-30 23:52:30

标签: php wordpress function wordpress-plugin

我发现在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文件中,我会修改它并将其复制并粘贴到我的插件文件中,或者我将如何修改它?任何帮助将非常感谢! :)

1 个答案:

答案 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

  

是一种以各种方式对各种项目进行分组的极其强大的方法。