Skip to content

Commit 006522b

Browse files
committed
Toolbar: Show the site icon in the admin bar when one is set.
When a site icon is configured, it is displayed in the WordPress admin bar in place of the home/odometer dashicon. The icon is shown at 20×20px with a border-radius of 2px. When no site icon is set, the existing dashicon behavior is preserved. This was originally committed in [62614] but accidentally undid other changes, so it was reverted in [62620]. Developed in WordPress#11781. Props fushar, tyxla, joen, wildworks, scruffian, sergeybiryukov, lucasmdo, joedolson. Fixes #65088. See #46657, #64308. git-svn-id: https://develop.svn.wordpress.org/trunk@62625 602fd350-edb4-49c9-b593-d223f7449a82
1 parent ca1d263 commit 006522b

3 files changed

Lines changed: 147 additions & 4 deletions

File tree

src/wp-includes/admin-bar.php

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -385,15 +385,35 @@ function wp_admin_bar_site_menu( $wp_admin_bar ) {
385385
}
386386

387387
$title = wp_html_excerpt( $blogname, 40, '…' );
388+
$meta = array(
389+
'menu_title' => $title,
390+
);
391+
392+
if ( ! is_network_admin() && ! is_user_admin() ) {
393+
/** This filter is documented in wp-includes/admin-bar.php */
394+
$show_site_icons = apply_filters( 'wp_admin_bar_show_site_icons', true );
395+
396+
if ( true === $show_site_icons && has_site_icon() ) {
397+
$site_icon_url = get_site_icon_url( 32 );
398+
$site_icon_url_2x = get_site_icon_url( 64 );
399+
$srcset = ( $site_icon_url_2x && $site_icon_url !== $site_icon_url_2x ) ? sprintf( ' srcset="%s 2x"', esc_url( $site_icon_url_2x ) ) : '';
400+
$site_icon = sprintf(
401+
'<img class="site-icon" src="%s"%s alt="" width="20" height="20" />',
402+
esc_url( $site_icon_url ),
403+
$srcset
404+
);
405+
406+
$title = $site_icon . $title;
407+
$meta['class'] = 'has-site-icon';
408+
}
409+
}
388410

389411
$wp_admin_bar->add_node(
390412
array(
391413
'id' => 'site-name',
392414
'title' => $title,
393415
'href' => ( is_admin() || ! current_user_can( 'read' ) ) ? home_url( '/' ) : admin_url(),
394-
'meta' => array(
395-
'menu_title' => $title,
396-
),
416+
'meta' => $meta,
397417
)
398418
);
399419

src/wp-includes/css/admin-bar.css

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -539,6 +539,10 @@ html:lang(he-il) .rtl #wpadminbar * {
539539
margin: 0 8px 2px -2px;
540540
}
541541

542+
#wpadminbar .quicklinks li img.blavatar {
543+
border-radius: 2px;
544+
}
545+
542546
#wpadminbar .quicklinks li div.blavatar:before {
543547
content: "\f120";
544548
content: "\f120" / '';
@@ -584,7 +588,22 @@ html:lang(he-il) .rtl #wpadminbar * {
584588
content: "\f102" / '';
585589
}
586590

591+
#wpadminbar #wp-admin-bar-site-name.has-site-icon > .ab-item {
592+
display: flex;
593+
align-items: center;
594+
gap: 6px;
595+
}
587596

597+
#wpadminbar #wp-admin-bar-site-name.has-site-icon > .ab-item:before {
598+
content: none;
599+
}
600+
601+
#wpadminbar #wp-admin-bar-site-name > .ab-item .site-icon {
602+
width: 20px;
603+
height: 20px;
604+
background: #f0f0f1; /* matching my-account (user avatar) node's background */
605+
border-radius: 2px;
606+
}
588607

589608
/**
590609
* Comments
@@ -905,7 +924,7 @@ html:lang(he-il) .rtl #wpadminbar * {
905924

906925
#wpadminbar #wp-admin-bar-edit > .ab-item:before,
907926
#wpadminbar #wp-admin-bar-my-sites > .ab-item:before,
908-
#wpadminbar #wp-admin-bar-site-name > .ab-item:before,
927+
#wpadminbar #wp-admin-bar-site-name:not(.has-site-icon) > .ab-item:before,
909928
#wpadminbar #wp-admin-bar-site-editor > .ab-item:before,
910929
#wpadminbar #wp-admin-bar-customize > .ab-item:before,
911930
#wpadminbar #wp-admin-bar-my-account > .ab-item:before,
@@ -920,6 +939,16 @@ html:lang(he-il) .rtl #wpadminbar * {
920939
-moz-osx-font-smoothing: grayscale;
921940
}
922941

942+
#wpadminbar #wp-admin-bar-site-name > .ab-item .site-icon {
943+
position: absolute;
944+
top: 9px;
945+
left: 12px;
946+
width: 28px;
947+
height: 28px;
948+
margin: 0;
949+
border-radius: 4px;
950+
}
951+
923952
#wpadminbar #wp-admin-bar-appearance {
924953
margin-top: 0;
925954
}

tests/phpunit/tests/adminbar.php

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -810,6 +810,100 @@ public function data_my_sites_network_menu_items() {
810810
);
811811
}
812812

813+
/**
814+
* @covers ::wp_admin_bar_site_menu
815+
*/
816+
public function test_site_name_menu_has_no_site_icon_when_unset() {
817+
wp_set_current_user( self::$editor_id );
818+
819+
$wp_admin_bar = $this->get_standard_admin_bar();
820+
$node_site_name = $wp_admin_bar->get_node( 'site-name' );
821+
822+
$this->assertStringNotContainsString( 'site-icon', $node_site_name->title );
823+
$this->assertArrayNotHasKey( 'class', $node_site_name->meta );
824+
}
825+
826+
/**
827+
* @covers ::wp_admin_bar_site_menu
828+
* @requires function imagejpeg
829+
*/
830+
public function test_site_name_menu_includes_site_icon_when_set() {
831+
wp_set_current_user( self::$editor_id );
832+
833+
$attachment_id = self::factory()->attachment->create_upload_object( DIR_TESTDATA . '/images/test-image.jpg' );
834+
update_option( 'site_icon', $attachment_id );
835+
836+
$wp_admin_bar = $this->get_standard_admin_bar();
837+
$node_site_name = $wp_admin_bar->get_node( 'site-name' );
838+
839+
$this->assertStringContainsString( '<img class="site-icon"', $node_site_name->title );
840+
$this->assertStringContainsString( esc_url( get_site_icon_url( 32 ) ), $node_site_name->title );
841+
$this->assertSame( 'has-site-icon', $node_site_name->meta['class'] );
842+
}
843+
844+
/**
845+
* @covers ::wp_admin_bar_site_menu
846+
* @requires function imagejpeg
847+
*/
848+
public function test_site_name_menu_respects_show_site_icons_filter() {
849+
wp_set_current_user( self::$editor_id );
850+
851+
$attachment_id = self::factory()->attachment->create_upload_object( DIR_TESTDATA . '/images/test-image.jpg' );
852+
update_option( 'site_icon', $attachment_id );
853+
854+
add_filter( 'wp_admin_bar_show_site_icons', '__return_false' );
855+
856+
$wp_admin_bar = $this->get_standard_admin_bar();
857+
$node_site_name = $wp_admin_bar->get_node( 'site-name' );
858+
859+
$this->assertStringNotContainsString( 'site-icon', $node_site_name->title );
860+
$this->assertArrayNotHasKey( 'class', $node_site_name->meta );
861+
}
862+
863+
/**
864+
* @covers ::wp_admin_bar_site_menu
865+
* @group multisite
866+
* @group ms-required
867+
* @requires function imagejpeg
868+
*/
869+
public function test_site_name_menu_has_no_site_icon_in_network_admin() {
870+
wp_set_current_user( self::$admin_id );
871+
872+
$attachment_id = self::factory()->attachment->create_upload_object( DIR_TESTDATA . '/images/test-image.jpg' );
873+
update_option( 'site_icon', $attachment_id );
874+
875+
set_current_screen( 'dashboard-network' );
876+
877+
$wp_admin_bar = $this->get_standard_admin_bar();
878+
$node_site_name = $wp_admin_bar->get_node( 'site-name' );
879+
880+
$this->assertTrue( is_network_admin() );
881+
$this->assertStringNotContainsString( 'site-icon', $node_site_name->title );
882+
$this->assertArrayNotHasKey( 'class', $node_site_name->meta );
883+
}
884+
885+
/**
886+
* @covers ::wp_admin_bar_site_menu
887+
* @group multisite
888+
* @group ms-required
889+
* @requires function imagejpeg
890+
*/
891+
public function test_site_name_menu_has_no_site_icon_in_user_admin() {
892+
wp_set_current_user( self::$admin_id );
893+
894+
$attachment_id = self::factory()->attachment->create_upload_object( DIR_TESTDATA . '/images/test-image.jpg' );
895+
update_option( 'site_icon', $attachment_id );
896+
897+
set_current_screen( 'dashboard-user' );
898+
899+
$wp_admin_bar = $this->get_standard_admin_bar();
900+
$node_site_name = $wp_admin_bar->get_node( 'site-name' );
901+
902+
$this->assertTrue( is_user_admin() );
903+
$this->assertStringNotContainsString( 'site-icon', $node_site_name->title );
904+
$this->assertArrayNotHasKey( 'class', $node_site_name->meta );
905+
}
906+
813907
/**
814908
* This test ensures that WP_Admin_Bar::$proto is not defined (including magic methods).
815909
*

0 commit comments

Comments
 (0)