将自定义文章类型设为WordPress子菜单时,添加新项选项不显示
解决WordPress自定义文章类型作为子菜单时“添加新项”不显示的问题
我看了你的代码,问题出在两个地方:自定义文章类型的注册配置,以及子菜单的添加方式。下面一步步帮你解决:
问题分析
- 你注册自定义文章类型时设置了
'show_in_menu' => false,这本身没问题,但手动添加子菜单的方式不对——直接用edit.php?post_type=shortcode作为子菜单slug,WordPress无法识别这是一个自定义文章类型的列表页,因此不会自动生成对应的“添加新项”子菜单。 - 另外,虽然
public => true会默认开启show_ui,但显式声明能避免潜在的配置冲突。
解决方案(推荐第一种)
方法一:让WordPress自动生成子菜单(最省心)
修改自定义文章类型的注册代码,把show_in_menu的值设为主菜单的slug(也就是你定义的'options')。这样WordPress会自动帮你添加列表页和“添加新项”的子菜单,不需要手动写额外的add_submenu_page。
修改后的注册代码:
register_post_type( 'shortcode', array( 'labels' => array( 'name' => __( 'Shortcodes' ), 'singular_name' => __( 'Shortcode' ), // 可以补充标签让菜单更清晰 'add_new' => __( 'Add New Shortcode' ), 'add_new_item' => __( 'Add New Shortcode' ), ), 'public' => true, 'has_archive' => false, 'show_in_menu' => 'options', // 关联到你的主菜单slug 'supports' => array('title'), ) );
主菜单代码保留原样即可:
add_menu_page( 'Review', 'Review', 'manage_options', 'options', array( $this->option, 'render_options' ), 'dashicons-admin-page', 99 );
这样操作后,你的“Review”主菜单下会自动出现两个子菜单:Shortcodes(列表页)和Add New Shortcode(添加页),完全符合需求。
方法二:手动添加所有子菜单(自定义菜单名称时用)
如果你想自定义子菜单的名称(比如把列表页叫Link),可以手动添加两个子菜单:一个是自定义文章类型的列表页,另一个是添加新项的页面。
首先修改自定义文章类型注册代码,确保show_ui开启:
register_post_type( 'shortcode', array( 'labels' => array( 'name' => __( 'Shortcodes' ), 'singular_name' => __( 'Shortcode' ), ), 'public' => true, 'has_archive' => false, 'show_in_menu' => false, 'show_ui' => true, // 显式开启后台UI 'supports' => array('title'), ) );
然后修改菜单代码,添加两个子菜单:
add_menu_page( 'Review', 'Review', 'manage_options', 'options', array( $this->option, 'render_options' ), 'dashicons-admin-page', 99 ); // 添加自定义文章类型列表页 add_submenu_page( 'options', 'Link', // 页面标题 'Link', // 菜单显示名称 'manage_options', 'edit.php?post_type=shortcode' ); // 添加“添加新项”子菜单 add_submenu_page( 'options', 'Add New Link', // 页面标题 'Add New', // 菜单显示名称 'manage_options', 'post-new.php?post_type=shortcode' );
这样就能手动控制子菜单的名称,同时显示“添加新项”选项。
补充说明
- 权限方面,你用的
manage_options是管理员级别的权限,如果需要让编辑等角色也能访问,可以换成edit_posts这类更宽松的权限(根据你的需求调整)。 - 自定义文章类型的
labels可以补充更多内容,让后台界面更友好,比如all_items、edit_item等,让操作逻辑更清晰。
内容的提问来源于stack exchange,提问作者Prits
相关产品推荐
相关产品推荐

