You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 05:53:19