为WordPress自定义文章类型添加Disabled状态失效求替代方案
WordPress自定义文章类型实现仅直链访问、隐藏归档的解决方案
之前为项目类自定义文章类型编写的Disabled状态代码,现在部署到新站点后无法在编辑页面的可见性区域显示,且无法实现「仅直链访问、不在归档页面显示」的需求。以下是修复后的完整解决方案:
原代码问题分析
原代码仅注册了disabled状态,但缺少两个关键环节:
- 未将该状态添加到文章编辑页面的状态选择器中
- 参数设置不合理:
public设为false会导致前端无法通过直链访问该文章,和需求冲突
完整解决方案代码
1. 注册自定义文章状态
function register_project_disabled_status() { register_post_status('disabled', array( 'label' => _x('Disabled', 'project'), 'public' => true, // 允许前端访问 'publicly_queryable' => true, // 允许通过查询获取文章(直链访问依赖这个) 'exclude_from_search' => true, // 排除在搜索结果外 'show_in_admin_all_list' => true, // 后台文章列表显示该状态的文章 'show_in_admin_status_list' => true, // 后台状态筛选菜单显示 'label_count' => _n_noop('Disabled <span class="count">(%s)</span>', 'Disabled <span class="count">(%s)</span>'), 'capability_type' => 'post', // 匹配自定义文章类型的权限 )); } add_action('init', 'register_project_disabled_status');
2. 将Disabled状态添加到编辑页面的状态选择器
// 在文章编辑页面的状态下拉菜单中添加Disabled选项 function add_disabled_status_to_edit_page() { global $post; // 仅针对项目类自定义文章类型(替换为你的自定义文章类型slug,比如'project') if ($post->post_type !== 'project') return; $selected = ($post->post_status == 'disabled') ? 'selected="selected"' : ''; echo '<script> jQuery(document).ready(function(){ jQuery(\'#post-status-select\').append(\'<option value="disabled" '.$selected.'>Disabled</option>\'); }); </script>'; } add_action('admin_footer-post.php', 'add_disabled_status_to_edit_page'); add_action('admin_footer-post-new.php', 'add_disabled_status_to_edit_page'); // 在文章列表页面显示Disabled状态标签 function display_disabled_post_state($states) { global $post; if ($post->post_type === 'project' && $post->post_status == 'disabled') { $states[] = _x('Disabled', 'project'); } return $states; } add_filter('display_post_states', 'display_disabled_post_state'); // 添加状态更新后的提示消息 function disabled_status_updated_messages($messages) { global $post; if ($post->post_type === 'project') { $messages['project'][11] = __('Project marked as Disabled.', 'text-domain'); $messages['project'][12] = __('Project marked as Disabled.', 'text-domain'); } return $messages; } add_filter('post_updated_messages', 'disabled_status_updated_messages');
3. 从归档页面排除Disabled状态的文章
function exclude_disabled_projects_from_archives($query) { // 仅针对前端的归档查询,且是项目类自定义文章类型 if (!is_admin() && $query->is_main_query() && is_post_type_archive('project')) { $query->set('post_status', array('publish')); // 只显示已发布状态的文章 } return $query; } add_action('pre_get_posts', 'exclude_disabled_projects_from_archives');
注意事项
- 替换代码中的
'project'为你实际的自定义文章类型slug - 若需要在搜索结果中也排除这类文章,
exclude_from_search已经设为true,无需额外设置 - 测试时确保文章保存为
Disabled状态后,直接访问链接能打开,归档页面不显示该文章
内容的提问来源于stack exchange,提问作者Ovidiu Zeicu
相关产品推荐
相关产品推荐

