From 27230764716f75f0f1408f065bbd1a03dbf8ddb1 Mon Sep 17 00:00:00 2001 From: Ashar Fuadi Date: Sat, 9 May 2026 14:40:34 +0700 Subject: [PATCH 1/9] Admin bar: show site icon if set --- src/wp-includes/admin-bar.php | 13 ++++++++++--- src/wp-includes/css/admin-bar.css | 24 +++++++++++++++++++++++- tests/phpunit/tests/adminbar.php | 31 +++++++++++++++++++++++++++++++ 3 files changed, 64 insertions(+), 4 deletions(-) diff --git a/src/wp-includes/admin-bar.php b/src/wp-includes/admin-bar.php index 50868b11a2870..109e7278ee7c0 100644 --- a/src/wp-includes/admin-bar.php +++ b/src/wp-includes/admin-bar.php @@ -385,15 +385,22 @@ function wp_admin_bar_site_menu( $wp_admin_bar ) { } $title = wp_html_excerpt( $blogname, 40, '…' ); + $meta = array( + 'menu_title' => $title, + ); + + $site_icon_url = get_site_icon_url( 64 ); + if ( $site_icon_url ) { + $title = '' . $title; + $meta['class'] = 'has-site-icon'; + } $wp_admin_bar->add_node( array( 'id' => 'site-name', 'title' => $title, 'href' => ( is_admin() || ! current_user_can( 'read' ) ) ? home_url( '/' ) : admin_url(), - 'meta' => array( - 'menu_title' => $title, - ), + 'meta' => $meta, ) ); diff --git a/src/wp-includes/css/admin-bar.css b/src/wp-includes/css/admin-bar.css index fb6986e7ecbed..3e7eb5a8f0031 100644 --- a/src/wp-includes/css/admin-bar.css +++ b/src/wp-includes/css/admin-bar.css @@ -582,6 +582,19 @@ html:lang(he-il) .rtl #wpadminbar * { content: "\f102" / ''; } +#wpadminbar #wp-admin-bar-site-name.has-site-icon > .ab-item:before { + content: none; +} + +#wpadminbar #wp-admin-bar-site-name > .ab-item .site-icon { + width: 20px; + height: 20px; + margin: 0 6px 0 0; + vertical-align: -5px; + background: #f0f0f1; + border-radius: 4px; +} + /** @@ -903,7 +916,7 @@ html:lang(he-il) .rtl #wpadminbar * { #wpadminbar #wp-admin-bar-edit > .ab-item:before, #wpadminbar #wp-admin-bar-my-sites > .ab-item:before, - #wpadminbar #wp-admin-bar-site-name > .ab-item:before, + #wpadminbar #wp-admin-bar-site-name:not(.has-site-icon) > .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, @@ -918,6 +931,15 @@ html:lang(he-il) .rtl #wpadminbar * { -moz-osx-font-smoothing: grayscale; } + #wpadminbar #wp-admin-bar-site-name > .ab-item .site-icon { + position: absolute; + top: 9px; + left: 12px; + width: 28px; + height: 28px; + margin: 0; + } + #wpadminbar #wp-admin-bar-appearance { margin-top: 0; } diff --git a/tests/phpunit/tests/adminbar.php b/tests/phpunit/tests/adminbar.php index 27308bd82760e..e63772aee07a2 100644 --- a/tests/phpunit/tests/adminbar.php +++ b/tests/phpunit/tests/adminbar.php @@ -810,6 +810,37 @@ public function data_my_sites_network_menu_items() { ); } + /** + * @covers ::wp_admin_bar_site_menu + */ + public function test_site_name_menu_has_no_site_icon_when_unset() { + wp_set_current_user( self::$editor_id ); + + $wp_admin_bar = $this->get_standard_admin_bar(); + $node_site_name = $wp_admin_bar->get_node( 'site-name' ); + + $this->assertStringNotContainsString( 'site-icon', $node_site_name->title ); + $this->assertArrayNotHasKey( 'class', $node_site_name->meta ); + } + + /** + * @covers ::wp_admin_bar_site_menu + * @requires function imagejpeg + */ + public function test_site_name_menu_includes_site_icon_when_set() { + wp_set_current_user( self::$editor_id ); + + $attachment_id = self::factory()->attachment->create_upload_object( DIR_TESTDATA . '/images/test-image.jpg' ); + update_option( 'site_icon', $attachment_id ); + + $wp_admin_bar = $this->get_standard_admin_bar(); + $node_site_name = $wp_admin_bar->get_node( 'site-name' ); + + $this->assertStringContainsString( 'title ); + $this->assertStringContainsString( esc_url( get_site_icon_url( 64 ) ), $node_site_name->title ); + $this->assertSame( 'has-site-icon', $node_site_name->meta['class'] ); + } + /** * This test ensures that WP_Admin_Bar::$proto is not defined (including magic methods). * From 6d0958167b7fbea60899b11f343f95f2028fb830 Mon Sep 17 00:00:00 2001 From: Ashar Fuadi Date: Tue, 12 May 2026 22:17:43 +0700 Subject: [PATCH 2/9] Update border-radius to 2px on desktop resolution --- src/wp-includes/css/admin-bar.css | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/wp-includes/css/admin-bar.css b/src/wp-includes/css/admin-bar.css index 3e7eb5a8f0031..b5edea4ac180d 100644 --- a/src/wp-includes/css/admin-bar.css +++ b/src/wp-includes/css/admin-bar.css @@ -592,7 +592,7 @@ html:lang(he-il) .rtl #wpadminbar * { margin: 0 6px 0 0; vertical-align: -5px; background: #f0f0f1; - border-radius: 4px; + border-radius: 2px; } @@ -938,6 +938,7 @@ html:lang(he-il) .rtl #wpadminbar * { width: 28px; height: 28px; margin: 0; + border-radius: 4px; } #wpadminbar #wp-admin-bar-appearance { From 0975127c489e685722b036642bfc0cddc658f02c Mon Sep 17 00:00:00 2001 From: Ashar Fuadi Date: Fri, 19 Jun 2026 17:18:09 +0700 Subject: [PATCH 3/9] Fix multisite behavior --- src/wp-includes/admin-bar.php | 15 ++++++-- src/wp-includes/css/admin-bar.css | 4 ++ tests/phpunit/tests/adminbar.php | 63 +++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 4 deletions(-) diff --git a/src/wp-includes/admin-bar.php b/src/wp-includes/admin-bar.php index 109e7278ee7c0..4e5995e651317 100644 --- a/src/wp-includes/admin-bar.php +++ b/src/wp-includes/admin-bar.php @@ -389,10 +389,17 @@ function wp_admin_bar_site_menu( $wp_admin_bar ) { 'menu_title' => $title, ); - $site_icon_url = get_site_icon_url( 64 ); - if ( $site_icon_url ) { - $title = '' . $title; - $meta['class'] = 'has-site-icon'; + if ( ! is_network_admin() && ! is_user_admin() ) { + /** This filter is documented in wp-includes/admin-bar.php */ + $show_site_icons = apply_filters( 'wp_admin_bar_show_site_icons', true ); + + if ( $show_site_icons ) { + $site_icon_url = get_site_icon_url( 64 ); + if ( $site_icon_url ) { + $title = '' . $title; + $meta['class'] = 'has-site-icon'; + } + } } $wp_admin_bar->add_node( diff --git a/src/wp-includes/css/admin-bar.css b/src/wp-includes/css/admin-bar.css index b5edea4ac180d..a2c812b2da44e 100644 --- a/src/wp-includes/css/admin-bar.css +++ b/src/wp-includes/css/admin-bar.css @@ -537,6 +537,10 @@ html:lang(he-il) .rtl #wpadminbar * { margin: 0 8px 2px -2px; } +#wpadminbar .quicklinks li img.blavatar { + border-radius: 2px; +} + #wpadminbar .quicklinks li div.blavatar:before { content: "\f120"; content: "\f120" / ''; diff --git a/tests/phpunit/tests/adminbar.php b/tests/phpunit/tests/adminbar.php index e63772aee07a2..f50da81ec9152 100644 --- a/tests/phpunit/tests/adminbar.php +++ b/tests/phpunit/tests/adminbar.php @@ -841,6 +841,69 @@ public function test_site_name_menu_includes_site_icon_when_set() { $this->assertSame( 'has-site-icon', $node_site_name->meta['class'] ); } + /** + * @covers ::wp_admin_bar_site_menu + * @requires function imagejpeg + */ + public function test_site_name_menu_respects_show_site_icons_filter() { + wp_set_current_user( self::$editor_id ); + + $attachment_id = self::factory()->attachment->create_upload_object( DIR_TESTDATA . '/images/test-image.jpg' ); + update_option( 'site_icon', $attachment_id ); + + add_filter( 'wp_admin_bar_show_site_icons', '__return_false' ); + + $wp_admin_bar = $this->get_standard_admin_bar(); + $node_site_name = $wp_admin_bar->get_node( 'site-name' ); + + $this->assertStringNotContainsString( 'site-icon', $node_site_name->title ); + $this->assertArrayNotHasKey( 'class', $node_site_name->meta ); + } + + /** + * @covers ::wp_admin_bar_site_menu + * @group multisite + * @group ms-required + * @requires function imagejpeg + */ + public function test_site_name_menu_has_no_site_icon_in_network_admin() { + wp_set_current_user( self::$admin_id ); + + $attachment_id = self::factory()->attachment->create_upload_object( DIR_TESTDATA . '/images/test-image.jpg' ); + update_option( 'site_icon', $attachment_id ); + + set_current_screen( 'dashboard-network' ); + + $wp_admin_bar = $this->get_standard_admin_bar(); + $node_site_name = $wp_admin_bar->get_node( 'site-name' ); + + $this->assertTrue( is_network_admin() ); + $this->assertStringNotContainsString( 'site-icon', $node_site_name->title ); + $this->assertArrayNotHasKey( 'class', $node_site_name->meta ); + } + + /** + * @covers ::wp_admin_bar_site_menu + * @group multisite + * @group ms-required + * @requires function imagejpeg + */ + public function test_site_name_menu_has_no_site_icon_in_user_admin() { + wp_set_current_user( self::$admin_id ); + + $attachment_id = self::factory()->attachment->create_upload_object( DIR_TESTDATA . '/images/test-image.jpg' ); + update_option( 'site_icon', $attachment_id ); + + set_current_screen( 'dashboard-user' ); + + $wp_admin_bar = $this->get_standard_admin_bar(); + $node_site_name = $wp_admin_bar->get_node( 'site-name' ); + + $this->assertTrue( is_user_admin() ); + $this->assertStringNotContainsString( 'site-icon', $node_site_name->title ); + $this->assertArrayNotHasKey( 'class', $node_site_name->meta ); + } + /** * This test ensures that WP_Admin_Bar::$proto is not defined (including magic methods). * From e6dece68984e77bfa69d0b149108d6883e462734 Mon Sep 17 00:00:00 2001 From: Ashar Fuadi Date: Fri, 19 Jun 2026 17:18:27 +0700 Subject: [PATCH 4/9] Make CSS centering consistent with avatar --- src/wp-includes/css/admin-bar.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/css/admin-bar.css b/src/wp-includes/css/admin-bar.css index a2c812b2da44e..328c641d23329 100644 --- a/src/wp-includes/css/admin-bar.css +++ b/src/wp-includes/css/admin-bar.css @@ -593,8 +593,8 @@ html:lang(he-il) .rtl #wpadminbar * { #wpadminbar #wp-admin-bar-site-name > .ab-item .site-icon { width: 20px; height: 20px; - margin: 0 6px 0 0; - vertical-align: -5px; + vertical-align: middle; + margin: -2px 6px 0 0; background: #f0f0f1; border-radius: 2px; } From 2b4e5d807e27d99db8659b074626f86898bd8524 Mon Sep 17 00:00:00 2001 From: Ashar Fuadi Date: Fri, 19 Jun 2026 20:02:56 +0700 Subject: [PATCH 5/9] Use has_site_icon; fold one level --- src/wp-includes/admin-bar.php | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/src/wp-includes/admin-bar.php b/src/wp-includes/admin-bar.php index 4e5995e651317..48fe6174aa05e 100644 --- a/src/wp-includes/admin-bar.php +++ b/src/wp-includes/admin-bar.php @@ -393,12 +393,9 @@ function wp_admin_bar_site_menu( $wp_admin_bar ) { /** This filter is documented in wp-includes/admin-bar.php */ $show_site_icons = apply_filters( 'wp_admin_bar_show_site_icons', true ); - if ( $show_site_icons ) { - $site_icon_url = get_site_icon_url( 64 ); - if ( $site_icon_url ) { - $title = '' . $title; - $meta['class'] = 'has-site-icon'; - } + if ( true === $show_site_icons && has_site_icon() ) { + $title = '' . $title; + $meta['class'] = 'has-site-icon'; } } From 7624e1bb1cfd7fb117dd80d0571cfc6c39e6b508 Mon Sep 17 00:00:00 2001 From: Ashar Fuadi Date: Fri, 19 Jun 2026 20:23:08 +0700 Subject: [PATCH 6/9] Update img logic --- src/wp-includes/admin-bar.php | 8 +++++++- tests/phpunit/tests/adminbar.php | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/wp-includes/admin-bar.php b/src/wp-includes/admin-bar.php index 48fe6174aa05e..f7ede04cc6178 100644 --- a/src/wp-includes/admin-bar.php +++ b/src/wp-includes/admin-bar.php @@ -394,7 +394,13 @@ function wp_admin_bar_site_menu( $wp_admin_bar ) { $show_site_icons = apply_filters( 'wp_admin_bar_show_site_icons', true ); if ( true === $show_site_icons && has_site_icon() ) { - $title = '' . $title; + $site_icon = sprintf( + '', + esc_url( get_site_icon_url( 28 ) ), + esc_url( get_site_icon_url( 56 ) ) + ); + + $title = $site_icon . $title; $meta['class'] = 'has-site-icon'; } } diff --git a/tests/phpunit/tests/adminbar.php b/tests/phpunit/tests/adminbar.php index f50da81ec9152..b1d204e628f0b 100644 --- a/tests/phpunit/tests/adminbar.php +++ b/tests/phpunit/tests/adminbar.php @@ -837,7 +837,7 @@ public function test_site_name_menu_includes_site_icon_when_set() { $node_site_name = $wp_admin_bar->get_node( 'site-name' ); $this->assertStringContainsString( 'title ); - $this->assertStringContainsString( esc_url( get_site_icon_url( 64 ) ), $node_site_name->title ); + $this->assertStringContainsString( esc_url( get_site_icon_url( 28 ) ), $node_site_name->title ); $this->assertSame( 'has-site-icon', $node_site_name->meta['class'] ); } From d803c05131f724d0ac1042a1ef6d92550ca80bc1 Mon Sep 17 00:00:00 2001 From: Ashar Fuadi Date: Fri, 19 Jun 2026 21:20:08 +0700 Subject: [PATCH 7/9] Add comment on background color choice --- src/wp-includes/css/admin-bar.css | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/wp-includes/css/admin-bar.css b/src/wp-includes/css/admin-bar.css index 328c641d23329..5df2cabc87131 100644 --- a/src/wp-includes/css/admin-bar.css +++ b/src/wp-includes/css/admin-bar.css @@ -595,7 +595,7 @@ html:lang(he-il) .rtl #wpadminbar * { height: 20px; vertical-align: middle; margin: -2px 6px 0 0; - background: #f0f0f1; + background: #f0f0f1; /* matching my-account (user avatar) node's background */ border-radius: 2px; } From 88aef4eb5f13f5652d6400f1d7211a72790dde78 Mon Sep 17 00:00:00 2001 From: Ashar Fuadi Date: Fri, 19 Jun 2026 21:31:40 +0700 Subject: [PATCH 8/9] Use existing image size constants --- src/wp-includes/admin-bar.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/wp-includes/admin-bar.php b/src/wp-includes/admin-bar.php index f7ede04cc6178..7975ec8cd85ca 100644 --- a/src/wp-includes/admin-bar.php +++ b/src/wp-includes/admin-bar.php @@ -395,9 +395,9 @@ function wp_admin_bar_site_menu( $wp_admin_bar ) { if ( true === $show_site_icons && has_site_icon() ) { $site_icon = sprintf( - '', - esc_url( get_site_icon_url( 28 ) ), - esc_url( get_site_icon_url( 56 ) ) + '', + esc_url( get_site_icon_url( 32 ) ), + esc_url( get_site_icon_url( 64 ) ) ); $title = $site_icon . $title; From 08123a7a58fc19b32d2c446d54c500d70b5626d0 Mon Sep 17 00:00:00 2001 From: Ashar Fuadi Date: Mon, 22 Jun 2026 18:00:28 +0700 Subject: [PATCH 9/9] Fix test --- tests/phpunit/tests/adminbar.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/phpunit/tests/adminbar.php b/tests/phpunit/tests/adminbar.php index b1d204e628f0b..fb29eaf39af42 100644 --- a/tests/phpunit/tests/adminbar.php +++ b/tests/phpunit/tests/adminbar.php @@ -837,7 +837,7 @@ public function test_site_name_menu_includes_site_icon_when_set() { $node_site_name = $wp_admin_bar->get_node( 'site-name' ); $this->assertStringContainsString( 'title ); - $this->assertStringContainsString( esc_url( get_site_icon_url( 28 ) ), $node_site_name->title ); + $this->assertStringContainsString( esc_url( get_site_icon_url( 32 ) ), $node_site_name->title ); $this->assertSame( 'has-site-icon', $node_site_name->meta['class'] ); }