From a025ceb25406d938188b47c127346554ad02e153 Mon Sep 17 00:00:00 2001 From: "Stephen A. Bernhardt" Date: Wed, 4 Mar 2026 13:52:20 -0600 Subject: [PATCH 01/13] Add `wp_admin_bar_command_palette_menu()` --- src/wp-includes/admin-bar.php | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/wp-includes/admin-bar.php b/src/wp-includes/admin-bar.php index 9fc3c2b46b348..4acf0aad3eddf 100644 --- a/src/wp-includes/admin-bar.php +++ b/src/wp-includes/admin-bar.php @@ -1207,6 +1207,37 @@ function wp_admin_bar_search_menu( $wp_admin_bar ) { ); } +/** + * Adds a link to open the command palette. + * + * @since 7.0.0 + * + * @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance. + */ +function wp_admin_bar_command_palette_menu( $wp_admin_bar ) { + if ( ! is_admin() || ! current_user_can( 'edit_posts' ) ) { + return; + } + + $title = '' . + /* translators: Hidden accessibility text. */ + __( 'Open command palette' ) . + ''; + + $wp_admin_bar->add_node( + array( + 'parent' => 'top-secondary', + 'id' => 'command-palette', + 'title' => $title, + 'href' => '#', + 'meta' => array( + 'class' => 'hide-if-no-js', + 'onclick' => 'wp.data.dispatch( "core/commands" ).open(); return false;', + ), + ) + ); +} + /** * Adds a link to exit recovery mode when Recovery Mode is active. * From f14b75f25a8e8058c71641c2b75802ca24a7707f Mon Sep 17 00:00:00 2001 From: "Stephen A. Bernhardt" Date: Wed, 4 Mar 2026 13:54:13 -0600 Subject: [PATCH 02/13] Add node at same priority as Search --- src/wp-includes/class-wp-admin-bar.php | 1 + 1 file changed, 1 insertion(+) diff --git a/src/wp-includes/class-wp-admin-bar.php b/src/wp-includes/class-wp-admin-bar.php index dfebbb20e4c86..1965e8451139b 100644 --- a/src/wp-includes/class-wp-admin-bar.php +++ b/src/wp-includes/class-wp-admin-bar.php @@ -651,6 +651,7 @@ public function add_menus() { add_action( 'admin_bar_menu', 'wp_admin_bar_my_account_item', 9991 ); add_action( 'admin_bar_menu', 'wp_admin_bar_recovery_mode_menu', 9992 ); add_action( 'admin_bar_menu', 'wp_admin_bar_search_menu', 9999 ); + add_action( 'admin_bar_menu', 'wp_admin_bar_command_palette_menu', 9999 ); // Site-related. add_action( 'admin_bar_menu', 'wp_admin_bar_sidebar_toggle', 0 ); From 3c4b6dcd6aadc4309dfa6aeb6c6ab61c43736840 Mon Sep 17 00:00:00 2001 From: "Stephen A. Bernhardt" Date: Wed, 4 Mar 2026 13:57:07 -0600 Subject: [PATCH 03/13] Add icon and adjust margin, etc. --- src/wp-includes/css/admin-bar.css | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/src/wp-includes/css/admin-bar.css b/src/wp-includes/css/admin-bar.css index 5ccc76177188c..806083eacc48f 100644 --- a/src/wp-includes/css/admin-bar.css +++ b/src/wp-includes/css/admin-bar.css @@ -698,6 +698,24 @@ html:lang(he-il) .rtl #wpadminbar * { display: none; } +/** + * Command Palette + */ +#wpadminbar #wp-admin-bar-command-palette .ab-item { + padding-right: 4px; +} + +#wpadminbar #wp-admin-bar-command-palette .ab-icon { + margin: 0; +} + +#wpadminbar #wp-admin-bar-command-palette .ab-icon:before { + content: "\f179"; + content: "\f179" / ''; + top: 2px; + left: -2px; +} + /** * Customize support classes */ From 00239f23a6320957b5f9bba0ecea49db9a7cce0d Mon Sep 17 00:00:00 2001 From: "Stephen A. Bernhardt" Date: Wed, 4 Mar 2026 13:58:01 -0600 Subject: [PATCH 04/13] Hide list item if the command palette is unavailable --- src/js/_enqueues/lib/admin-bar.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/js/_enqueues/lib/admin-bar.js b/src/js/_enqueues/lib/admin-bar.js index eb18c61f8b5b8..c7637bfdba211 100644 --- a/src/js/_enqueues/lib/admin-bar.js +++ b/src/js/_enqueues/lib/admin-bar.js @@ -19,6 +19,7 @@ allMenuItems, adminBarLogout, adminBarSearchForm, + adminBarCommandPalette, shortlink, skipLink, mobileEvent, @@ -33,6 +34,7 @@ allMenuItems = adminBar.querySelectorAll( '.ab-item' ); adminBarLogout = document.querySelector( '#wp-admin-bar-logout a' ); adminBarSearchForm = document.getElementById( 'adminbarsearch' ); + adminBarCommandPalette = document.getElementById( 'wp-admin-bar-command-palette' ); shortlink = document.getElementById( 'wp-admin-bar-get-shortlink' ); skipLink = adminBar.querySelector( '.screen-reader-shortcut' ); mobileEvent = /Mobile\/.+Safari/.test( navigator.userAgent ) ? 'touchstart' : 'click'; @@ -40,6 +42,11 @@ // Remove nojs class after the DOM is loaded. removeClass( adminBar, 'nojs' ); + // Hide command palette if not supported. + if ( adminBarCommandPalette && ( ! wp.data || ! wp.data.dispatch( "core/commands" ) ) ) { + addClass( adminBarCommandPalette, 'hidden' ); + } + if ( 'ontouchstart' in window ) { // Remove hover class when the user touches outside the menu items. document.body.addEventListener( mobileEvent, function( e ) { From 14b56bf91cf84c822e9c9cb1451ae06bb119abdf Mon Sep 17 00:00:00 2001 From: "Stephen A. Bernhardt" Date: Wed, 4 Mar 2026 14:10:15 -0600 Subject: [PATCH 05/13] Add type and return --- src/wp-includes/admin-bar.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/admin-bar.php b/src/wp-includes/admin-bar.php index 4acf0aad3eddf..320b2f4c0b701 100644 --- a/src/wp-includes/admin-bar.php +++ b/src/wp-includes/admin-bar.php @@ -1214,7 +1214,7 @@ function wp_admin_bar_search_menu( $wp_admin_bar ) { * * @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance. */ -function wp_admin_bar_command_palette_menu( $wp_admin_bar ) { +function wp_admin_bar_command_palette_menu( WP_Admin_Bar $wp_admin_bar ): void { if ( ! is_admin() || ! current_user_can( 'edit_posts' ) ) { return; } From e57dcbb3eacb4f28b08729ff9a326d74709243c9 Mon Sep 17 00:00:00 2001 From: "Stephen A. Bernhardt" Date: Wed, 4 Mar 2026 14:45:23 -0600 Subject: [PATCH 06/13] single quotes in `admin-bar.js` --- src/js/_enqueues/lib/admin-bar.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/js/_enqueues/lib/admin-bar.js b/src/js/_enqueues/lib/admin-bar.js index c7637bfdba211..29d15add60dd8 100644 --- a/src/js/_enqueues/lib/admin-bar.js +++ b/src/js/_enqueues/lib/admin-bar.js @@ -43,7 +43,7 @@ removeClass( adminBar, 'nojs' ); // Hide command palette if not supported. - if ( adminBarCommandPalette && ( ! wp.data || ! wp.data.dispatch( "core/commands" ) ) ) { + if ( adminBarCommandPalette && ( ! wp.data || ! wp.data.dispatch( 'core/commands' ) ) ) { addClass( adminBarCommandPalette, 'hidden' ); } From e35f13b48a88c83081fa7d1a3abee727e1902eec Mon Sep 17 00:00:00 2001 From: "Stephen A. Bernhardt" Date: Thu, 5 Mar 2026 08:51:10 -0600 Subject: [PATCH 07/13] Revert JS edits --- src/js/_enqueues/lib/admin-bar.js | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/js/_enqueues/lib/admin-bar.js b/src/js/_enqueues/lib/admin-bar.js index 29d15add60dd8..eb18c61f8b5b8 100644 --- a/src/js/_enqueues/lib/admin-bar.js +++ b/src/js/_enqueues/lib/admin-bar.js @@ -19,7 +19,6 @@ allMenuItems, adminBarLogout, adminBarSearchForm, - adminBarCommandPalette, shortlink, skipLink, mobileEvent, @@ -34,7 +33,6 @@ allMenuItems = adminBar.querySelectorAll( '.ab-item' ); adminBarLogout = document.querySelector( '#wp-admin-bar-logout a' ); adminBarSearchForm = document.getElementById( 'adminbarsearch' ); - adminBarCommandPalette = document.getElementById( 'wp-admin-bar-command-palette' ); shortlink = document.getElementById( 'wp-admin-bar-get-shortlink' ); skipLink = adminBar.querySelector( '.screen-reader-shortcut' ); mobileEvent = /Mobile\/.+Safari/.test( navigator.userAgent ) ? 'touchstart' : 'click'; @@ -42,11 +40,6 @@ // Remove nojs class after the DOM is loaded. removeClass( adminBar, 'nojs' ); - // Hide command palette if not supported. - if ( adminBarCommandPalette && ( ! wp.data || ! wp.data.dispatch( 'core/commands' ) ) ) { - addClass( adminBarCommandPalette, 'hidden' ); - } - if ( 'ontouchstart' in window ) { // Remove hover class when the user touches outside the menu items. document.body.addEventListener( mobileEvent, function( e ) { From 0cda9e4834a391637b9917f46e1d63ed9d829cb2 Mon Sep 17 00:00:00 2001 From: "Stephen A. Bernhardt" Date: Thu, 5 Mar 2026 08:51:13 -0600 Subject: [PATCH 08/13] Check if script is enqueued, add shortcut --- src/wp-includes/admin-bar.php | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/wp-includes/admin-bar.php b/src/wp-includes/admin-bar.php index 320b2f4c0b701..e8f78ed193ca0 100644 --- a/src/wp-includes/admin-bar.php +++ b/src/wp-includes/admin-bar.php @@ -1215,14 +1215,20 @@ function wp_admin_bar_search_menu( $wp_admin_bar ) { * @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance. */ function wp_admin_bar_command_palette_menu( WP_Admin_Bar $wp_admin_bar ): void { - if ( ! is_admin() || ! current_user_can( 'edit_posts' ) ) { + if ( ! is_admin() || ! wp_script_is( 'wp-core-commands', 'enqueued' ) ) { return; } - $title = '' . + $is_apple_os = (bool) preg_match( '/Macintosh|Mac OS X|Mac_PowerPC/i', $_SERVER['HTTP_USER_AGENT'] ?? '' ); + $shortcut_label = $is_apple_os + ? _x( '⌘K', 'keyboard shortcut to open the command palette' ) + : _x( 'Ctrl+K', 'keyboard shortcut to open the command palette' ); + $title = sprintf( + '%s %s', + $shortcut_label, /* translators: Hidden accessibility text. */ - __( 'Open command palette' ) . - ''; + __( 'Open command palette' ), + ); $wp_admin_bar->add_node( array( From 61b4f8331901bee2d93a4a615b72362df70b57ff Mon Sep 17 00:00:00 2001 From: "Stephen A. Bernhardt" Date: Thu, 5 Mar 2026 08:51:45 -0600 Subject: [PATCH 09/13] Edit padding and show on mobile --- src/wp-includes/css/admin-bar.css | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/wp-includes/css/admin-bar.css b/src/wp-includes/css/admin-bar.css index 806083eacc48f..e73a3d49a03ce 100644 --- a/src/wp-includes/css/admin-bar.css +++ b/src/wp-includes/css/admin-bar.css @@ -701,10 +701,6 @@ html:lang(he-il) .rtl #wpadminbar * { /** * Command Palette */ -#wpadminbar #wp-admin-bar-command-palette .ab-item { - padding-right: 4px; -} - #wpadminbar #wp-admin-bar-command-palette .ab-icon { margin: 0; } @@ -892,7 +888,8 @@ html:lang(he-il) .rtl #wpadminbar * { #wpadminbar #wp-admin-bar-site-editor > .ab-item, #wpadminbar #wp-admin-bar-customize > .ab-item, #wpadminbar #wp-admin-bar-edit > .ab-item, - #wpadminbar #wp-admin-bar-my-account > .ab-item { + #wpadminbar #wp-admin-bar-my-account > .ab-item, + #wpadminbar #wp-admin-bar-command-palette > .ab-item { text-indent: 100%; white-space: nowrap; overflow: hidden; @@ -914,7 +911,8 @@ html:lang(he-il) .rtl #wpadminbar * { #wpadminbar #wp-admin-bar-site-name > .ab-item:before, #wpadminbar #wp-admin-bar-site-editor > .ab-item:before, #wpadminbar #wp-admin-bar-customize > .ab-item:before, - #wpadminbar #wp-admin-bar-my-account > .ab-item:before { + #wpadminbar #wp-admin-bar-my-account > .ab-item:before, + #wpadminbar #wp-admin-bar-command-palette .ab-icon:before { display: block; text-indent: 0; font: normal 32px/1 dashicons; @@ -925,6 +923,10 @@ html:lang(he-il) .rtl #wpadminbar * { -moz-osx-font-smoothing: grayscale; } + #wpadminbar #wp-admin-bar-command-palette .ab-icon:before { + left: 0; + } + #wpadminbar #wp-admin-bar-appearance { margin-top: 0; } @@ -1062,7 +1064,8 @@ html:lang(he-il) .rtl #wpadminbar * { #wpadminbar #wp-admin-bar-comments, #wpadminbar #wp-admin-bar-new-content, #wpadminbar #wp-admin-bar-edit, - #wpadminbar #wp-admin-bar-my-account { + #wpadminbar #wp-admin-bar-my-account, + #wpadminbar li#wp-admin-bar-command-palette { position: static; } From ff647d6c0fa1c563f733ef8c828dac6e8e552712 Mon Sep 17 00:00:00 2001 From: "Stephen A. Bernhardt" Date: Thu, 5 Mar 2026 09:01:13 -0600 Subject: [PATCH 10/13] Edit mobile styles --- src/wp-includes/css/admin-bar.css | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/css/admin-bar.css b/src/wp-includes/css/admin-bar.css index e73a3d49a03ce..1f83876ff7542 100644 --- a/src/wp-includes/css/admin-bar.css +++ b/src/wp-includes/css/admin-bar.css @@ -1033,7 +1033,8 @@ html:lang(he-il) .rtl #wpadminbar * { #wpadminbar li#wp-admin-bar-new-content, #wpadminbar li#wp-admin-bar-edit, #wpadminbar li#wp-admin-bar-comments, - #wpadminbar li#wp-admin-bar-my-account { + #wpadminbar li#wp-admin-bar-my-account, + #wpadminbar li#wp-admin-bar-command-palette { display: block; } @@ -1065,7 +1066,7 @@ html:lang(he-il) .rtl #wpadminbar * { #wpadminbar #wp-admin-bar-new-content, #wpadminbar #wp-admin-bar-edit, #wpadminbar #wp-admin-bar-my-account, - #wpadminbar li#wp-admin-bar-command-palette { + #wpadminbar #wp-admin-bar-command-palette { position: static; } From debed0ad7e6270e57cc84bf746f18b29654a30d0 Mon Sep 17 00:00:00 2001 From: "Stephen A. Bernhardt" Date: Thu, 5 Mar 2026 09:08:36 -0600 Subject: [PATCH 11/13] Remove background for `kbd` element --- src/wp-includes/css/admin-bar.css | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/wp-includes/css/admin-bar.css b/src/wp-includes/css/admin-bar.css index 1f83876ff7542..4683cfe5363cb 100644 --- a/src/wp-includes/css/admin-bar.css +++ b/src/wp-includes/css/admin-bar.css @@ -712,6 +712,10 @@ html:lang(he-il) .rtl #wpadminbar * { left: -2px; } +#wpadminbar #wp-admin-bar-command-palette kbd { + background: transparent; +} + /** * Customize support classes */ From 9fccde9bfae4b8eea1f6453f1e5486d303f16f2f Mon Sep 17 00:00:00 2001 From: "Stephen A. Bernhardt" Date: Wed, 11 Mar 2026 03:12:23 -0500 Subject: [PATCH 12/13] Update node --- src/wp-includes/admin-bar.php | 55 +++++++---------------------------- 1 file changed, 10 insertions(+), 45 deletions(-) diff --git a/src/wp-includes/admin-bar.php b/src/wp-includes/admin-bar.php index 4d3700d2b29c6..4a1fd0529dcf5 100644 --- a/src/wp-includes/admin-bar.php +++ b/src/wp-includes/admin-bar.php @@ -935,9 +935,9 @@ function wp_admin_bar_edit_menu( $wp_admin_bar ) { } /** - * Adds the command palette trigger button. + * Adds a link to open the command palette. * - * Displays a button in the admin bar that shows the keyboard shortcut + * Displays a link in the admin bar that shows the keyboard shortcut * for opening the command palette. * * @since 7.0.0 @@ -945,7 +945,7 @@ function wp_admin_bar_edit_menu( $wp_admin_bar ) { * @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance. */ function wp_admin_bar_command_palette_menu( WP_Admin_Bar $wp_admin_bar ): void { - if ( ! is_admin() ) { + if ( ! is_admin() || ! wp_script_is( 'wp-core-commands', 'enqueued' ) ) { return; } @@ -954,17 +954,19 @@ function wp_admin_bar_command_palette_menu( WP_Admin_Bar $wp_admin_bar ): void { ? _x( '⌘K', 'keyboard shortcut to open the command palette' ) : _x( 'Ctrl+K', 'keyboard shortcut to open the command palette' ); $title = sprintf( - '%s %s', + '%s %s', $shortcut_label, /* translators: Hidden accessibility text. */ __( 'Open command palette' ), ); + $wp_admin_bar->add_node( array( - 'id' => 'command-palette', - 'title' => $title, - 'href' => '#', - 'meta' => array( + 'parent' => 'top-secondary', + 'id' => 'command-palette', + 'title' => $title, + 'href' => '#', + 'meta' => array( 'class' => 'hide-if-no-js', 'onclick' => 'wp.data.dispatch( "core/commands" ).open(); return false;', ), @@ -1245,43 +1247,6 @@ function wp_admin_bar_search_menu( $wp_admin_bar ) { ); } -/** - * Adds a link to open the command palette. - * - * @since 7.0.0 - * - * @param WP_Admin_Bar $wp_admin_bar The WP_Admin_Bar instance. - */ -function wp_admin_bar_command_palette_menu( WP_Admin_Bar $wp_admin_bar ): void { - if ( ! is_admin() || ! wp_script_is( 'wp-core-commands', 'enqueued' ) ) { - return; - } - - $is_apple_os = (bool) preg_match( '/Macintosh|Mac OS X|Mac_PowerPC/i', $_SERVER['HTTP_USER_AGENT'] ?? '' ); - $shortcut_label = $is_apple_os - ? _x( '⌘K', 'keyboard shortcut to open the command palette' ) - : _x( 'Ctrl+K', 'keyboard shortcut to open the command palette' ); - $title = sprintf( - '%s %s', - $shortcut_label, - /* translators: Hidden accessibility text. */ - __( 'Open command palette' ), - ); - - $wp_admin_bar->add_node( - array( - 'parent' => 'top-secondary', - 'id' => 'command-palette', - 'title' => $title, - 'href' => '#', - 'meta' => array( - 'class' => 'hide-if-no-js', - 'onclick' => 'wp.data.dispatch( "core/commands" ).open(); return false;', - ), - ) - ); -} - /** * Adds a link to exit recovery mode when Recovery Mode is active. * From cf8abecc4852b7e9a3de171856a638be834fe76c Mon Sep 17 00:00:00 2001 From: "Stephen A. Bernhardt" Date: Wed, 11 Mar 2026 03:13:34 -0500 Subject: [PATCH 13/13] Remove action at priority 55 --- src/wp-includes/class-wp-admin-bar.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/wp-includes/class-wp-admin-bar.php b/src/wp-includes/class-wp-admin-bar.php index 47d4dcd919407..1965e8451139b 100644 --- a/src/wp-includes/class-wp-admin-bar.php +++ b/src/wp-includes/class-wp-admin-bar.php @@ -662,9 +662,6 @@ public function add_menus() { add_action( 'admin_bar_menu', 'wp_admin_bar_customize_menu', 40 ); add_action( 'admin_bar_menu', 'wp_admin_bar_updates_menu', 50 ); - // Command palette. - add_action( 'admin_bar_menu', 'wp_admin_bar_command_palette_menu', 55 ); - // Content-related. if ( ! is_network_admin() && ! is_user_admin() ) { add_action( 'admin_bar_menu', 'wp_admin_bar_comments_menu', 60 );