diff --git a/src/wp-includes/default-filters.php b/src/wp-includes/default-filters.php
index bf39f29b4d..5037469a41 100644
--- a/src/wp-includes/default-filters.php
+++ b/src/wp-includes/default-filters.php
@@ -668,6 +668,7 @@ add_filter( 'rest_pre_serve_request', '_oembed_rest_pre_serve_request', 10, 4 );
 add_action( 'wp_head', 'wp_oembed_add_discovery_links' );
 add_action( 'wp_head', 'wp_oembed_add_host_js' ); // Back-compat for sites disabling oEmbed host JS by removing action.
 add_filter( 'embed_oembed_html', 'wp_maybe_enqueue_oembed_host_js' );
+add_filter( 'embed_oembed_html', 'wp_lazy_load_oembed_iframe' );
 
 add_action( 'embed_head', 'enqueue_embed_scripts', 1 );
 add_action( 'embed_head', 'print_emoji_detection_script' );
diff --git a/src/wp-includes/embed.php b/src/wp-includes/embed.php
index d75939cce6..2e2ad2f8a8 100644
--- a/src/wp-includes/embed.php
+++ b/src/wp-includes/embed.php
@@ -1244,3 +1244,21 @@ function wp_filter_pre_oembed_result( $result, $url, $args ) {
 
 	return $result;
 }
+
+/**
+ * Apply the loading="lazy" attribute to the oEmbed iframe.
+ *
+ * @since 6.4.0
+ *
+ * @param string $html The oEmbed HTML, usually containing an iframe.
+ *
+ * @return string The oEmbed HTML with the loading="lazy" attribute added to the iframe.
+ */
+function wp_lazy_load_oembed_iframe( $html ) {
+	$tag_parser = new WP_HTML_Tag_Processor( $html );
+	if ( wp_lazy_loading_enabled( 'iframe', 'oembed' ) && isset( $html ) && $tag_parser->next_tag( 'iframe' ) && ! $tag_parser->get_attribute( 'loading' ) ) {
+		$html = wp_iframe_tag_add_loading_attr( $html, 'oembed' );
+	}
+
+	return $html;
+}
diff --git a/tests/phpunit/tests/oembed/WpEmbed.php b/tests/phpunit/tests/oembed/WpEmbed.php
index eb64f084e7..e6ed1e3b04 100644
--- a/tests/phpunit/tests/oembed/WpEmbed.php
+++ b/tests/phpunit/tests/oembed/WpEmbed.php
@@ -9,6 +9,8 @@ class Tests_WP_Embed extends WP_UnitTestCase {
 	 */
 	protected $wp_embed;
 
+	const YOUTUBE_VIDEO_ID = 'OQSNhk5ICTI';
+
 	public function set_up() {
 		parent::set_up();
 		$this->wp_embed = new WP_Embed();
@@ -377,4 +379,16 @@ class Tests_WP_Embed extends WP_UnitTestCase {
 		$this->wp_embed->linkifunknown = false;
 		$this->assertSame( $url, $this->wp_embed->maybe_make_link( $url ) );
 	}
+
+	/**
+	 * Test that oembed iframes are lazy loaded by default.
+	 *
+	 * @ticket 58773
+	 */
+	public function test_oembed_iframes_are_lazy_loaded_by_default() {
+		$url    = 'https://www.youtube.com/watch?v=' . self::YOUTUBE_VIDEO_ID;
+		$actual = $this->wp_embed->run_shortcode( '[embed]' . $url . '[/embed]' );
+		$this->assertContains( 'loading="lazy"', $actual );
+	}
+
 }
diff --git a/tests/phpunit/tests/oembed/wpOembed.php b/tests/phpunit/tests/oembed/wpOembed.php
index 051a7efe3d..8f85e6da8c 100644
--- a/tests/phpunit/tests/oembed/wpOembed.php
+++ b/tests/phpunit/tests/oembed/wpOembed.php
@@ -9,6 +9,8 @@ class Tests_WP_oEmbed extends WP_UnitTestCase {
 	 */
 	protected $oembed;
 
+	const YOUTUBE_VIDEO_ID = 'OQSNhk5ICTI';
+
 	public $pre_oembed_result_filtered = false;
 
 	public function set_up() {
@@ -237,4 +239,5 @@ class Tests_WP_oEmbed extends WP_UnitTestCase {
 		$this->assertFalse( $actual );
 		$this->assertSame( $current_blog_id, get_current_blog_id() );
 	}
+
 }
