diff --git a/src/wp-admin/includes/media.php b/src/wp-admin/includes/media.php index dd00069b88..ba38188684 100644 --- a/src/wp-admin/includes/media.php +++ b/src/wp-admin/includes/media.php @@ -2636,10 +2636,14 @@ function edit_form_image_editor( $post ) { post_mime_type, 'audio/' ) ): + maybe_regenerate_attachment_metadata( $post ); + echo wp_audio_shortcode( array( 'src' => $att_url ) ); elseif ( $attachment_id && 0 === strpos( $post->post_mime_type, 'video/' ) ): + maybe_regenerate_attachment_metadata( $post ); + $meta = wp_get_attachment_metadata( $attachment_id ); $w = ! empty( $meta['width'] ) ? min( $meta['width'], 600 ) : 0; $h = 0; diff --git a/src/wp-includes/media.php b/src/wp-includes/media.php index 12cc86b964..89e642bd3b 100644 --- a/src/wp-includes/media.php +++ b/src/wp-includes/media.php @@ -2194,3 +2194,26 @@ function get_post_gallery_images( $post = 0 ) { $gallery = get_post_gallery( $post, false ); return empty( $gallery['src'] ) ? array() : $gallery['src']; } + +/** + * If an attachment is missing its metadata, try to regenerate it + * + * @param post $attachment Post object. + */ +function maybe_regenerate_attachment_metadata( $attachment ) { + if ( empty( $attachment ) || ( empty( $attachment->ID ) || ! $attachment_id = (int) $attachment->ID ) ) { + return; + } + + $file = get_attached_file( $attachment_id ); + $meta = wp_get_attachment_metadata( $attachment_id ); + if ( empty( $meta ) && file_exists( $file ) ) { + $_meta = get_post_meta( $attachment_id ); + $regeneration_lock = 'wp_regenerating_' . $attachment_id; + if ( ! array_key_exists( '_wp_attachment_metadata', $_meta ) && ! get_transient( $regeneration_lock ) ) { + set_transient( $regeneration_lock, $file ); + wp_update_attachment_metadata( $attachment_id, wp_generate_attachment_metadata( $attachment_id, $file ) ); + delete_transient( $regeneration_lock ); + } + } +} \ No newline at end of file