wp_admin_bar_new_content_menu()
云策文档标注
概述
wp_admin_bar_new_content_menu() 函数用于在 WordPress 管理工具栏中添加“新建”菜单,根据用户权限动态生成可创建的内容类型子菜单项。
关键要点
- 函数接受一个 WP_Admin_Bar 实例作为必需参数,用于操作管理工具栏节点。
- 通过 get_post_types() 获取支持在管理工具栏显示的自定义文章类型,并基于 current_user_can() 检查用户创建权限来构建菜单项。
- 默认处理文章、页面、附件和链接等标准类型,并循环添加其他自定义文章类型,确保菜单项 ID 唯一性以避免冲突。
- 在 Multisite 环境下,如果用户有 create_sites 权限,会添加“新建站点”子菜单项。
- 使用 WP_Admin_Bar::add_node() 方法添加父节点和子节点,设置标题、链接和元数据。
代码示例
function wp_admin_bar_new_content_menu( $wp_admin_bar ) {
$actions = array();
$cpts = (array) get_post_types( array( 'show_in_admin_bar' => true ), 'objects' );
if ( isset( $cpts['post'] ) && current_user_can( $cpts['post']->cap->create_posts ) ) {
$actions['post-new.php'] = array( $cpts['post']->labels->name_admin_bar, 'new-post' );
}
// 更多权限检查和菜单项添加逻辑...
if ( ! $actions ) {
return;
}
$title = '' . _x( 'New', 'admin bar menu group label' ) . '';
$wp_admin_bar->add_node(
array(
'id' => 'new-content',
'title' => $title,
'href' => admin_url( current( array_keys( $actions ) ) ),
'meta' => array(
'menu_title' => _x( 'New', 'admin bar menu group label' ),
),
)
);
foreach ( $actions as $link => $action ) {
list( $title, $id ) = $action;
$wp_admin_bar->add_node(
array(
'parent' => 'new-content',
'id' => $id,
'title' => $title,
'href' => admin_url( $link ),
)
);
}
}注意事项
- 函数依赖于 WordPress 核心的权限系统和文章类型注册,确保自定义文章类型正确设置了 show_in_admin_bar 和 cap 属性。
- 在 Multisite 环境中,需注意网络管理员权限(如 create_sites)以显示“新建站点”选项。
- 菜单项链接使用 admin_url() 或 network_admin_url() 生成,确保路径正确。
原文内容
Adds “Add New” menu.
Parameters
$wp_admin_barWP_Admin_Barrequired-
The WP_Admin_Bar instance.
Source
function wp_admin_bar_new_content_menu( $wp_admin_bar ) {
$actions = array();
$cpts = (array) get_post_types( array( 'show_in_admin_bar' => true ), 'objects' );
if ( isset( $cpts['post'] ) && current_user_can( $cpts['post']->cap->create_posts ) ) {
$actions['post-new.php'] = array( $cpts['post']->labels->name_admin_bar, 'new-post' );
}
if ( isset( $cpts['attachment'] ) && current_user_can( 'upload_files' ) ) {
$actions['media-new.php'] = array( $cpts['attachment']->labels->name_admin_bar, 'new-media' );
}
if ( current_user_can( 'manage_links' ) ) {
$actions['link-add.php'] = array( _x( 'Link', 'add new from admin bar' ), 'new-link' );
}
if ( isset( $cpts['page'] ) && current_user_can( $cpts['page']->cap->create_posts ) ) {
$actions['post-new.php?post_type=page'] = array( $cpts['page']->labels->name_admin_bar, 'new-page' );
}
unset( $cpts['post'], $cpts['page'], $cpts['attachment'] );
// Add any additional custom post types.
foreach ( $cpts as $cpt ) {
if ( ! current_user_can( $cpt->cap->create_posts ) ) {
continue;
}
$key = 'post-new.php?post_type=' . $cpt->name;
$actions[ $key ] = array( $cpt->labels->name_admin_bar, 'new-' . $cpt->name );
}
// Avoid clash with parent node and a 'content' post type.
if ( isset( $actions['post-new.php?post_type=content'] ) ) {
$actions['post-new.php?post_type=content'][1] = 'add-new-content';
}
if ( current_user_can( 'create_users' ) || ( is_multisite() && current_user_can( 'promote_users' ) ) ) {
$actions['user-new.php'] = array( _x( 'User', 'add new from admin bar' ), 'new-user' );
}
if ( ! $actions ) {
return;
}
$title = '<span class="ab-icon" aria-hidden="true"></span><span class="ab-label">' . _x( 'New', 'admin bar menu group label' ) . '</span>';
$wp_admin_bar->add_node(
array(
'id' => 'new-content',
'title' => $title,
'href' => admin_url( current( array_keys( $actions ) ) ),
'meta' => array(
'menu_title' => _x( 'New', 'admin bar menu group label' ),
),
)
);
foreach ( $actions as $link => $action ) {
list( $title, $id ) = $action;
$wp_admin_bar->add_node(
array(
'parent' => 'new-content',
'id' => $id,
'title' => $title,
'href' => admin_url( $link ),
)
);
}
if ( is_multisite() && current_user_can( 'create_sites' ) ) {
$wp_admin_bar->add_node(
array(
'parent' => 'new-content',
'id' => 'add-new-site',
'title' => _x( 'Site', 'add new from admin bar' ),
'href' => network_admin_url( 'site-new.php' ),
)
);
}
}