Skip to content
Open
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 15 additions & 3 deletions src/wp-includes/embed.php
Original file line number Diff line number Diff line change
Expand Up @@ -1233,11 +1233,23 @@ function print_embed_sharing_dialog() {
* @since 4.5.0
*/
function the_embed_site_title() {
$site_icon_url = get_site_icon_url( 32, includes_url( 'images/w-logo-blue.png' ) );

$icon_img = '';
if ( $site_icon_url ) {
$site_icon_url_2x = get_site_icon_url( 64, includes_url( 'images/w-logo-blue.png' ) );
Comment thread
westonruter marked this conversation as resolved.
Outdated
$srcset = ( $site_icon_url_2x && $site_icon_url !== $site_icon_url_2x ) ? sprintf( ' srcset="%s 2x"', esc_url( $site_icon_url_2x ) ) : '';
$icon_img = sprintf(
'<img src="%s"%s width="32" height="32" alt="" class="wp-embed-site-icon" />',
esc_url( $site_icon_url ),
$srcset
);
}

$site_title = sprintf(
'<a href="%s" target="_top"><img src="%s" srcset="%s 2x" width="32" height="32" alt="" class="wp-embed-site-icon" /><span>%s</span></a>',
'<a href="%s" target="_top">%s<span>%s</span></a>',
esc_url( home_url() ),
esc_url( get_site_icon_url( 32, includes_url( 'images/w-logo-blue.png' ) ) ),
esc_url( get_site_icon_url( 64, includes_url( 'images/w-logo-blue.png' ) ) ),
$icon_img,
esc_html( get_bloginfo( 'name' ) )
);

Expand Down
5 changes: 4 additions & 1 deletion src/wp-includes/general-template.php
Original file line number Diff line number Diff line change
Expand Up @@ -978,7 +978,10 @@ function get_site_icon_url( $size = 512, $url = '', $blog_id = 0 ) {
} else {
$size_data = array( $size, $size );
}
$url = wp_get_attachment_image_url( $site_icon_id, $size_data );
$attachment_url = wp_get_attachment_image_url( $site_icon_id, $size_data );
if ( $attachment_url ) {
$url = $attachment_url;
}
}

if ( $switched_blog ) {
Expand Down
133 changes: 133 additions & 0 deletions tests/phpunit/tests/general/template.php
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,27 @@ public function test_get_site_icon_url() {
$this->assertEmpty( get_site_icon_url(), 'Site icon URL should not be set after removal.' );
}

/**
* @ticket 65098
* @group site_icon
* @covers ::get_site_icon_url
* @requires function imagejpeg
*/
public function test_get_site_icon_url_returns_fallback_when_attachment_url_fails() {
$this->set_site_icon();

$fallback = 'https://example.com/fallback-icon.png';
add_filter( 'wp_get_attachment_image_src', '__return_false' );

try {
$url = get_site_icon_url( 32, $fallback );
} finally {
remove_filter( 'wp_get_attachment_image_src', '__return_false' );
}

Comment thread
Sukhendu2002 marked this conversation as resolved.
Outdated
$this->assertSame( $fallback, $url, 'Fallback URL should be returned when attachment URL lookup fails.' );
}

/**
* @group site_icon
* @covers ::site_icon_url
Expand Down Expand Up @@ -807,4 +828,116 @@ public function test_get_the_archive_title_is_correct_for_author_queries() {
$this->assertSame( $user_with_posts->display_name, $title_when_posts );
$this->assertSame( $user_with_no_posts->display_name, $title_when_no_posts );
}

/**
* @ticket 65098
* @group site_icon
* @covers ::the_embed_site_title
* @requires function imagejpeg
*/
public function test_the_embed_site_title_contains_site_icon_when_set() {
$this->set_site_icon();

$url_32 = get_site_icon_url( 32 );
$url_64 = get_site_icon_url( 64 );

ob_start();
the_embed_site_title();
$output = ob_get_clean();

$this->assertStringContainsString( 'wp-embed-site-icon', $output, 'Output should contain site icon img tag.' );
$this->assertStringContainsString( esc_url( $url_32 ), $output, 'Output should contain 32px site icon URL.' );
$this->assertStringContainsString( esc_url( $url_64 ), $output, 'Output should contain 64px site icon URL in srcset.' );
Comment thread
Sukhendu2002 marked this conversation as resolved.
Outdated
}

/**
* @ticket 65098
* @group site_icon
* @covers ::the_embed_site_title
* @requires function imagejpeg
*/
public function test_the_embed_site_title_uses_fallback_when_attachment_url_fails() {
$this->set_site_icon();

// Simulate wp_get_attachment_image_url() failing.
add_filter( 'wp_get_attachment_image_src', '__return_false' );

try {
ob_start();
the_embed_site_title();
$output = ob_get_clean();
} finally {
remove_filter( 'wp_get_attachment_image_src', '__return_false' );
}

Comment thread
Sukhendu2002 marked this conversation as resolved.
Outdated
$fallback = includes_url( 'images/w-logo-blue.png' );
$this->assertStringContainsString( 'wp-embed-site-icon', $output, 'Output should contain site icon img tag with fallback.' );
$this->assertStringContainsString( esc_url( $fallback ), $output, 'Output should contain fallback URL when attachment URL fails.' );
$this->assertStringNotContainsString( 'src=""', $output, 'Output should not contain empty src attribute.' );
}

/**
* @ticket 65098
* @group site_icon
* @covers ::the_embed_site_title
*/
public function test_the_embed_site_title_omits_img_when_url_is_empty() {
// Force get_site_icon_url() to return empty string via filter.
add_filter( 'get_site_icon_url', '__return_empty_string' );

try {
ob_start();
the_embed_site_title();
$output = ob_get_clean();
} finally {
remove_filter( 'get_site_icon_url', '__return_empty_string' );
}
Comment thread
Sukhendu2002 marked this conversation as resolved.
Outdated

$this->assertStringNotContainsString( 'wp-embed-site-icon', $output, 'img tag should be omitted when URL is empty.' );
$this->assertStringNotContainsString( 'src=""', $output, 'Output should not contain empty src attribute.' );
$this->assertStringContainsString( get_bloginfo( 'name' ), $output, 'Site name should still be present.' );
}

/**
* @ticket 65098
* @group site_icon
* @covers ::the_embed_site_title
*/
public function test_the_embed_site_title_omits_srcset_when_1x_and_2x_urls_are_identical() {
// Force both sizes to return the same URL.
$svg_url = 'https://example.com/icon.svg';
$filter = static function () use ( $svg_url ) {
return $svg_url;
};

add_filter( 'get_site_icon_url', $filter );

try {
ob_start();
the_embed_site_title();
$output = ob_get_clean();
} finally {
remove_filter( 'get_site_icon_url', $filter );
}
Comment thread
Sukhendu2002 marked this conversation as resolved.
Outdated

$this->assertStringNotContainsString( 'srcset=', $output, 'srcset should be omitted when 1x and 2x URLs are identical.' );
$this->assertStringContainsString( esc_url( $svg_url ), $output, '1x URL should still be present in src.' );
}

/**
* @ticket 65098
* @group site_icon
* @covers ::the_embed_site_title
*/
public function test_the_embed_site_title_uses_fallback_without_srcset_when_no_site_icon_set() {
ob_start();
the_embed_site_title();
$output = ob_get_clean();
Comment thread
Sukhendu2002 marked this conversation as resolved.
Outdated

$fallback = includes_url( 'images/w-logo-blue.png' );

$this->assertStringContainsString( 'wp-embed-site-icon', $output, 'Fallback icon img should be present when no site icon is set.' );
$this->assertStringContainsString( esc_url( $fallback ), $output, 'Output should contain fallback icon URL.' );
$this->assertStringNotContainsString( 'srcset=', $output, 'srcset should be omitted when 1x and 2x fallback URLs are identical.' );
}
}
Loading