Make WordPress Core

Ticket #20564: 20564-6.patch

File 20564-6.patch, 8.3 KB (added by azaozz, 12 years ago)
  • wp-admin/includes/post.php

     
    12791279                $new_autosave['ID'] = $old_autosave->ID;
    12801280                $new_autosave['post_author'] = $post_author;
    12811281
    1282                 // Auto-save revisioned meta fields too.
    1283                 foreach ( _wp_post_revision_meta_keys() as $meta_key ) {
    1284                         if ( ! isset( $_POST[ $meta_key ] ) )
    1285                                 continue;
     1282                // Auto-save revisioned meta fields.
     1283                if ( ! empty( $_POST['post_format'] ) && in_array( $_POST['post_format'], array_keys( get_post_format_strings() ) ) ) {
     1284                        $post_format = $_POST['post_format'];
    12861285
    1287                         // Use the underlying delete_metadata and add_metadata vs delete_post_meta
    1288                         // and add_post_meta to make sure we're working with the actual revision meta.
    1289                         delete_metadata( 'post', $new_autosave['ID'], $meta_key );
    1290                         add_metadata( 'post', $new_autosave['ID'], $meta_key, $_POST[ $meta_key ] );
     1286                        if ( $meta_keys = _wp_post_revision_meta_keys( $post_format ) ) {
     1287                                foreach ( $meta_keys as $meta_key ) {
     1288                                        // Don't add the meta if there is no data.
     1289                                        if ( empty( $_POST[ $meta_key ] ) )
     1290                                                continue;
     1291
     1292                                        // Use the underlying delete_metadata and add_metadata vs delete_post_meta
     1293                                        // and add_post_meta to make sure we're working with the actual revision meta.
     1294                                        delete_metadata( 'post', $new_autosave['ID'], $meta_key );
     1295                                        add_metadata( 'post', $new_autosave['ID'], $meta_key, $_POST[ $meta_key ] );
     1296                                }
     1297                        }
     1298                        // Save the current post format as revision meta
     1299                        add_metadata( 'post', $new_autosave['ID'], '_revision_format', $post_format );
    12911300                }
    12921301
    12931302                return wp_update_post( $new_autosave );
  • wp-includes/js/autosave.js

     
    292292(function($){
    293293// Returns the data for saving in both localStorage and autosaves to the server
    294294wp.autosave.getPostData = function() {
    295         var ed = typeof tinymce != 'undefined' ? tinymce.activeEditor : null, post_name, parent_id, cats = [],
     295        var ed = typeof tinymce != 'undefined' ? tinymce.activeEditor : null, post_name, parent_id, post_format, cats = [],
    296296                data = {
    297297                        action: 'autosave',
    298298                        autosave: true,
     
    351351        if ( $('#auto_draft').val() == '1' )
    352352                data['auto_draft'] = '1';
    353353
     354        post_format = $('.post-format-options a.active').attr('data-wp-format');
     355        if ( post_format && post_format != 'standard' )
     356                data['post_format'] = post_format;
     357
    354358        return data;
    355359}
    356360
  • wp-includes/post-formats.php

     
    5151 * @since 3.1.0
    5252 *
    5353 * @param int|object $post The post for which to assign a format
    54  * @param string $format  A format to assign. Use an empty string or array to remove all formats from the post.
     54 * @param string $format  A format to assign. Empty or invalid value will remove the format from the post.
    5555 * @return mixed WP_Error on error. Array of affected term IDs on success.
    5656 */
    5757function set_post_format( $post, $format ) {
  • wp-includes/revision.php

     
    6767 * @access private
    6868 * @return array An array of meta keys that should be revisioned.
    6969 */
    70 function _wp_post_revision_meta_keys() {
    71         return array(
    72                 '_wp_format_url',
    73                 '_wp_format_quote',
    74                 '_wp_format_quote_source',
    75                 '_wp_format_image',
    76                 '_wp_format_gallery',
    77                 '_wp_format_audio',
    78                 '_wp_format_video',
     70function _wp_post_revision_meta_keys( $post_format ) {
     71        $keys = array(
     72                'quote' => array( '_wp_format_quote', '_wp_format_quote_source', '_wp_format_url' ),
     73                'link' => array( '_wp_format_url' ),
     74                'image' => array( '_wp_format_image', '_wp_format_url' ),
     75                'gallery' => array( '_wp_format_gallery' ),
     76                'video' => array( '_wp_format_video' ),
     77                'audio' => array( '_wp_format_audio' ),
    7978        );
     79
     80        return isset( $keys[ $post_format ] ) ? $keys[ $post_format ] : false;
    8081}
    8182
    8283/**
     
    132133                                }
    133134                        }
    134135
    135                         // Check whether revisioned meta fields have changed.
    136                         foreach ( _wp_post_revision_meta_keys() as $meta_key ) {
    137                                 if ( get_post_meta( $post->ID, $meta_key ) != get_post_meta( $last_revision->ID, $meta_key ) ) {
    138                                         $post_has_changed = true;
    139                                         break;
     136                        // Check whether post format meta has changed.
     137                        if ( ! $post_has_changed && ( $post_format = get_post_format( $post ) ) && ( $meta_keys = _wp_post_revision_meta_keys( $post_format ) ) ) {
     138                                foreach ( $meta_keys as $meta_key ) {
     139                                        if ( get_post_meta( $post->ID, $meta_key, true ) != get_post_meta( $last_revision->ID, $meta_key, true ) ) {
     140                                                $post_has_changed = true;
     141                                                break;
     142                                        }
    140143                                }
    141144                        }
    142145
     
    278281        if ( $revision_id )
    279282                do_action( '_wp_put_post_revision', $revision_id );
    280283
    281         // Save revisioned meta fields.
    282         foreach ( _wp_post_revision_meta_keys() as $meta_key ) {
    283                 $meta_values = get_post_meta( $post_id, $meta_key );
    284                 if ( false === $meta_values )
    285                         continue;
     284        // Save revisioned post formats meta.
     285        if ( $post_format = get_post_format( $post_id ) ) {
     286                if ( $meta_keys = _wp_post_revision_meta_keys( $post_format ) ) {
     287                        foreach ( $meta_keys as $meta_key ) {
     288                                // There can be only one meta field per $meta_key
     289                                $meta_value = get_post_meta( $post_id, $meta_key, true );
    286290
    287                 // Use the underlying add_metadata vs add_post_meta to make sure
    288                 // metadata is added to the revision post and not its parent.
    289                 foreach ( $meta_values as $meta_value )
    290                         add_metadata( 'post', $revision_id, $meta_key, $meta_value );
     291                                // Don't add the meta if there is no data.
     292                                if ( empty( $meta_value ) )
     293                                        continue;
     294
     295                                // Use the underlying add_metadata vs add_post_meta to make sure
     296                                // metadata is added to the revision post and not its parent.
     297                                add_metadata( 'post', $revision_id, $meta_key, $meta_value );
     298                        }
     299                }
     300                // Save the current post format as revision meta
     301                add_metadata( 'post', $revision_id, '_revision_format', $post_format );
    291302        }
    292303
    293304        return $revision_id;
     
    361372                return false;
    362373
    363374        $update['ID'] = $revision['post_parent'];
    364 
    365375        $update = wp_slash( $update ); //since data is from db
    366376
    367         // Restore revisioned meta fields.
    368         foreach ( _wp_post_revision_meta_keys() as $meta_key ) {
    369                 delete_post_meta( $update['ID'], $meta_key );
    370                 $meta_values = get_post_meta( $revision['ID'], $meta_key );
    371                 if ( false === $meta_values )
    372                         continue;
    373 
    374                 foreach ( $meta_values as $meta_value )
    375                         add_post_meta( $update['ID'], $meta_key, $meta_value );
    376         }
    377 
    378377        $post_id = wp_update_post( $update );
    379378        if ( is_wp_error( $post_id ) )
    380379                return $post_id;
     
    382381        if ( $post_id )
    383382                do_action( 'wp_restore_post_revision', $post_id, $revision['ID'] );
    384383
     384        // Restore the post format
     385        $post_format = get_post_meta( $revision['ID'], '_revision_format', true );
     386        set_post_format( $post_id, $post_format );
     387
     388        // Restore revisioned post formats meta.
     389        if ( $meta_keys = _wp_post_revision_meta_keys( $post_format ) ) {
     390                foreach ( $meta_keys as $meta_key ) {
     391                        // There can be only one meta field per $meta_key
     392                        $meta_value = get_post_meta( $revision['ID'], $meta_key, true );
     393
     394                        if ( empty( $meta_value ) )
     395                                continue;
     396
     397                        update_post_meta( $post_id, $meta_key, $meta_value );
     398                }
     399        }
     400
    385401        $restore_details = array(
    386402                'restored_revision_id' => $revision_id,
    387403                'restored_by_user' => get_current_user_id(),
    388404                'restored_time' => time()
    389405        );
     406
    390407        update_post_meta( $post_id, '_post_restored_from', $restore_details );
    391408
    392409        return $post_id;
     
    530547 */
    531548function _wp_preview_meta_filter( $value, $object_id, $meta_key, $single ) {
    532549        $post = get_post();
     550        $meta_keys = array(
     551                '_wp_format_url',
     552                '_wp_format_quote',
     553                '_wp_format_quote_source',
     554                '_wp_format_image',
     555                '_wp_format_gallery',
     556                '_wp_format_audio',
     557                '_wp_format_video'
     558        );
    533559
    534         if ( $post->ID != $object_id || ! in_array( $meta_key, _wp_post_revision_meta_keys() ) || 'revision' == $post->post_type )
     560        if ( $post->ID != $object_id || ! in_array( $meta_key, $meta_keys ) || 'revision' == $post->post_type )
    535561                return $value;
    536562
    537563        $preview = wp_get_post_autosave( $post->ID );