WordPress.org

Make WordPress Core

Ticket #20564: 20564-9.patch

File 20564-9.patch, 7.0 KB (added by adamsilverstein, 8 years ago)

reintroduce changes removed in 24397

  • wp-includes/js/autosave.js

     
    322322(function($){
    323323// Returns the data for saving in both localStorage and autosaves to the server
    324324wp.autosave.getPostData = function() {
    325         var ed = typeof tinymce != 'undefined' ? tinymce.activeEditor : null, post_name, parent_id, cats = [],
     325        var ed = typeof tinymce != 'undefined' ? tinymce.activeEditor : null, post_name, parent_id, post_format, cats = [],
    326326                data = {
    327327                        action: 'autosave',
    328328                        autosave: true,
     
    381381        if ( $('#auto_draft').val() == '1' )
    382382                data['auto_draft'] = '1';
    383383
     384        post_format = $('#post_format').val() || '';
     385        data['post_format'] = post_format == 'standard' ? '' : post_format;
     386
     387        // Add the post format selected on the edit screen.
     388        $('#post-formats-select').find('input[name="post_format"]').each( function(i, field) {
     389                data[ field.name ] = $(field).is(':checked') || '';
     390        });
     391
    384392        return data;
    385393};
    386394
  • wp-includes/revision.php

     
    5959}
    6060
    6161/**
     62 * Determines which post meta fields are revisioned.
     63 *
     64 * @since 3.6
     65 * @access private
     66 * @return array An array of meta keys that should be revisioned.
     67 */
     68function _wp_post_revision_meta_keys() {
     69        $keys = array(
     70                '_wp_format_url',
     71                '_wp_format_quote',
     72                '_wp_format_quote_source',
     73                '_wp_format_image',
     74                '_wp_format_gallery',
     75                '_wp_format_audio',
     76                '_wp_format_video',
     77        );
     78        return $keys;
     79}
     80
     81/**
    6282 * Saves an already existing post as a post revision.
    6383 *
    6484 * Typically used immediately after post updates.
     
    102122                if ( isset( $last_revision ) && apply_filters( 'wp_save_post_revision_check_for_changes', true, $last_revision, $post ) ) {
    103123                        $post_has_changed = false;
    104124
     125                        // Check whether revisioned fields have been changed
    105126                        foreach ( array_keys( _wp_post_revision_fields() ) as $field ) {
    106127                                if ( normalize_whitespace( $post->$field ) != normalize_whitespace( $last_revision->$field ) ) {
    107128                                        $post_has_changed = true;
    108129                                        break;
    109130                                }
    110131                        }
    111                         //don't save revision if post unchanged
     132
     133                        // Check whether revisioned meta fields have changed
     134                        foreach ( _wp_post_revision_meta_keys() as $meta_key ) {
     135                                if ( get_post_meta( $post->ID, $meta_key ) != get_post_meta( $last_revision->ID, $meta_key ) ) {
     136                                        $post_has_changed = true;
     137                                        break;
     138                                }
     139                        }
     140
     141                        // Check whether the post format has changed
     142                        if ( get_post_format( $post->ID ) != get_post_meta( $last_revision->ID, '_revision_post_format', true ) )
     143                                $post_has_changed = true;
     144
     145                        // Don't save revision if post unchanged
    112146                        if( ! $post_has_changed )
    113147                                return;
    114148                }
     
    240274        if ( $revision_id )
    241275                do_action( '_wp_put_post_revision', $revision_id );
    242276
    243         return $revision_id;
    244 }
     277        // Save revisioned meta fields.
     278        foreach ( _wp_post_revision_meta_keys() as $meta_key ) {
     279                $meta_value = get_post_meta( $post_id, $meta_key, true );
     280                if ( empty( $meta_value ) )
     281                        continue;
     282                // Use the underlying add_metadata vs add_post_meta to make sure
     283                // metadata is added to the revision post and not its parent.
     284                add_metadata( 'post', $revision_id, $meta_key, wp_slash( $meta_value ) );
     285        }
     286        // Save the post format
     287        if ( $post_format = get_post_format( $post_id ) )
     288                add_metadata( 'post', $revision_id, '_revision_post_format', $post_format );
    245289
     290                return $revision_id;
     291        }
     292
    246293/**
    247294 * Gets a post revision.
    248295 *
     
    308355
    309356        $update['ID'] = $revision['post_parent'];
    310357
     358        // Restore revisioned meta fields.
     359        foreach ( _wp_post_revision_meta_keys() as $meta_key ) {
     360                $meta_value = get_post_meta( $revision['ID'], $meta_key, true );
     361                if ( empty( $meta_value ) )
     362                        $meta_value = '';
     363                // Add slashes to data pulled from the db
     364                update_post_meta( $update['ID'], $meta_key, wp_slash( $meta_value ) );
     365        }
     366
    311367        $update = wp_slash( $update ); //since data is from db
     368        // Restore post format
     369        set_post_format( $update['ID'], get_post_meta( $revision['ID'], '_revision_post_format', true ) );
    312370
     371        // Restore revisioned meta fields.
     372        foreach ( _wp_post_revision_meta_keys() as $meta_key ) {
     373                delete_post_meta( $update['ID'], $meta_key );
     374                $meta_values = get_post_meta( $revision['ID'], $meta_key );
     375                if ( false === $meta_values )
     376                        continue;
     377
     378                foreach ( $meta_values as $meta_value )
     379                        add_post_meta( $update['ID'], $meta_key, $meta_value );
     380        }
     381
    313382        $post_id = wp_update_post( $update );
    314383        if ( ! $post_id || is_wp_error( $post_id ) )
    315384                return $post_id;
     
    449518        $post->post_excerpt = $preview->post_excerpt;
    450519
    451520        add_filter( 'get_the_terms', '_wp_preview_terms_filter', 10, 3 );
     521        add_filter( 'get_post_metadata', '_wp_preview_meta_filter', 10, 4 );
    452522
    453523        return $post;
    454524}
     
    472542}
    473543
    474544/**
     545 * Filters post meta retrieval to get values from the actual autosave post,
     546 * and not its parent. Filters revisioned meta keys only.
     547 *
     548 * @since 3.6.0
     549 * @access private
     550 */
     551function _wp_preview_meta_filter( $value, $object_id, $meta_key, $single ) {
     552        $post = get_post();
     553        if ( empty( $post ) || $post->ID != $object_id || ! in_array( $meta_key, _wp_post_revision_meta_keys() ) || 'revision' == $post->post_type )
     554                return $value;
     555        $preview = wp_get_post_autosave( $post->ID );
     556        if ( ! is_object( $preview ) )
     557                return $value;
     558        return get_post_meta( $preview->ID, $meta_key, $single );
     559}
     560
     561/**
    475562 * Filters terms lookup to set the post format.
    476563 *
    477564 * @since 3.6.0
  • wp-admin/includes/post.php

     
    13271327                $new_autosave['ID'] = $old_autosave->ID;
    13281328                $new_autosave['post_author'] = $post_author;
    13291329
     1330                // Auto-save revisioned meta fields.
     1331                foreach ( _wp_post_revision_meta_keys() as $meta_key ) {
     1332                        if ( isset( $_POST[ $meta_key ] ) && get_post_meta( $new_autosave['ID'], $meta_key, true ) != $_POST[ $meta_key ] ) {
     1333                                // Use the underlying delete_metadata and add_metadata vs delete_post_meta
     1334                                // and add_post_meta to make sure we're working with the actual revision meta.
     1335                                delete_metadata( 'post', $new_autosave['ID'], $meta_key );
     1336                                if ( ! empty( $_POST[ $meta_key ] ) )
     1337                                        add_metadata( 'post', $new_autosave['ID'], $meta_key, $_POST[ $meta_key ] );
     1338                        }
     1339                }
     1340
     1341                // Save the post format as part of the autosave if different.
     1342                if ( isset( $_POST['post_format'] ) && get_post_meta( $new_autosave['ID'], '_revision_post_format', true ) != $_POST['post_format'] ) {
     1343                        delete_metadata( 'post', $new_autosave['ID'], '_revision_post_format' );
     1344                        if ( ! empty( $_POST['post_format'] ) )
     1345                                update_metadata( 'post', $new_autosave['ID'], '_revision_post_format', $_POST['post_format'] );
     1346                }
     1347
    13301348                // If the new autosave is the same content as the post, delete the old autosave.
    13311349                $post = get_post( $post_id );
    13321350                $autosave_is_different = false;