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;
} );