如何让自定义状态Expired的自定义文章显示在后台全部列表中
自定义文章状态无法在后台“全部”列表显示的解决办法
问题原因
你用Pods创建的job_posting自定义文章类型,添加的expired状态文章只在单独的状态列表里显示,“全部”列表看不到,主要是因为:
- 注册状态时
public设为false,WordPress默认后台查询不会包含非公开状态的文章 - 虽然你设置了
show_in_admin_all_list为true,但这个参数只是让状态选项显示,不会自动修改查询逻辑把该状态文章加入“全部”列表
修复步骤
1. 添加查询过滤逻辑
在你的functions.php里新增以下代码,让后台查询job_posting类型时,自动把expired状态纳入“全部”列表的查询范围:
function include_expired_in_job_posting_all_list( $query ) { // 只处理后台的job_posting主查询,且未指定特定状态(即“全部”列表) if ( is_admin() && $query->is_main_query() && $query->get( 'post_type' ) === 'job_posting' && !$query->get( 'post_status' ) ) { // 获取当前查询的状态集合,加入expired $statuses = $query->get( 'post_status' ); if ( is_array( $statuses ) ) { $statuses[] = 'expired'; } else { // 默认状态集合加上expired $statuses = array( 'publish', 'pending', 'draft', 'future', 'private', 'expired' ); } $query->set( 'post_status', $statuses ); } } add_action( 'pre_get_posts', 'include_expired_in_job_posting_all_list' );
2. 简化状态显示函数(可选优化)
你原来的display_archive_state函数里的JS代码可以删掉,因为查询修复后状态会自动显示,简化后的函数更简洁:
function display_archive_state( $states ) { global $post; if ( $post->post_type === 'job_posting' && $post->post_status === 'expired' ) { $states[] = 'Expired'; } return $states; } add_filter( 'display_post_states', 'display_archive_state' );
为什么这样有效
pre_get_posts钩子会在WordPress执行数据库查询前触发,我们在这里精准判断:只有在后台浏览job_posting的“全部”列表时,才把expired状态加入查询的状态列表,这样既不会影响前台显示(因为public还是false),又能让后台“全部”列表展示所有状态的文章。
内容的提问来源于stack exchange,提问作者Nikolai
相关产品推荐
相关产品推荐

