diff --git a/src/wp-admin/admin-ajax.php b/src/wp-admin/admin-ajax.php index d32dad522d..f4cafd0c30 100644 --- a/src/wp-admin/admin-ajax.php +++ b/src/wp-admin/admin-ajax.php @@ -60,7 +60,7 @@ $core_actions_post = array( 'wp-remove-post-lock', 'dismiss-wp-pointer', 'upload-attachment', 'get-attachment', 'query-attachments', 'save-attachment', 'save-attachment-compat', 'send-link-to-editor', 'send-attachment-to-editor', 'save-attachment-order', 'heartbeat', 'get-revision-diffs', - 'save-user-color-scheme', 'update-widget', 'query-themes', 'parse-embed' + 'save-user-color-scheme', 'update-widget', 'query-themes', 'parse-embed', 'set-attachment-thumbnail' ); // Register core Ajax calls. diff --git a/src/wp-admin/includes/ajax-actions.php b/src/wp-admin/includes/ajax-actions.php index 640ce5ff3d..e05c4108f5 100644 --- a/src/wp-admin/includes/ajax-actions.php +++ b/src/wp-admin/includes/ajax-actions.php @@ -1946,6 +1946,55 @@ function wp_ajax_set_post_thumbnail() { wp_die( 0 ); } +/** + * Ajax handler for setting the featured image for an attachment. + * + * @since 4.0.0 + */ +function wp_ajax_set_attachment_thumbnail() { + if ( empty( $_POST['urls'] ) || ! is_array( $_POST['urls'] ) ) { + wp_send_json_error(); + } + + $thumbnail_id = (int) $_POST['thumbnail_id']; + if ( empty( $thumbnail_id ) ) { + wp_send_json_error(); + } + + $post_ids = array(); + // For each URL, try to find its corresponding post ID. + foreach ( $_POST['urls'] as $url ) { + $post_id = attachment_url_to_postid( $url ); + if ( ! empty( $post_id ) ) { + $post_ids[] = $post_id; + } + } + + if ( empty( $post_ids ) ) { + wp_send_json_error(); + } + + $success = 0; + // For each found attachment, set its thumbnail. + foreach ( $post_ids as $post_id ) { + if ( ! current_user_can( 'edit_post', $post_id ) ) { + continue; + } + + if ( set_post_thumbnail( $post_id, $thumbnail_id ) ) { + $success++; + } + } + + if ( 0 === $success ) { + wp_send_json_error(); + } else { + wp_send_json_success(); + } + + wp_send_json_error(); +} + /** * Ajax handler for date formatting. * diff --git a/src/wp-admin/includes/media.php b/src/wp-admin/includes/media.php index d2cfb5cdf6..69e7820243 100644 --- a/src/wp-admin/includes/media.php +++ b/src/wp-admin/includes/media.php @@ -2642,6 +2642,11 @@ function edit_form_image_editor( $post ) { $attr['height'] = $h; } + $thumb_id = get_post_thumbnail_id( $attachment_id ); + if ( ! empty( $thumb_id ) ) { + $attr['poster'] = wp_get_attachment_url( $thumb_id ); + } + echo wp_video_shortcode( $attr ); endif; ?> diff --git a/src/wp-includes/js/media-audiovideo.js b/src/wp-includes/js/media-audiovideo.js index 7af10bfb89..0c6f31e5b3 100644 --- a/src/wp-includes/js/media-audiovideo.js +++ b/src/wp-includes/js/media-audiovideo.js @@ -692,10 +692,23 @@ renderSelectPosterImageToolbar: function() { this.setPrimaryButton( l10n.videoSelectPosterImageTitle, function( controller, state ) { - var attachment = state.get( 'selection' ).single(); + var urls = [], attachment = state.get( 'selection' ).single(); controller.media.set( 'poster', attachment.get( 'url' ) ); state.trigger( 'set-poster-image', controller.media.toJSON() ); + + _.each( wp.media.view.settings.embedExts, function (ext) { + if ( controller.media.get( ext ) ) { + urls.push( controller.media.get( ext ) ); + } + } ); + + wp.ajax.send( 'set-attachment-thumbnail', { + data : { + urls: urls, + thumbnail_id: attachment.get( 'id' ) + } + } ); } ); }, diff --git a/src/wp-includes/media.php b/src/wp-includes/media.php index ce573f322b..2b12283537 100644 --- a/src/wp-includes/media.php +++ b/src/wp-includes/media.php @@ -3218,3 +3218,28 @@ function wp_maybe_generate_attachment_metadata( $attachment ) { } } } + +/** + * Try to convert an attachment URL into a post ID. + * + * @since 4.0.0 + * + * @global wpdb $wpdb WordPress database access abstraction object. + * @param string $url The URL to resolve. + * @return int The found post_id. + */ +function attachment_url_to_postid( $url ) { + global $wpdb; + + $dir = wp_upload_dir(); + $path = ltrim( $url, $dir['baseurl'] . '/' ); + + $sql = $wpdb->prepare( + "SELECT post_id FROM $wpdb->postmeta WHERE meta_key = '_wp_attached_file' AND meta_value = %s", + $path + ); + $post_id = $wpdb->get_var( $sql ); + if ( ! empty( $post_id ) ) { + return (int) $post_id; + } +} \ No newline at end of file