WordPress.org

Make WordPress Core

Changeset 38118


Ignore:
Timestamp:
07/20/16 16:23:36 (17 months ago)
Author:
joemcgill
Message:

Post Thumbnails: Only update featured images when saving a post.

Previously, changing the post thumbnail of a published post in the edit screen
would immediately apply the change, rather than waiting for the post to be
saved before applying the update. This could lead to someone unintentionally
editing the post thumbnail on a published post, and made it impossible to
preview changes to post thumbnails on published posts before saving the change.

This introduces a new Ajax handler, wp_ajax_get_post_thumbnail_html() to
retrieve the HTML for the post thumbnail meta box without updating the post
meta value for _thumbnail_id. It also allows post thumbnail changes to be
previewed by passing the _thumbnail_id as a query variable to the preview
screen and adding a new filter, _wp_preview_post_thumbnail_filter(), which
gets applied to get_post_metadata during the post preview process.

Props flixos90.
Fixes #12922.

Location:
trunk/src
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-admin/admin-ajax.php

    r38028 r38118  
    6565    'press-this-add-category', 'crop-image', 'generate-password', 'save-wporg-username', 'delete-plugin', 
    6666    'search-plugins', 'search-install-plugins', 'activate-plugin', 'update-theme', 'delete-theme', 
    67     'install-theme', 'test_url', 
     67    'install-theme', 'test_url', 'get-post-thumbnail-html', 
    6868); 
    6969 
  • trunk/src/wp-admin/includes/ajax-actions.php

    r38091 r38118  
    21652165 
    21662166/** 
     2167 * Ajax handler for retrieving HTML for the featured image. 
     2168 * 
     2169 * @since 4.6.0 
     2170 */ 
     2171function wp_ajax_get_post_thumbnail_html() { 
     2172    $post_ID = intval( $_POST['post_id'] ); 
     2173 
     2174    check_ajax_referer( "update-post_$post_ID" ); 
     2175 
     2176    if ( ! current_user_can( 'edit_post', $post_ID ) ) { 
     2177        wp_die( -1 ); 
     2178    } 
     2179 
     2180    $thumbnail_id = intval( $_POST['thumbnail_id'] ); 
     2181 
     2182    // For backward compatibility, -1 refers to no featured image. 
     2183    if ( -1 === $thumbnail_id ) { 
     2184        $thumbnail_id = null; 
     2185    } 
     2186 
     2187    $return = _wp_post_thumbnail_html( $thumbnail_id, $post_ID ); 
     2188    wp_send_json_success( $return ); 
     2189} 
     2190 
     2191/** 
    21672192 * Ajax handler for setting the featured image for an attachment. 
    21682193 * 
  • trunk/src/wp-admin/includes/post.php

    r38029 r38118  
    14291429            ); 
    14301430            $content .= '<p class="hide-if-no-js howto" id="set-post-thumbnail-desc">' . __( 'Click the image to edit or update' ) . '</p>'; 
    1431             $content .= '<p class="hide-if-no-js"><a href="#" id="remove-post-thumbnail" onclick="WPRemoveThumbnail(\'' . $ajax_nonce . '\');return false;">' . esc_html( $post_type_object->labels->remove_featured_image ) . '</a></p>'; 
    1432         } 
    1433     } 
     1431            $content .= '<p class="hide-if-no-js"><a href="#" id="remove-post-thumbnail">' . esc_html( $post_type_object->labels->remove_featured_image ) . '</a></p>'; 
     1432        } 
     1433    } 
     1434 
     1435    $content .= '<input type="hidden" id="_thumbnail_id" name="_thumbnail_id" value="' . esc_attr( $thumbnail_id ? $thumbnail_id : '-1' ) . '" />'; 
    14341436 
    14351437    /** 
     
    17541756        $query_args['preview_nonce'] = wp_create_nonce( 'post_preview_' . $post->ID ); 
    17551757 
    1756         if ( isset( $_POST['post_format'] ) ) 
     1758        if ( isset( $_POST['post_format'] ) ) { 
    17571759            $query_args['post_format'] = empty( $_POST['post_format'] ) ? 'standard' : sanitize_key( $_POST['post_format'] ); 
     1760        } 
     1761 
     1762        if ( isset( $_POST['_thumbnail_id'] ) ) { 
     1763            $query_args['_thumbnail_id'] = ( intval( $_POST['_thumbnail_id'] ) <= 0 ) ? '-1' : intval( $_POST['_thumbnail_id'] ); 
     1764        } 
    17581765    } 
    17591766 
  • trunk/src/wp-includes/js/media-editor.js

    r38065 r38118  
    658658            settings.post.featuredImageId = id; 
    659659 
    660             wp.media.post( 'set-post-thumbnail', { 
    661                 json:         true, 
     660            wp.media.post( 'get-post-thumbnail-html', { 
    662661                post_id:      settings.post.id, 
    663662                thumbnail_id: settings.post.featuredImageId, 
    664663                _wpnonce:     settings.post.nonce 
    665664            }).done( function( html ) { 
     665                if ( html == '0' ) { 
     666                    window.alert( window.setPostThumbnailL10n.error ); 
     667                    return; 
     668                } 
    666669                $( '.inside', '#postimagediv' ).html( html ); 
    667670            }); 
     671        }, 
     672        /** 
     673         * Remove the featured image id, save the post thumbnail data and 
     674         * set the HTML in the post meta box to no featured image. 
     675         */ 
     676        remove: function() { 
     677            wp.media.featuredImage.set( -1 ); 
    668678        }, 
    669679        /** 
     
    744754                wp.media.featuredImage.frame().open(); 
    745755            }).on( 'click', '#remove-post-thumbnail', function() { 
    746                 wp.media.view.settings.post.featuredImageId = -1; 
     756                wp.media.featuredImage.remove(); 
     757                return false; 
    747758            }); 
    748759        } 
  • trunk/src/wp-includes/post.php

    r38076 r38118  
    32613261    } 
    32623262 
     3263    // Set or remove featured image. 
     3264    if ( isset( $postarr['_thumbnail_id'] ) && ( post_type_supports( $post_type, 'thumbnail' ) || 'revision' === $post_type ) ) { 
     3265        $thumbnail_id = intval( $postarr['_thumbnail_id'] ); 
     3266        if ( -1 === $thumbnail_id ) { 
     3267            delete_post_thumbnail( $post_ID ); 
     3268        } else { 
     3269            set_post_thumbnail( $post_ID, $thumbnail_id ); 
     3270        } 
     3271    } 
     3272 
    32633273    if ( ! empty( $postarr['meta_input'] ) ) { 
    32643274        foreach ( $postarr['meta_input'] as $field => $value ) { 
  • trunk/src/wp-includes/revision.php

    r37914 r38118  
    531531 
    532532    add_filter( 'get_the_terms', '_wp_preview_terms_filter', 10, 3 ); 
     533    add_filter( 'get_post_metadata', '_wp_preview_post_thumbnail_filter', 10, 3 ); 
    533534 
    534535    return $post; 
     
    576577 
    577578    return $terms; 
     579} 
     580 
     581/** 
     582 * Filters post thumbnail lookup to set the post thumbnail. 
     583 * 
     584 * @since 4.6.0 
     585 * @access private 
     586 * 
     587 * @param null|array|string $value    The value to return - a single metadata value, or an array of values. 
     588 * @param int               $post_id  Post ID. 
     589 * @param string            $meta_key Meta key. 
     590 * @return null|array The default return value or the post thumbnail meta array. 
     591 */ 
     592function _wp_preview_post_thumbnail_filter( $value, $post_id, $meta_key ) { 
     593    if ( ! $post = get_post() ) { 
     594        return $value; 
     595    } 
     596 
     597    if ( empty( $_REQUEST['_thumbnail_id'] ) || $post->ID != $post_id || '_thumbnail_id' != $meta_key || 'revision' == $post->post_type ) { 
     598        return $value; 
     599    } 
     600 
     601    $thumbnail_id = intval( $_REQUEST['_thumbnail_id'] ); 
     602    if ( $thumbnail_id <= 0 ) { 
     603        return ''; 
     604    } 
     605 
     606    return strval( $thumbnail_id ); 
    578607} 
    579608 
Note: See TracChangeset for help on using the changeset viewer.