如何过滤仅显示具有短码的帖子的后端帖子列表

时间:2014-03-04 作者:Matt

我需要通过某些短代码过滤管理面板中的帖子和页面表。在我的插件中,我在帖子和页面视图中添加了一列短代码,类似于“类别”和“标签”列,显示了每篇帖子中使用的短代码列表。现在,我希望能够单击列中的一个短代码,并让它将帖子或页面的列表筛选为仅使用该短代码的帖子或页面。

在我的自定义列中,我输出以下内容:<a href="?shortcode=my-shortcode-1">[my-shortcode-1]</a>, <a href="?shortcode=my-shortcode-2">[my-shortcode-2]</a>, ...

我只需要一个过滤器?shortcode=... 工作以下是我的基本想法,但我需要知道我可以使用什么钩子来实现这一点:

add_filter( \'manage_posts_row\', \'filter_by_shortcode\' ); // I made up this filter

function filter_by_shortcode(){

    global $post; // Get the current post

    if(!empty($_GET[\'shortcode\']){ // Check for ?shortcode=...

        // Check if given shortcode is used in the post
        if( has_shortcode( $post->post_content, $_GET[\'shortcode\'] )
            return $post; // Return post if shortcode is found

        // Return nothing if shortcode is not used

    }else{
        return $post; // Return post if ?shortcode=... argument is not used
    }

}
是否有一个钩子可以为“管理”面板中的“显示所有帖子/页面”表的每一行触发?或者有没有另一个过滤器可以连接?

2 个回复
最合适的回答,由SO网友:gmazzap 整理而成

恐怕这种钩子不存在。您有两个选项:

使用\'post_class\' 筛选挂钩,检查admin中是否存在,查询字符串是否包含短代码,如果存在,以及帖子是否没有添加该短代码hidden 通过core admin CSS设置为display: none. 通过这种方式,可以检索到没有短代码的帖子,但这些帖子是隐藏的\'posts_where\' 并使用添加SQL where子句REGEXP MySQL function 这样就不会检索帖子了,我更喜欢第二种解决方案,在我看来,它更优雅、性能更好,但可能是核心has_shortcode 函数比简单的SQL正则表达式更可靠。

解决方案1

add_filter( \'post_class\', \'filter_posts_by_shortcode_css\', 10, 3 );

function filter_posts_by_shortcode_css( $classes, $class, $postid ) {
  if ( is_admin() ) {
    $screen = get_current_screen();
    $sh = filter_input( INPUT_GET, \'shortcode\', FILTER_SANITIZE_STRING );
    if ( ! empty( $sh ) && $screen->base === \'edit\' ) {
      $post = get_post( $postid );
      if( ! has_shortcode( $post->post_content, $sh ) ) {
        $classes[] = \'hidden\';
      }
    }
  }
  return $classes;
}
溶液2
add_action(\'posts_where\', \'filter_posts_by_shortcode\');

function filter_posts_by_shortcode( $where ) {
  if ( is_admin() ) {
    $screen = get_current_screen();
    $sh = filter_input( INPUT_GET, \'shortcode\', FILTER_SANITIZE_STRING );
    if ( $screen->base === \'edit\' && ! empty( $sh ) && shortcode_exists( $sh ) ) {
      $where .= " AND post_content REGEXP \'\\\\\\[([[:blank:]]*)$sh([^\\\\\\[]*)\\\\\\]\'";
    }
  }
  return $where;
}
请注意,要使这两种解决方案都起作用,必须通过add_shortcode, 因此,如果您自己或第三方插件/主题注册了短代码,请确保它/它们/已在管理员屏幕中注册,然后再进行查询。

SO网友:Jonathan

使用此筛选器添加新列(http://codex.wordpress.org/Plugin_API/Filter_Reference/manage_posts_columns), 然后此筛选器将向其添加内容(http://codex.wordpress.org/Plugin_API/Action_Reference/manage_posts_custom_column) 使用其中的get\\u post($post\\u id),您可以搜索您的短代码。

结束

相关推荐

如何将一段代码放在DO_SHORTCODE()中的[Shortcode][/Shortcode]之间?

所以我想在一个“like lock”后面放一个帖子循环,该锁是由一个插件创建的,该插件使用短代码[to\\u like ID=“XX”]内容[[to\\u like]。但是我没有用插件阻止内容,而是得到了一个包含所有帖子永久链接的页面。所以我想我要问的是,如何将页面内容(即,显示帖子的模板中的循环)放在短代码中,使其被插件隐藏?这就是我现在得到的:foreach ( $posts as $post ) : setup_postdata( $post ); $content