在管理员列表上显示自定义帖子类型之间的层次关系

时间:2014-03-10 作者:Marc

我有两种自定义帖子类型:“请求”和“报价”。两者的“分层”标志都设置为true。

“请求”cpt可以是一个或多个“报价”cpt的父级。

由于这是两种不同的帖子类型,WordPress admin对这两种类型都有单独的概览列表(例如edit.php?post\\u type=request)。

我要寻找的是一种格式化请求概述的方法,与格式化分层页面列表的方法相同,例如:

请求1我只需要在管理端执行此操作(因为我不使用前端)。

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

WordPress处理分层帖子类型的方式是,帖子父级应该始终是相同的子级帖子类型。

因此,在管理屏幕中,post输入edit.php 是相当硬编码的。

然而,WordPress所做的是运行WP_Query 其中,“post\\u type”参数是当前参数。

那么,你能做什么?

首先,如果要合并2个cpt管理屏幕,可以隐藏“quote”的管理屏幕。很简单:注册post类型时,只需将“public”参数设置为false:

$args = array(
   // all other args here
  \'hierarchical\' => TRUE
  \'public\' => FALSE
);
register_post_type( \'quote\', $args );
这样,quote admin屏幕不会显示,因此您只有“request”屏幕。

您需要做的是拦截查询并设置\'post_type\' 数组的参数同时包含“request”和“quote”。

这样做的问题是,全局“post\\u type”变量将被设置为该数组,但WordPress期望“post\\u type”是一个字符串,最终会出现一些错误。为了避免这种错误,我们应该找到一个钩子来强制全局\'post_type\' 作为字符串“request”。

快速查看负责输出admin posts表的文件后:\'wp-admin/includes/class-wp-posts-list-table.php\' 我发现一个好的钩子适用范围可以是过滤器钩子\'edit_posts_per_page\'.

因此,代码:

add_action( \'pre_get_posts\', function( $query ) {
  if ( is_admin() ) { // do nothing if not is admin
    $scr = get_current_screen();
    // if in the right admin screen
    if ( $scr->base === \'edit\' && $scr->post_type === \'request\' ) {
      // force query to get both \'request\' and \'quote\' cpt
      $query->set( \'post_type\', array( \'request\', \'quote\' ) );
      // force global $post_type to be = \'request\' if is an array 
      add_filter( \'edit_posts_per_page\', function( $perpage ) {
        global $post_type;
        if ( is_array( $post_type ) && in_array( \'request\', $post_type ) ) {
          $post_type = \'request\';
        }
        return $perpage; // we don\'t want to affect $perpage value 
      } );
    }
  }
  return $query;
} );

结束

相关推荐

Cron在每次访问wp-admin时触发我的函数

这是我正在开发的一个MU插件,我希望它每小时运行一次。不幸的是,每次我访问任何网站的wp管理页面时,它都会运行。我将调试栏插件与Cron插件一起使用,它始终表示下一个事件已经过去。有什么想法吗?add_action(\'admin_menu\', \'dhg_cron_menu\'); function dhg_cron_menu() { add_options_page(\'NEW WPMS Stats\', \'NEW WPMS Stats\', \'manage-op