From d6cb8c399e2f29776b3aa84cee8ea807e6f6bb19 Mon Sep 17 00:00:00 2001 From: Scott Taylor Date: Fri, 7 Feb 2014 22:40:32 +0000 Subject: [PATCH] Introduce `maybe_regenerate_attachment_metadata( $attachment )`. On the Edit Media screen, call it for Audio and Video files. The functions checks if the item is lacking metadata altogether. If a video or audio file was uploaded prior to 3.6, it does not have any metadata. This tries to fix it. Implements locking via a transient to protect against this running in parallel with another request. This is the minimum viable product for #26825, but leaving the ticket open unless this function needs to be called in other places. See #26825. git-svn-id: https://develop.svn.wordpress.org/trunk@27127 602fd350-edb4-49c9-b593-d223f7449a82 --- src/wp-admin/includes/media.php | 4 ++++ src/wp-includes/media.php | 23 +++++++++++++++++++++++ 2 files changed, 27 insertions(+) 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