WordPress 7.2 将后台栏与菜单图标改为内联 SVG
SVG icons in the admin bar and menu in WordPress 7.2
WordPress 7.2 Beta 将后台栏和菜单中的核心图标从 Dashicons 字体字形改为 @wordpress/icons 内联 SVG,大多数插件和主题无需调整,但修改图标颜色、隐藏或替换逻辑的 CSS 与 PHP 可能需要更新。
文章梳理了 WordPress 7.2 后台图标改为 SVG 后的兼容变化,并为颜色、隐藏、替换图标及兼容旧版本提供可迁移的代码方案。
你可能已经注意到 WordPress 7.2 Beta 管理界面中闪亮的新图标。正如之前在 Replacing Dashicons in the admin bar and menu 中宣布的那样,管理栏和菜单中的图标现在采用来自 @wordpress/icons 的内联 SVG。此前,它们是通过 CSS ::before 绘制的 Dashicons 字体字形。
大多数插件和主题无需更改。注册菜单页面和管理栏节点时,无论是否使用 Dashicons,均可照常工作。不过,诸如管理配色方案和管理主题之类的 CSS 可能需要稍作更新。如果你的插件修改了核心图标,也可能需要更新。
如果你的插件或主题未修改核心管理栏或菜单图标,可以直接跳到下方的 新 API 部分。
- 需要更新:配色方案
- 需要更新:核心图标修改
- 保持不变的功能
- 使用 SVG 图标的新 API
- 支持更早的 WordPress 版本
- 附录:HTML 标记变化
需要更新:配色方案
此前所有通过 ::before 设置核心图标样式的 CSS 规则,现在都无法再为这些图标设置样式,因为它们已成为内联 SVG 元素。
如果你的配色方案通过 ::before 为图标着色,为了向后兼容,WordPress 会使用以下尽力而为的规则,在更新之前保持这些颜色:
- 侧边栏菜单:图标会使用你传递给
wp_admin_css_color()的图标颜色,并以菜单文字颜色作为后备。 - 管理栏:如果你使用 SASS 根据核心的
_admin.scss生成样式表,那么它已经会为.ab-icon元素着色(幸运的是),因此图标能够保留预期颜色。
否则,图标会使用核心的默认颜色,而这些颜色可能并非你预期的颜色。要彻底修复你的配色方案,请在样式表中通过 ::before 为图标着色的地方,也同时为该元素着色。SVG 将继承该元素的颜色。对于为 .ab-item::before 设置颜色的规则,也请为 .ab-icon 设置颜色。
/* Before */
#adminmenu div.wp-menu-image::before { color: #c3c4c7; }
#wpadminbar li:hover .ab-icon::before { color: #72aee6; }
#wpadminbar #wp-admin-bar-site-name > .ab-item::before { color: #c3c4c7; }/* After (works on 7.2 and earlier versions) */
#adminmenu div.wp-menu-image,
#adminmenu div.wp-menu-image::before { color: #c3c4c7; }
#wpadminbar li:hover .ab-icon,
#wpadminbar li:hover .ab-icon::before { color: #72aee6; }
#wpadminbar #wp-admin-bar-site-name > .ab-item .ab-icon,
#wpadminbar #wp-admin-bar-site-name > .ab-item::before { color: #c3c4c7; }请对相应的悬停、聚焦、当前和展开状态,以及 .mobile 规则执行同样的操作。上面的规则仅供参考。
需要更新:核心图标修改
CSS:隐藏核心图标
通过 ::before 隐藏图标已不再起作用,因为图标现在是一个元素。请同时隐藏该元素。
/* Before */
#adminmenu #menu-comments div.wp-menu-image::before { display: none; }
#wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon::before { display: none; }
#wpadminbar #wp-admin-bar-edit > .ab-item::before { display: none; }/* After (works on 7.2 and earlier versions) */
#adminmenu #menu-comments div.wp-menu-image::before,
#adminmenu #menu-comments div.wp-menu-image svg { display: none; }
#wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon { display: none; }
#wpadminbar #wp-admin-bar-edit > .ab-item::before,
#wpadminbar #wp-admin-bar-edit > .ab-item .ab-icon { display: none; }CSS:使用图片替换核心图标
将背景图片设置到字形上并使字形透明的样式,过去依赖核心的 content 来创建该框。请自行设置 content 和尺寸。
/* Before */
#adminmenu #menu-posts div.wp-menu-image::before {
background-image: url(logo.png);
color: transparent;
}
#wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon::before {
background-image: url(logo.png);
color: transparent;
}/* After (works on 7.2 and earlier versions) */
#adminmenu #menu-posts div.wp-menu-image::before {
content: "";
background: url(logo.png) center / 20px 20px no-repeat;
}
#wpadminbar #wp-admin-bar-wp-logo > .ab-item .ab-icon::before {
content: "";
display: inline-block;
width: 20px;
height: 20px;
background: url(logo.png) center / contain no-repeat;
}CSS:通过 .ab-item::before 替换核心管理栏图标
这适用于过去使用 .ab-item::before 绘制图标的管理栏节点:edit、customize、site-editor、my-sites、site-name 和 my-account。图标现在是一个独立的 .ab-icon 元素,因此设置在 .ab-item::before 上的 content 不再能够替换它。你的字形会被隐藏,取而代之的是显示核心图标。
要修复此问题,请在图标元素的 ::before 上也设置 content,该元素将取代核心图标。
/* Before */
#wpadminbar #wp-admin-bar-edit > .ab-item::before { content: "\f319"; }/* After (works on 7.2 and earlier versions) */
#wpadminbar #wp-admin-bar-edit > .ab-item::before,
#wpadminbar #wp-admin-bar-edit > .ab-item .ab-icon::before { content: "\f319"; }PHP:修改核心管理栏节点的标题或图标
某些核心节点的标题过去包含空的 <span class="ab-icon">,用于绘制图标。现在,这些节点以及其他核心管理栏节点都不再包含该空 span,而是使用新的 icon 参数设置图标。但 wp-logo 除外,其标题本身包含徽标图标。例如:
$wp_admin_bar->get_node( 'new-content' )->title:- 过去:
<span class="ab-icon" aria-hidden="true"></span><span class="ab-label">New</span> - 现在:
<span class="ab-label">New</span>
- 过去:
$wp_admin_bar->get_node( 'wp-logo' )->title:- 过去:
<span class="ab-icon" aria-hidden="true"></span><span class="screen-reader-text">About WordPress</span>
现在:<span class="ab-icon svg-icon" aria-hidden="true"><svg …>…</svg></span><span class="screen-reader-text">About WordPress</span>
- 过去:
在这些标题中查找空 span 的代码将无法再找到它,需要进行更新。另请参阅下方“支持更早的 WordPress 版本”部分,了解如何修改可跨版本使用的管理栏节点。另请参阅附录,了解完整的标记变化。
CSS:为前台搜索图标、默认的“我的站点”网站图标或“折叠菜单”图标设置样式
这些图标的伪元素样式不再对其生效。请改为定位新元素。
/* Before */
#wpadminbar #adminbarsearch::before { color: red; }
#wpadminbar .quicklinks li div.blavatar::before { color: red; }
#collapse-button .collapse-button-icon::after { color: red; }/* After (works on 7.2 and earlier versions) */
#wpadminbar #adminbarsearch::before,
#wpadminbar #adminbarsearch .ab-icon { color: red; }
#wpadminbar .quicklinks li div.blavatar::before,
#wpadminbar .quicklinks li div.blavatar svg { color: red; }
#collapse-button .collapse-button-icon::after,
#collapse-button .collapse-button-icon svg { color: red; }CSS:通过 Dashicon 类定位菜单项
现在请改用该项的 id 或其 menu-icon-* 类。
/* Before */
#adminmenu .dashicons-admin-post::before { content: "\f319"; }/* After (works on 7.2 and earlier versions) */
#adminmenu .dashicons-admin-post::before { content: "\f319"; }
#adminmenu .menu-icon-post div.wp-menu-image::before { content: "\f319"; }请注意,旧的 Dashicon 类会匹配所有使用该 Dashicon 的菜单项,而 id 或 menu-icon-* 类只会匹配一个项目。
仍然有效的内容
为实现向后兼容,WordPress 无需修改即可继续支持最常见的自定义设置。
侧边栏菜单
- Existing core menu data is unchanged, including the
dashicons-*icon values. For example:get_post_type_object( 'post' )->menu_icon仍然是dashicons-admin-post。- 全局
$menu和 REST API 仍然保留相同的dashicons-*值。
- If a plugin uses Dashicon in
menu_iconand it has a matchingcore-adminicon, that SVG icon will be rendered instead. This includes post types with nomenu_icon, which default todashicons-admin-post.- 有关
core-admin集合的更多信息,请参阅下方的“新 API”部分。
- 有关
- 任何其他 Dashicon、图片 URL、base64 SVG 或
none值都会像以前一样呈现。 - 在
div.wp-menu-image上带有content的::before仍会替换图标,且不会显示 SVG。
管理栏
- 在所有核心节点上,在
.ab-icon上带有content的::before仍会替换图标。 - 第三方节点的呈现效果与以前完全相同。
使用 SVG 图标的新 API
如果你想在自己的侧边栏菜单项和管理栏节点中使用 SVG 图标,而不是 Dashicons,现在可以在注册菜单页面、文章类型和管理栏节点时传入已注册图标的名称。
要使用哪些图标
你可以使用核心 core-admin 集合中的图标。图标添加到 core-admin 后,其名称不会更改,也不会被移除。你可以在 Storybook 的图标库中预览该集合。开发者插件的反馈将用于向 core-admin 添加更多图标。
请勿将 core 集合用于管理图标。它专为前端、内容和图标区块而设计。有些插件或主题可能需要注销 core 图标。
你也可以使用自己的图标。通过 wp_register_icon_collection() 和 wp_register_icon() 注册你自己的集合及其图标,然后以相同方式使用它们。
作为菜单图标的图标名称
除现有的 Dashicons、URL、base64 SVG 和 none 值之外,add_menu_page() 以及 register_post_type() 的 menu_icon 参数现在也接受已注册图标的命名空间名称。
add_menu_page(
__( 'Notes', 'my-plugin' ),
__( 'Notes', 'my-plugin' ),
'manage_options',
'my-plugin-notes',
'my_plugin_render_notes',
'core-admin/pin' // Now allowed: a registered icon name.
);管理栏节点的 icon 参数
WP_Admin_Bar::add_node() 现在接受 icon 参数,即已注册图标的命名空间名称。图标会呈现在标题之前。
add_action(
'admin_bar_menu',
function ( WP_Admin_Bar $wp_admin_bar ) {
$wp_admin_bar->add_node(
array(
'id' => 'my-plugin-notes',
'icon' => 'core-admin/pin',
'title' => __( 'Notes', 'my-plugin' ),
'href' => admin_url( 'admin.php?page=my-plugin-notes' ),
)
);
},
100
);在这两种情况下,未注册的名称不会呈现任何图标。启用 WP_DEBUG 时,还会触发 _doing_it_wrong() 通知。
wp_is_valid_icon_name()
一个新增的辅助函数,用于返回某个值是否具有命名空间图标名称(collection/icon-name)的形式。它不会检查图标是否已注册。
支持更早的 WordPress 版本
如果你的插件过去在管理菜单或管理栏中显示 Dashicon,并且希望继续支持更早的版本,请遵循以下说明。
这取决于你的 Dashicon 是否已在 core-admin 集合中有官方替代图标。请在清单中的此处查看图标替代映射。在 'dashicons' 键中搜索你的 Dashicon。
如果你的 Dashicon 在 7.2 中没有官方 core-admin 图标替代项,或你想使用自己的 SVG 图标
你仍然可以使用任何备选的 core-admin 图标或自己的 SVG 图标,但需要明确传入图标名称。
对于管理菜单(add_menu_page() 和 register_post_type()),由于更早的版本不支持图标名称,请使用 function_exists( 'wp_is_valid_icon_name' ) 进行条件控制。相比之下,管理栏节点的新参数在更早的版本中会被忽略,而标题中的空 span 在 7.2 中会被隐藏,因此你可以同时传入旧的 Dashicon 和新的 SVG 图标,如下所示。
add_menu_page(
...,
function_exists( 'wp_is_valid_icon_name' ) ? 'core-admin/receipt' : 'dashicons-text'
);
$wp_admin_bar->add_node(
array(
...
'title' => '<span class="ab-icon dashicons-text" aria-hidden="true"></span> My Node',
'icon' => 'core-admin/receipt',
)
);如果你的 Dashicon 在 7.2 中有官方 core-admin 图标替代项
从 7.2 开始,管理菜单图标将自动替换为 SVG 图标。不过,对于管理栏节点图标,你仍需明确传入映射后的图标名称。
add_menu_page(
...,
'dashicons-cart'
);
$wp_admin_bar->add_node(
array(
...
'title' => '<span class="ab-icon dashicons-cart" aria-hidden="true"></span> My Node',
'icon' => 'core-admin/cart',
)
);如果你的 Dashicon 在晚于 7.2 的版本中有官方的 core-admin 图标替代品
在未来版本中,WordPress 可能会向 core-admin 集合添加更多图标,并映射到更多 Dashicon。将来,如果注册了新的 core-admin 图标并希望使用它,你还需要进一步使用注册检查来限制它,如下所示。
$icon = 'dashicons-text'; // for < 7.2
if ( function_exists( 'wp_is_valid_icon_name' ) ) {
$registry = WP_Icons_Registry::get_instance();
if ( $registry->is_registered( 'core-admin/invoice' ) ) {
$icon = 'core-admin/invoice'; // for > 7.2 (as an example)
} elseif ( $registry->is_registered( 'core-admin/receipt' ) ) {
$icon = 'core-admin/receipt'; // for 7.2
}
}
add_menu_page(
...,
$icon
);
$wp_admin_bar->add_node(
array(
...
'title' => '<span class="ab-icon dashicons-text" aria-hidden="true"></span> My Node',
'icon' => $icon,
)
);附录:HTML 标记变更
本附录展示了每个图标的标记和 CSS 是如何变化的,适用于直接针对这些图标编写的代码。
显示标记变更
侧边栏菜单项
核心顶级菜单项所用的十二个 Dashicon 现在以内联 SVG 形式绘制:Dashboard、Posts、Media、Links、Pages、Comments、Appearance、Plugins、Users、Tools、Settings,以及(在网络管理中)Sites。折叠菜单按钮的箭头也是如此。
使用这十二个 Dashicon 之一的菜单项,例如 Posts:
<!-- Before 7.2 -->
<div class='wp-menu-image dashicons-before dashicons-admin-post' aria-hidden='true'><br /></div>
.dashicons-admin-post::before { content: "\f109"; }<!-- In 7.2 -->
<div class='wp-menu-image dashicons-before svg-icon' aria-hidden='true'><svg …>…</svg></div>图标颜色现在设置在 div.wp-menu-image 上,并通过 currentColor 继承到 SVG。
折叠菜单按钮:
<!-- Before 7.2 -->
<span class="collapse-button-icon" aria-hidden="true"></span>
#collapse-button .collapse-button-icon::after { content: "\f148"; }<!-- In 7.2 -->
<span class="collapse-button-icon" aria-hidden="true"><svg …>…</svg></span>管理栏节点
在 7.2 之前,大多数核心节点的图标会绘制在 .ab-item::before 或 .ab-icon::before 上。搜索图标和默认站点图标各有自己的规则。现在,它们全部以内联 SVG 形式绘制。
.ab-item::before 上的图标: edit、customize、site-editor、my-sites、site-name,以及没有头像时的 my-account。
<!-- Before 7.2 -->
<a class='ab-item' href='…'>Edit Post</a>
#wpadminbar #wp-admin-bar-edit > .ab-item::before { content: "\f464"; }<!-- In 7.2 -->
<a class='ab-item' href='…'><span class="ab-icon svg-icon" aria-hidden="true"><svg …>…</svg></span>Edit Post</a>.ab-icon::before 上的图标,其中在 7.2 之前,span 是节点标题的一部分:wp-logo、menu-toggle、command-palette、new-content、comments 和 updates。在 7.2 中,除了 wp-logo 之外,该 span 不再位于标题中,图标会根据 icon 参数呈现。
<!-- Before 7.2 -->
<a class='ab-item' href='…'><span class="ab-icon" aria-hidden="true"></span><span class="ab-label">New</span></a>
#wpadminbar #wp-admin-bar-new-content .ab-icon::before { content: "\f132"; }<!-- In 7.2 -->
<a class='ab-item' href='…'><span class="ab-icon svg-icon" aria-hidden="true"><svg …>…</svg></span><span class="ab-label">New</span></a>搜索,在前端:
<!-- Before 7.2 -->
<form id="adminbarsearch" …><input …>…</form>
#wpadminbar #adminbarsearch::before { content: "\f179"; }<!-- In 7.2 -->
<form id="adminbarsearch" …><span class="ab-icon svg-icon" aria-hidden="true"><svg …>…</svg></span><input …>…</form>“我的站点”列表中的默认站点图标:
<!-- Before 7.2 -->
<div class="blavatar"></div>
#wpadminbar .quicklinks li div.blavatar::before { content: "\f120"; }<!-- In 7.2 -->
<div class="blavatar"><svg …>…</svg></div>图标颜色现在设置在 .ab-icon 上,默认站点图标则设置在 div.blavatar 上,并通过 currentColor 继承到 SVG。
感谢 @audrasjb、@peterwilsoncc、@mcsf 和 @wildworks 审阅此开发说明。
#7-2、#dev-notes、#dev-notes-7-2
来源:Make WordPress Core(核心开发) · https://make.wordpress.org/core/2026/11/05/svg-icons-in-the-admin-bar-and-menu-in-wordpress-7-2/
部分链接为推广/关联链接。