函数文档

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' ),
			)
		);
	}
}

Changelog

Version Description
6.5.0 Added a New Site link for network installations.
3.1.0 Introduced.