WordPress.org

Make WordPress Core

Ticket #23497: 23497.19.diff

File 23497.19.diff, 36.0 KB (added by adamsilverstein, 2 years ago)

fix restore issue

  • wp-includes/post-template.php

     
    14681468        else : 
    14691469                echo "<ul class='post-revisions'>\n"; 
    14701470                echo $rows; 
     1471 
     1472                // 
     1473                // if the post was previously restored from a revision 
     1474                // show the restore event details 
     1475                // 
     1476                if ( $restored_from_meta = get_post_meta( $post->ID, '_post_restored_from', true ) ) {  
     1477                        $author = get_the_author_meta( 'display_name', $restored_from_meta[ 'restored_by_user' ] );  
     1478                        /* translators: revision date format, see http://php.net/date */  
     1479                        $datef = _x( 'j F, Y @ G:i:s', 'revision date format');  
     1480                        $date = date_i18n( $datef, strtotime( $restored_from_meta[ 'restored_time' ] ) );  
     1481                        $timesince = human_time_diff( $restored_from_meta[ 'restored_time' ], current_time( 'timestamp' ) ) . __( ' ago ' );  
     1482                        ?>  
     1483                        <hr /> 
     1484                        <div id="revisions-meta-restored">  
     1485                                <?php  
     1486                                printf( 'Previously restored from Revision ID %d, %s by %s (%s)',  
     1487                                $restored_from_meta[ 'restored_revision_id'],  
     1488                                $timesince,  
     1489                                $author,  
     1490                                $date );  
     1491                                ?>  
     1492                        </div>  
     1493                        <?php  
    14711494                echo "</ul>"; 
     1495                }  
     1496 
    14721497        endif; 
    14731498 
    14741499} 
  • wp-includes/pluggable.php

     
    17191719 
    17201720        $r  = "<table class='diff'>\n"; 
    17211721 
    1722         if ( isset( $args[ 'showsplitview' ] ) && 'true' == $args[ 'showsplitview' ] ) { 
     1722        if ( ! empty( $args[ 'show_split_view' ] ) ) { 
    17231723                $r .= "<col class='content diffsplit left' /><col class='content diffsplit middle' /><col class='content diffsplit right' />"; 
    17241724        } else { 
    17251725                $r .= "<col class='content' />"; 
  • wp-admin/includes/ajax-actions.php

     
    21312131function wp_ajax_revisions_data() { 
    21322132        check_ajax_referer( 'revisions-ajax-nonce', 'nonce' ); 
    21332133 
    2134         $compareto = isset( $_GET['compareto'] ) ? absint( $_GET['compareto'] ) : 0; 
    2135         $showautosaves = isset( $_GET['showautosaves'] ) ? $_GET['showautosaves'] : ''; 
    2136         $showsplitview = isset( $_GET['showsplitview'] ) ? $_GET['showsplitview'] : ''; 
    2137         $postid = isset( $_GET['post_id'] ) ? absint( $_GET['post_id'] ) : ''; 
     2134        $compare_to = isset( $_GET['compare_to'] ) ? absint( $_GET['compare_to'] ) : 0; 
     2135        $show_autosaves = isset( $_GET['show_autosaves'] ) ? $_GET['show_autosaves'] : ''; 
     2136        $show_split_view = isset( $_GET['show_split_view'] ) ? $_GET['show_split_view'] : ''; 
     2137        $post_id = isset( $_GET['post_id'] ) ? absint( $_GET['post_id'] ) : ''; 
     2138        $right_handle_at = isset( $_GET['right_handle_at'] ) ? $_GET['right_handle_at'] : 0; 
     2139        $left_handle_at = isset( $_GET['left_handle_at'] ) ? $_GET['left_handle_at'] : 0; 
     2140        $single_revision_id = isset( $_GET['single_revision_id'] ) ? $_GET['single_revision_id'] : 0; 
    21382141 
    2139         $comparetwomode = ( '' == $postid ) ? false : true; 
     2142        $compare_two_mode = ( '' == $post_id ) ? false : true; 
    21402143        // 
    2141         //TODO: currently code returns all possible comparisons for the indicated 'compareto' revision 
     2144        //TODO: currently code returns all possible comparisons for the indicated 'compare_to' revision 
    21422145        //however, the front end prevents users from pulling the right handle past the left or the left pass the right, 
    21432146        //so only the possible diffs need be generated 
    21442147        // 
    21452148        $alltherevisions = array(); 
    2146         if ( '' == $postid ) 
    2147                 $postid = $compareto; 
     2149        if ( '' == $post_id ) 
     2150                $post_id = $compare_to; 
    21482151 
    2149         if ( ! current_user_can( 'read_post', $postid ) ) 
     2152        if ( ! current_user_can( 'read_post', $post_id ) ) 
    21502153                continue; 
    21512154 
    2152         if ( ! $revisions = wp_get_post_revisions( $postid ) ) 
     2155        if ( ! $revisions = wp_get_post_revisions( $post_id ) ) 
    21532156                return; 
    21542157 
     2158        /* translators: revision date format, see http://php.net/date */ 
     2159        $datef = _x( 'j F, Y @ G:i:s', 'revision date format'); 
    21552160 
    2156         //if we are comparing two revisions, the first 'revision' represented by the leftmost 
    2157         //slider position is the current revision, prepend a comparison to this revision 
    2158         if ( $comparetwomode ) 
    2159                 array_unshift( $revisions, get_post( $postid ) ); 
     2161        //single model fetch mode 
     2162        if ( 0 != $single_revision_id ) { 
     2163                $left_revision = get_post( $compare_to ); 
     2164                $right_revision = get_post( $single_revision_id ); 
    21602165 
    2161         $count = 1; 
    2162         foreach ( $revisions as $revision ) : 
    2163         if ( 'true' != $showautosaves && wp_is_post_autosave( $revision ) ) 
    2164                         continue; 
     2166                if ( $compare_two_mode ) { 
     2167                        $compare_to_gravatar = get_avatar( $left_revision->post_author, 18 ); 
     2168                        $compare_to_author = get_the_author_meta( 'display_name', $left_revision->post_author ); 
     2169                        $compare_to_date = date_i18n( $datef, strtotime( $left_revision->post_modified ) ); 
    21652170 
    2166         $revision_from_date_author = ''; 
     2171                        $revision_from_date_author = sprintf( 
     2172                                '%s %s, %s %s (%s)', 
     2173                                $compare_to_gravatar, 
     2174                                $compare_to_author, 
     2175                                human_time_diff( strtotime( $left_revision->post_modified ), current_time( 'timestamp' ) ), 
     2176                                __( ' ago ' ), 
     2177                                $compare_to_date 
     2178                        ); 
     2179                } 
    21672180 
     2181                // 
     2182                //make sure the left revision is the most recent 
     2183                // 
     2184                if ( strtotime( $right_revision->post_modified_gmt ) < strtotime( $left_revision->post_modified_gmt ) ) { 
     2185                        $temp = $left_revision; 
     2186                        $left_revision = $right_revision; 
     2187                        $right_revision = $temp; 
     2188                } 
    21682189 
    2169         $left_revision = get_post( $compareto ); 
    2170         $right_revision = get_post( $revision ); 
     2190                // 
     2191                //compare from left to right, passed from application 
     2192                // 
     2193                $content=''; 
     2194                foreach ( array_keys( _wp_post_revision_fields() ) as $field ) { 
     2195                        $left_content = apply_filters( "_wp_post_revision_field_$field", $left_revision->$field, $field, $left_revision, 'left' ); 
     2196                        $right_content = apply_filters( "_wp_post_revision_field_$field", $right_revision->$field, $field, $right_revision, 'right' ); 
    21712197 
    2172         $author = get_the_author_meta( 'display_name', $revision->post_author ); 
    2173         /* translators: revision date format, see http://php.net/date */ 
    2174         $datef = _x( 'j F, Y @ G:i:s', 'revision date format'); 
     2198                        add_filter( "_wp_post_revision_field_$field", 'wp_kses_post' ); 
    21752199 
    2176         $gravatar = get_avatar( $revision->post_author, 18 ); 
     2200                        $args = array(); 
    21772201 
    2178         $date = date_i18n( $datef, strtotime( $revision->post_modified ) ); 
    2179         $revision_date_author = sprintf( 
    2180                 '%s %s, %s %s (%s)', 
    2181                 $gravatar, 
    2182                 $author, 
    2183                 human_time_diff( strtotime( $revision->post_modified ), current_time( 'timestamp' ) ), 
    2184                 __( ' ago ' ), 
    2185                 $date 
    2186         ); 
     2202                        if ( ! empty( $show_split_view ) ) 
     2203                                 $args = array( 'show_split_view' => true ); 
    21872204 
    2188         if ( $comparetwomode ) { 
    2189                 $compareto_gravatar = get_avatar( $left_revision->post_author, 18 ); 
    2190                 $compareto_author = get_the_author_meta( 'display_name', $left_revision->post_author ); 
    2191                 $compareto_date = date_i18n( $datef, strtotime( $left_revision->post_modified ) ); 
    2192  
    2193                 $revision_from_date_author = sprintf( 
    2194                         '%s %s, %s %s (%s)', 
    2195                         $compareto_gravatar, 
    2196                         $compareto_author, 
    2197                         human_time_diff( strtotime( $left_revision->post_modified ), current_time( 'timestamp' ) ), 
    2198                         __( ' ago ' ), 
    2199                         $compareto_date 
    2200                 ); 
     2205                        $content .= wp_text_diff( $left_content, $right_content, $args ); 
     2206                } 
     2207                        $content = '' == $content ? __( 'No difference' ) : $content; 
     2208                        $alltherevisions = array ( 
     2209                                'revisiondiff' => $content 
     2210                        ); 
     2211                echo json_encode( $alltherevisions ); 
     2212                exit(); 
    22012213        } 
    22022214 
    2203         $restoreaction = wp_nonce_url( 
    2204                 add_query_arg( 
    2205                         array( 'revision' => $revision->ID, 
    2206                                 'action' => 'restore' ), 
    2207                                 '/wp-admin/revision.php' 
    2208                 ), 
    2209                 "restore-post_{$compareto}|{$revision->ID}" 
    2210         ); 
     2215        //if we are comparing two revisions, the first 'revision' represented by the leftmost 
     2216        //slider position is the current revision, prepend a comparison to this revision 
     2217        if ( $compare_two_mode )  
     2218                array_unshift( $revisions, get_post( $post_id ) ); 
     2219                 
     2220        $count = -1; 
    22112221 
    2212         // 
    2213         //make sure the left revision is the most recent 
    2214         // 
    2215         if ( strtotime( $right_revision->post_modified_gmt ) < strtotime( $left_revision->post_modified_gmt ) ) { 
    2216                 $temp = $left_revision; 
    2217                 $left_revision = $right_revision; 
    2218                 $right_revision = $temp; 
    2219         } 
     2222        foreach ( $revisions as $revision ) : 
     2223                if ( ! empty( $show_autosaves ) && wp_is_post_autosave( $revision ) ) 
     2224                                continue; 
    22202225 
    2221         // 
    2222         //compare from left to right, passed from application 
    2223         // 
    2224         $content=''; 
    2225         foreach ( array_keys( _wp_post_revision_fields() ) as $field ) { 
    2226                 $left_content = apply_filters( "_wp_post_revision_field_$field", $left_revision->$field, $field, $left_revision, 'left' ); 
    2227                 $right_content = apply_filters( "_wp_post_revision_field_$field", $right_revision->$field, $field, $right_revision, 'right' ); 
     2226                $revision_from_date_author = ''; 
     2227                $count++; 
     2228                // return blank data for diffs to the left of the left handle (for right handel model) 
     2229                // or to the right of the right handle (for left handel model) 
     2230                if ( ( 0 != $left_handle_at && $count <= $left_handle_at ) ||  
     2231                         ( 0 != $right_handle_at && $count > $right_handle_at )) {  
     2232                        $alltherevisions[] = array ( 
     2233                                'ID' => $revision->ID, 
     2234                        ); 
     2235                         
     2236                        continue; 
     2237                } 
    22282238 
    2229                 add_filter( "_wp_post_revision_field_$field", 'wp_kses_post' ); 
     2239                $gravatar = get_avatar( $revision->post_author, 18 ); 
     2240                $author = get_the_author_meta( 'display_name', $revision->post_author ); 
     2241                $date = date_i18n( $datef, strtotime( $revision->post_modified ) ); 
     2242                $revision_date_author = sprintf( 
     2243                        '%s %s, %s %s (%s)', 
     2244                        $gravatar, 
     2245                        $author, 
     2246                        human_time_diff( strtotime( $revision->post_modified ), current_time( 'timestamp' ) ), 
     2247                        __( ' ago ' ), 
     2248                        $date 
     2249                ); 
    22302250 
    2231                 $args = array(); 
    2232  
    2233                 if ( 'true' == $showsplitview ) 
    2234                          $args = array( 'showsplitview' => 'true' ); 
    2235  
    2236                 $content .= wp_text_diff( $left_content, $right_content, $args ); 
    2237         } 
    2238  
    2239         //if we are comparing two revisions 
    2240         //and we are on the matching revision 
    2241         //add an error revision indicating unable to compare to self 
    2242         if ( $comparetwomode && $compareto == $revision->ID ) 
    2243                 $alltherevisions[] = array ( 
    2244                         'ID' => $revision->ID, 
    2245                         'revision_date_author' => $revision_date_author, 
    2246                         'revisiondiff' => sprintf('<div id="selfcomparisonerror">%s</div>', __( 'Cannot compare revision to itself' ) ), 
    2247                         'restoreaction' => urldecode( $restoreaction ), 
    2248                         'revision_from_date_author' => '' 
     2251                $restoreaction = wp_nonce_url( 
     2252                        add_query_arg( 
     2253                                array( 'revision' => $revision->ID, 
     2254                                        'action' => 'restore' ), 
     2255                                        admin_url( 'revision.php' ) 
     2256                        ), 
     2257                        "restore-post_{$compare_to}|{$revision->ID}" 
    22492258                ); 
    22502259 
    2251         //add to the return data only if there is a difference 
    2252         if ( '' != $content ) 
    22532260                $alltherevisions[] = array ( 
    2254                         'ID' => $revision->ID, 
    2255                         'revision_date_author' => $revision_date_author, 
    2256                         'revisiondiff' => $content, 
    2257                         'restoreaction' => urldecode( $restoreaction ), 
    2258                         'revision_from_date_author' => $revision_from_date_author 
    2259                 ); 
     2261                                'ID' => $revision->ID, 
     2262                                'revision_date_author' => $revision_date_author, 
     2263                                'revision_from_date_author' => $revision_from_date_author, 
     2264                                'restoreaction' => urldecode( $restoreaction ), 
     2265                                'revision_toload' => true 
     2266                        ); 
    22602267 
    22612268        endforeach; 
    22622269 
  • wp-admin/js/revisions.js

     
    66                views : {}, 
    77 
    88                Model : Backbone.Model.extend({ 
     9                        idAttribute : 'ID', 
     10                        urlRoot : ajaxurl +     '?action=revisions-data&compare_to=' + wpRevisionsSettings.post_id + 
     11                                '&show_autosaves=false&show_split_view=true&nonce=' + wpRevisionsSettings.nonce, 
    912                        defaults: { 
    1013                                ID : 0, 
    1114                                revision_date_author : '', 
    12                                 revisiondiff : '', 
    13                                 restoreaction: '', 
    14                                 diff_max : 0, 
    15                                 diff_count : 0, 
    16                                 diff_revision_to : 0, 
     15                                revisiondiff : '<div class="diff-loading"><div class="spinner"></div></div>', 
     16                                restoreaction : '', 
    1717                                revision_from_date_author : '', 
     18                                revision_toload : false 
     19                        }, 
     20 
     21                        url : function() { 
     22                                return this.urlRoot + '&single_revision_id=' + this.id; 
    1823                        } 
     24 
    1925                }), 
    2026 
    2127                app: _.extend({}, Backbone.Events), 
     
    3036                        _left_diff : 0, 
    3137                        _right_diff : 1, 
    3238                        _autosaves : false, 
    33                         _showsplitview : true, 
     39                        _show_split_view : true, 
    3440                        _compareoneortwo : 1, 
    35                         left_model_loading : false,             //keep track of model loads 
    36                         right_model_loading : false,    //disallow slider interaction, also repeat loads, while loading 
     41                        _left_model_loading : false,    //keep track of model loads 
     42                        _right_model_loading : false,   //disallow slider interaction, also repeat loads, while loading 
    3743 
    3844                        //TODO add ability to arrive on specific revision 
    3945                        routes : { 
    40                                 "viewrevision/:revision": "viewrevision", 
    4146                        }, 
    4247 
    4348                        viewrevision : function( revision ) { 
    4449                                //coming soon 
    4550                        }, 
    4651 
     52                        reload_toload_revisions : function( model_collection, reverse_direction ) { 
     53                                var self = this; 
     54                                var revisions_to_load = model_collection.where( { revision_toload : true } ); 
     55                                //console.log(revisions_to_load); 
     56                                var delay=0; 
     57                                _.each(revisions_to_load, function( the_model ) { 
     58                                                the_model.urlRoot = model_collection.url; 
     59                                                _.delay( function() { 
     60                                                        the_model.fetch( { 
     61                                                                update : true, 
     62                                                                add : false, 
     63                                                                remove : false, 
     64                                                                //async : false, 
     65                                                                success : function( model ) { 
     66                                                                        //console.log(model.get( 'ID' ) +'-'+self._revisions.at( self._right_diff ).get( 'ID' )); 
     67                                                                        if ( model.get( 'ID' ) === self._revisions.at( self._right_diff - 1 ).get( 'ID' ) ) { //reload if current model refreshed 
     68                                                                                //console.log('render'); 
     69                                                                                self._revisionView.render(); 
     70                                                                        } 
     71                                                                } 
     72                                                } ); 
     73                                                }, delay ) ; 
     74                                                delay = delay + 200; //stagger model loads by 200 ms to avoid hammering server with requests 
     75                                        } 
     76                                ); 
     77                        }, 
     78 
    4779                        start_left_model_loading : function() { 
    48                                 this.left_model_loading = true; 
     80                                this._left_model_loading = true; 
    4981                                $('.revisiondiffcontainer').addClass('leftmodelloading'); 
    5082                        }, 
    5183 
    5284                        stop_left_model_loading : function() { 
    53                                 this.left_model_loading = false; 
     85                                this._left_model_loading = false; 
    5486                                $('.revisiondiffcontainer').removeClass('leftmodelloading'); 
    5587                        }, 
    5688 
    5789                        start_right_model_loading : function() { 
    58                                 this.right_model_loading = true; 
     90                                this._right_model_loading = true; 
    5991                                $('.revisiondiffcontainer').addClass('rightmodelloading'); 
    6092                        }, 
    6193 
    6294                        stop_right_model_loading : function() { 
    63                                 this.right_model_loading = false; 
     95                                this._right_model_loading = false; 
    6496                                $('.revisiondiffcontainer').removeClass('rightmodelloading'); 
    6597                        }, 
    6698 
    6799                        reloadmodel : function() { 
    68                                 if ( 2 == this._compareoneortwo ) { 
     100                                if ( 2 === this._compareoneortwo ) { 
    69101                                        this.reloadleftright(); 
    70102                                } else { 
    71103                                        this.reloadmodelsingle(); 
     
    74106 
    75107                        reloadmodelsingle : function() { 
    76108                                var self = this; 
    77                                 self._revisions.url = ajaxurl + '?action=revisions-data&compareto=' + wpRevisionsSettings.post_id + 
    78                                                                                         '&showautosaves=' + self.self_autosaves + 
    79                                                                                         '&showsplitview=' +  REVAPP._showsplitview + 
     109                                self._revisions.url = ajaxurl + '?action=revisions-data&compare_to=' + wpRevisionsSettings.post_id + 
     110                                                                                        '&show_autosaves=' + self._autosaves + 
     111                                                                                        '&show_split_view=' +  REVAPP._show_split_view + 
    80112                                                                                        '&nonce=' + wpRevisionsSettings.nonce; 
    81113                                self.start_right_model_loading(); 
    82114                                this._revisions.fetch({ //reload revision data 
     
    85117                                                var revisioncount = self._revisions.length; 
    86118                                                if ( self._right_diff > revisioncount ) //if right handle past rightmost, move 
    87119                                                        self._right_diff = revisioncount; 
    88                                                 //TODO add a test for matchind left revision and push left, testing 
    89                                                 //also reset the slider values here 
    90120 
    91121                                                self._revisionView.render(); 
    92                                                 $( '#slider' ).slider( 'option', 'max', revisioncount-1 ); //TODO test this 
     122                                                self.reload_toload_revisions( self._revisions ); 
     123 
     124                                                $( '#slider' ).slider( 'option', 'max', revisioncount-1 ); //TODO test this, autsaves changed 
    93125                                        }, 
    94126 
    95127                                        error : function () { 
    96128                                                self.stop_right_model_loading(); 
    97                                                 window.console && console.log( 'Error loading revision data' ); 
     129                                                //console.log( 'Error loading revision data' ); 
    98130                                        } 
    99131 
    100132                                }); 
    101133                        }, 
    102134 
    103                         reloadleftright : function() { 
     135                        reloadleft : function() { 
    104136                                var self = this; 
    105137                                self.start_left_model_loading(); 
    106                                 self.start_right_model_loading(); 
    107  
    108138                                self._left_handle_revisions = new wp.revisions.Collection(); 
    109                                 self._right_handle_revisions = new wp.revisions.Collection(); 
    110  
    111                                 if ( 0 == self._left_diff ) { 
    112                                         self._right_handle_revisions.url = 
    113                                                 ajaxurl + 
    114                                                 '?action=revisions-data&compareto=' + wpRevisionsSettings.post_id + 
    115                                                 '&post_id=' + wpRevisionsSettings.post_id + 
    116                                                 '&showautosaves=' + self._autosaves + 
    117                                                 '&showsplitview=' +  self._showsplitview + 
    118                                                 '&nonce=' + wpRevisionsSettings.nonce; 
    119                                 } else { 
    120                                         self._right_handle_revisions.url = 
    121                                                 ajaxurl + 
    122                                                 '?action=revisions-data&compareto=' + self._revisions.at( self._left_diff - 1 ).get( 'ID' ) + 
    123                                                 '&post_id=' + wpRevisionsSettings.post_id + 
    124                                                 '&showautosaves=' + self._autosaves + 
    125                                                 '&showsplitview=' +  self._showsplitview + 
    126                                                 '&nonce=' + wpRevisionsSettings.nonce; 
    127                                 } 
    128  
    129139                                self._left_handle_revisions.url = 
    130140                                        ajaxurl + 
    131                                         '?action=revisions-data&compareto=' + self._revisions.at( self._right_diff - 1 ).get( 'ID' ) + 
     141                                        '?action=revisions-data&compare_to=' + self._revisions.at( self._right_diff - 1 ).get( 'ID' ) + 
    132142                                        '&post_id=' + wpRevisionsSettings.post_id + 
    133                                         '&showautosaves=' + self._autosaves + 
    134                                         '&showsplitview=' +  self._showsplitview + 
    135                                         '&nonce=' + wpRevisionsSettings.nonce; 
     143                                        '&show_autosaves=' + self._autosaves + 
     144                                        '&show_split_view=' +  self._show_split_view + 
     145                                        '&nonce=' + wpRevisionsSettings.nonce + 
     146                                        '&right_handle_at='  + ( self._right_diff ); 
    136147 
    137148                                self._left_handle_revisions.fetch({ 
    138149 
    139                                         xhr: function() { 
    140                                                 var xhr = $.ajaxSettings.xhr(); 
    141                                                 xhr.onprogress = self.handleProgress; 
    142                                                 return xhr; 
    143                                         }, 
    144  
    145                                         handleProgress: function(evt){ 
    146                                                 var percentComplete = 0; 
    147                                                 if (evt.lengthComputable) { 
    148                                                         percentComplete = evt.loaded / evt.total; 
    149                                                         window.console && console.log( Math.round( percentComplete * 100) + "%" ); 
    150                                                 } 
    151                                         }, 
    152  
    153150                                        success : function(){ 
    154151                                                self.stop_left_model_loading(); 
     152                                                self.reload_toload_revisions( self._left_handle_revisions ); 
    155153                                        }, 
    156154 
    157155                                        error : function () { 
    158                                                 window.console && console.log( 'Error loading revision data' ); 
     156                                                //console.log( 'Error loading revision data' ); 
    159157                                                self.stop_left_model_loading(); 
    160158                                        } 
    161159                                }); 
     160                        }, 
    162161 
     162                        reloadright : function() { 
     163                                var self = this; 
     164                                self.start_right_model_loading(); 
     165                                self._right_handle_revisions = new wp.revisions.Collection(); 
     166                                if ( 0 === self._left_diff ) { 
     167                                        self._right_handle_revisions.url = 
     168                                                ajaxurl + 
     169                                                '?action=revisions-data&compare_to=' + wpRevisionsSettings.post_id + 
     170                                                '&post_id=' + wpRevisionsSettings.post_id + 
     171                                                '&show_autosaves=' + self._autosaves + 
     172                                                '&show_split_view=' +  self._show_split_view + 
     173                                                '&nonce=' + wpRevisionsSettings.nonce; 
     174                                } else { 
     175                                        self._right_handle_revisions.url = 
     176                                                ajaxurl + 
     177                                                '?action=revisions-data&compare_to=' + self._revisions.at( self._left_diff - 1 ).get( 'ID' ) + 
     178                                                '&post_id=' + wpRevisionsSettings.post_id + 
     179                                                '&show_autosaves=' + self._autosaves + 
     180                                                '&show_split_view=' +  self._show_split_view + 
     181                                                '&nonce=' + wpRevisionsSettings.nonce + 
     182                                                '&left_handle_at=' + (self._left_diff ) ; 
     183                                } 
     184 
    163185                                self._right_handle_revisions.fetch({ 
    164                                          
     186 
    165187                                        success : function(){ 
    166188                                                self.stop_right_model_loading(); 
     189                                                self.reload_toload_revisions( self._right_handle_revisions ); 
    167190                                        }, 
    168191 
    169                                         error : function () { 
    170                                                 window.console && console.log( 'Error loading revision data' ); 
     192                                        error : function ( response ) { 
     193                                                //console.log( 'Error loading revision data - ' + response.toSource() ); 
    171194                                                self.stop_right_model_loading(); 
    172195                                        } 
    173196                                }); 
     197 
    174198                        }, 
    175199 
     200                        reloadleftright : function() { 
     201                                this.reloadleft(); 
     202                                this.reloadright(); 
     203                        }, 
     204 
    176205                        /* 
    177206                         * initialize the revision application 
    178207                         */ 
     
    194223                        }, 
    195224 
    196225                        revisionDiffSetup : function() { 
    197                                 var self = this, slider; 
    198  
    199226                                this._revisionView = new wp.revisions.views.View({ 
    200227                                        model : this._revisions 
    201228                                }); 
    202229                                this._revisionView.render(); 
     230                                $( '#diff_max, #diff_maxof' ).html( this._revisions.length ); 
     231                                $( '#diff_count' ).html( REVAPP._right_diff ); 
     232                                $( '#slider' ).slider( 'option', 'max', this._revisions.length - 1 ); 
    203233 
     234                                this.reload_toload_revisions( this._revisions ); 
    204235                                this._revisionsInteractions = new wp.revisions.views.Interact({ 
    205236                                        model : this._revisions 
    206237                                }); 
    207238                                this._revisionsInteractions.render(); 
    208239 
     240                                /* 
     241                                //Options hidden for now, moving to screen options 
    209242                                this._revisionsOptions = new wp.revisions.views.Options({ 
    210243                                        model : this._revisions 
    211244                                }); 
    212245                                this._revisionsOptions.render(); 
     246                                */ 
    213247 
    214248                        } 
    215249                }) 
     
    217251 
    218252        wp.revisions.Collection = Backbone.Collection.extend({ 
    219253                model : wp.revisions.Model, 
    220                 url : ajaxurl + '?action=revisions-data&compareto=' + wpRevisionsSettings.post_id + '&showautosaves=false&showsplitview=true&nonce=' + wpRevisionsSettings.nonce 
    221         }); 
     254                url : ajaxurl + '?action=revisions-data&compare_to=' + wpRevisionsSettings.post_id + 
     255                        '&show_autosaves=false&show_split_view=true&nonce=' + wpRevisionsSettings.nonce, 
    222256 
     257                initialize : function() { 
     258                        } 
     259        } ); 
     260 
    223261        _.extend(wp.revisions.views, { 
    224262                // 
    225263                //primary revision diff view 
     
    242280                        render : function() { 
    243281                                var addhtml = ''; 
    244282                                //compare two revisions mode? 
    245                                 if ( 2 == REVAPP._compareoneortwo ) { 
     283                                if ( 2 === REVAPP._compareoneortwo ) { 
    246284                                        this.comparetwochecked = 'checked'; 
    247285                                        if ( this.draggingleft ) { 
    248286                                                        if ( this.model.at( REVAPP._left_diff ) ) { 
     
    260298                                                        ) ); 
    261299                                                } 
    262300                                        } 
    263                                 } else { //end compare two revisions mode, eg only one slider handel 
     301                                } else { //end compare two revisions mode, eg only one slider handle 
    264302                                        this.comparetwochecked = ''; 
    265303                                        if ( this.model.at( REVAPP._right_diff - 1 ) ) { 
    266304                                                addhtml = this.template( _.extend( 
    267                                                         this.model.at( REVAPP._right_diff-1 ).toJSON(), 
    268                                                         { comparetwochecked : this.comparetwochecked } //keep the checkmark checked 
     305                                                        this.model.at( REVAPP._right_diff - 1 ).toJSON(), 
     306                                                        { comparetwochecked : this.comparetwochecked } //keep the checkmark unchecked 
    269307                                                ) ); 
    270308                                        } 
    271309                                } 
    272310                                this.$el.html( addhtml ); 
     311                                if ( this.model.length < 3 ) { 
     312                                        $( 'div#comparetworevisions' ).hide(); //don't allow compare two if fewer than three revisions 
     313 
     314                                } 
     315                                //console.log ( (this.model.at( REVAPP._right_diff - 1 )).url()); 
    273316                                return this; 
    274317                        }, 
    275318 
     
    322365                        }, 
    323366 
    324367                        // 
    325                         //toggle include autosaves  
     368                        //toggle include autosaves 
    326369                        // 
    327370                        toggleshowautosaves : function() { 
    328371                                var self = this; 
     
    331374                                } else { 
    332375                                        REVAPP._autosaves = false ; 
    333376                                } 
     377 
    334378                                //refresh the model data 
    335  
    336379                                REVAPP.reloadmodel(); 
    337                                 //TODO check for two handle mode 
    338                                  
    339380                        }, 
    340381 
    341382                        // 
     
    345386                                var self = this; 
    346387 
    347388                                if ( $( 'input#showsplitview' ).is( ':checked' ) ) { 
    348                                         REVAPP._showsplitview = 'true'; 
     389                                        REVAPP._show_split_view = 'true'; 
    349390                                        $('.revisiondiffcontainer').addClass('diffsplit'); 
    350391                                } else { 
    351                                         REVAPP._showsplitview = ''; 
     392                                        REVAPP._show_split_view = ''; 
    352393                                        $('.revisiondiffcontainer').removeClass('diffsplit'); 
    353394                                } 
    354395 
     
    364405                        tagName : 'revisionvinteract', 
    365406                        className : 'revisionvinteract-container', 
    366407                        template : wp.template('revisionvinteract'), 
     408                        _restoreword : '', 
    367409 
    368410                        initialize : function() { 
     411                                this._restoreword = $( 'input#restore' ).attr( 'value' ); 
    369412                        }, 
    370413 
     414                        reset_restore_button : function() { 
     415                                $( 'input#restore' ).attr( 'value', this._restoreword + ' ' + REVAPP._revisions.at( REVAPP._right_diff - 1 ).get( 'ID' ) ); 
     416                        }, 
     417 
    371418                        render : function() { 
    372419                                var self = this; 
    373420 
     
    375422                                this.$el.html( addhtml ); 
    376423                                $( '#diff_max, #diff_maxof' ).html( this.model.length ); 
    377424                                $( '#diff_count' ).html( REVAPP._right_diff ); 
    378                                 $( '#diff_left_count_inner' ).html( 0 == REVAPP._left_diff ? '' : 'revision' + REVAPP._left_diff ); 
     425                                $( '#diff_left_count_inner' ).html( 0 === REVAPP._left_diff ? '' : 'revision' + REVAPP._left_diff ); 
     426                                self.reset_restore_button(); 
    379427 
    380428                                var modelcount = REVAPP._revisions.length; 
    381429 
    382                                 slider = $("#slider"); 
    383                                 if ( 1 == REVAPP._compareoneortwo ) { 
     430                                slider = $( "#slider" ); 
     431                                if ( 1 === REVAPP._compareoneortwo ) { 
    384432                                        //set up the slider with a single handle 
    385433                                        slider.slider({ 
    386434                                                value : REVAPP._right_diff-1, 
     
    390438 
    391439                                                //slide interactions for one handles slider 
    392440                                                slide : function( event, ui ) { 
    393                                                         if ( REVAPP.right_model_loading ) //left model stoll loading, prevent sliding left handle 
     441                                                        if ( REVAPP._right_model_loading ) //left model stoll loading, prevent sliding left handle 
    394442                                                                                return false; 
    395443 
    396444                                                        REVAPP._right_diff =( ui.value+1 ); 
    397445                                                        $( '#diff_count' ).html( REVAPP._right_diff ); 
    398446                                                        REVAPP._revisionView.render(); 
     447                                                        self.reset_restore_button(); 
    399448                                                } 
    400449                                        }); 
    401450                                        $( '.revisiondiffcontainer' ).removeClass( 'comparetwo' ); 
     
    414463 
    415464                                                        switch ( index ) { 
    416465                                                                case 1: //left handle drag 
    417                                                                         if ( REVAPP.left_model_loading ) //left model stoll loading, prevent sliding left handle 
     466                                                                        if ( REVAPP._left_model_loading ) //left model stoll loading, prevent sliding left handle 
    418467                                                                                return false; 
    419468 
    420469                                                                        if ( REVAPP._revisionView.model !== REVAPP._left_handle_revisions && 
    421                                                                                         null != REVAPP._left_handle_revisions ) 
     470                                                                                        null !== REVAPP._left_handle_revisions ) 
    422471                                                                                REVAPP._revisionView.model = REVAPP._left_handle_revisions; 
    423472 
    424473                                                                        REVAPP._revisionView.draggingleft = true; 
     474                                                                        REVAPP._left_diff_start = ui.values[ 0 ]; 
    425475                                                                        break; 
    426476 
    427477                                                                case 2: //right 
    428                                                                         if ( REVAPP.right_model_loading ) //right model stoll loading, prevent sliding right handle 
     478                                                                        if ( REVAPP._right_model_loading ) //right model stoll loading, prevent sliding right handle 
    429479                                                                                return false; 
    430480 
    431481                                                                        //one extra spot at left end when comparing two 
    432482                                                                        if ( REVAPP._revisionView.model !== REVAPP._right_handle_revisions && 
    433                                                                                         null != REVAPP._right_handle_revisions ) 
     483                                                                                        null !== REVAPP._right_handle_revisions ) 
    434484                                                                                REVAPP._revisionView.model = REVAPP._right_handle_revisions; 
    435485 
    436486                                                                        REVAPP._revisionView.draggingleft = false; 
    437                                                                         REVAPP._right_diff = ui.values[1] - 1 ; 
     487                                                                        REVAPP._right_diff_start = ui.values[ 1 ]; 
    438488                                                                        break; 
    439489                                                        } 
    440490                                                }, 
    441491 
    442492                                                //when sliding in two handled mode change appropriate value 
    443493                                                slide : function( event, ui ) { 
    444                                                         if ( ui.values[0] == ui.values[1] ) //prevent compare to self 
     494                                                        if ( ui.values[ 0 ] === ui.values[ 1 ] ) //prevent compare to self 
    445495                                                                return false; 
    446496 
    447497                                                        var index = $( ui.handle ).index(); //0 (left) or 1 (right) 
    448498 
    449499                                                        switch ( index ) { 
    450500                                                                case 1: //left 
    451                                                                         if ( REVAPP.left_model_loading ) //left model stoll loading, prevent sliding left handle 
     501                                                                        if ( REVAPP._left_model_loading ) //left model still loading, prevent sliding left handle 
    452502                                                                                return false; 
    453503 
    454                                                                         REVAPP._left_diff = ui.values[0] - 1; //one extra spot at left end when comparing two 
     504                                                                        REVAPP._left_diff = ui.values[ 0 ] - 1; //one extra spot at left end when comparing two 
    455505                                                                        break; 
    456506 
    457507                                                                case 2: //right 
    458                                                                         if ( REVAPP.right_model_loading ) //right model stoll loading, prevent sliding right handle 
     508                                                                        if ( REVAPP._right_model_loading ) //right model still loading, prevent sliding right handle 
    459509                                                                                return false; 
    460510 
    461                                                                         REVAPP._right_diff = ui.values[1] - 1 ; 
     511                                                                        REVAPP._right_diff = ui.values[ 1 ] - 1 ; 
    462512                                                                        break; 
    463513                                                        } 
    464514 
    465515                                                        $( '#diff_count' ).html( REVAPP._right_diff ); 
    466516 
    467                                                         if ( 0 == REVAPP._left_diff ) { 
     517                                                        if ( 0 === REVAPP._left_diff ) { 
    468518                                                                $( '.revisiondiffcontainer' ).addClass( 'currentversion' ); 
    469519 
    470520                                                        } else { 
     
    473523                                                        } 
    474524 
    475525                                                        REVAPP._revisionView.render(); //render the diff view 
     526                                                        self.reset_restore_button(); 
    476527                                                }, 
    477528 
    478529                                                //when the user stops sliding  in 2 handle mode, recalculate diffs 
    479530                                                stop : function( event, ui ) { 
    480                                                         if ( 2 == REVAPP._compareoneortwo ) { 
     531                                                        if ( 2 === REVAPP._compareoneortwo ) { 
    481532                                                                //calculate and generate a diff for comparing to the left handle 
    482533                                                                //and the right handle, swap out when dragging 
    483                                                                 if ( ! (REVAPP.left_model_loading && REVAPP.right_model.loading ) ) { 
    484                                                                         REVAPP.reloadleftright(); 
     534 
     535                                                                var index = $( ui.handle ).index(); //0 (left) or 1 (right) 
     536 
     537                                                                switch ( index ) { 
     538                                                                        case 1: //left 
     539                                                                                //left handle dragged & changed, reload right handle model 
     540                                                                                if ( ! ( REVAPP._left_diff_start === ui.values[ 0 ] || REVAPP._left_model_loading ) ) 
     541                                                                                        REVAPP.reloadright(); 
     542 
     543                                                                                break; 
     544 
     545                                                                        case 2: //right 
     546                                                                                //right handle dragged & changed, reload left handle model if changed 
     547                                                                                if ( ! ( REVAPP._right_diff_start === ui.values[ 1 ] || REVAPP._right_model_loading ) ) { 
     548                                                                                        REVAPP.reloadleft(); 
     549                                                                                } 
     550                                                                                break; 
    485551                                                                } 
    486552                                                        } 
    487553                                                } 
     
    507573 
    508574                                $( '#diff_count' ).html( REVAPP._right_diff ); 
    509575                                $( '#slider' ).slider( 'value', REVAPP._right_diff - 1 ).trigger( 'slide' ); 
     576                                this.reset_restore_button(); 
    510577                        }, 
    511578 
    512579                        //go the the previous revision 
     
    518585 
    519586                                $( '#diff_count' ).html( REVAPP._right_diff ); 
    520587                                $( '#slider' ).slider( 'value', REVAPP._right_diff - 1 ).trigger( 'slide' ); 
     588                                this.reset_restore_button(); 
    521589                        } 
    522590                }) 
    523591        }); 
     
    525593        //instantiate Revision Application 
    526594        REVAPP = new wp.revisions.App(); 
    527595        //TODO consider enable back button to step back thru states? 
    528         Backbone.history.start(); 
     596        //Backbone.history.start({pushState: true}); 
    529597 
    530598}(jQuery)); 
  • wp-admin/revision.php

     
    1010require_once('./admin.php'); 
    1111wp_reset_vars( array( 'revision', 'action' ) ); 
    1212 
    13 $revision_id = absint($revision); 
     13$revision_id = absint( $revision ); 
    1414$redirect = 'edit.php'; 
    1515 
    1616switch ( $action ) : 
    1717case 'restore' : 
    18         if ( !$revision = wp_get_post_revision( $revision_id ) ) 
     18        if ( ! $revision = wp_get_post_revision( $revision_id ) ) 
    1919                break; 
    20         if ( !current_user_can( 'edit_post', $revision->post_parent ) ) 
     20        if ( ! current_user_can( 'edit_post', $revision->post_parent ) ) 
    2121                break; 
    22         if ( !$post = get_post( $revision->post_parent ) ) 
     22        if ( ! $post = get_post( $revision->post_parent ) ) 
    2323                break; 
    2424 
    2525        // Revisions disabled and we're not looking at an autosave 
    26         if ( ( ! WP_POST_REVISIONS || !post_type_supports($post->post_type, 'revisions') ) && !wp_is_post_autosave( $revision ) ) { 
     26        if ( ( ! WP_POST_REVISIONS || ! post_type_supports( $post->post_type, 'revisions' ) ) && ! wp_is_post_autosave( $revision ) ) { 
    2727                $redirect = 'edit.php?post_type=' . $post->post_type; 
    2828                break; 
    2929        } 
    3030        check_admin_referer( "restore-post_{$post->ID}|{$revision->ID}" ); 
    3131 
     32        //store revision event in post meta 
     33        $restore_details = array( 
     34                'restored_revision_id' => $revision->ID, 
     35                'restored_by_user' => get_current_user_id(), 
     36                'restored_time' => time() 
     37        ); 
     38        update_post_meta( $post->ID, '_post_restored_from', $restore_details ); 
     39 
    3240        wp_restore_post_revision( $revision->ID ); 
    3341        $redirect = add_query_arg( array( 'message' => 5, 'revision' => $revision->ID ), get_edit_post_link( $post->ID, 'url' ) ); 
    3442        break; 
    3543case 'view' : 
    3644case 'edit' : 
    3745default : 
    38         if ( !$revision = wp_get_post_revision( $revision_id ) ) 
     46        if ( ! $revision = wp_get_post_revision( $revision_id ) ) 
    3947                break; 
    40         if ( !$post = get_post( $revision->post_parent ) ) 
     48        if ( ! $post = get_post( $revision->post_parent ) ) 
    4149                break; 
    4250 
    43         if ( !current_user_can( 'read_post', $revision->ID ) || !current_user_can( 'read_post', $post->ID ) ) 
     51        if ( ! current_user_can( 'read_post', $revision->ID ) || ! current_user_can( 'read_post', $post->ID ) ) 
    4452                break; 
    4553 
    4654        // Revisions disabled and we're not looking at an autosave 
     
    5967endswitch; 
    6068 
    6169// Empty post_type means either malformed object found, or no valid parent was found. 
    62 if ( !$redirect && empty($post->post_type) ) 
     70if ( ! $redirect && empty( $post->post_type ) ) 
    6371        $redirect = 'edit.php'; 
    6472 
    65 if ( !empty($redirect) ) { 
     73if ( ! empty( $redirect ) ) { 
    6674        wp_redirect( $redirect ); 
    6775        exit; 
    6876} 
    6977 
    7078// This is so that the correct "Edit" menu item is selected. 
    71 if ( !empty($post->post_type) && 'post' != $post->post_type ) 
     79if ( ! empty( $post->post_type ) && 'post' != $post->post_type ) 
    7280        $parent_file = $submenu_file = 'edit.php?post_type=' . $post->post_type; 
    7381else 
    7482        $parent_file = $submenu_file = 'edit.php'; 
     
    8391<script type="text/javascript"> 
    8492var wpRevisionsSettings = <?php echo json_encode( array( 'post_id' => $post->ID, 'nonce' => wp_create_nonce( 'revisions-ajax-nonce' ) ) ); ?>; 
    8593</script> 
     94<?php 
     95        $comparetworevisionslink = get_edit_post_link( $revision->ID ); 
     96?> 
    8697 
    8798<div id="backbonerevisionsoptions"></div> 
    88  
    89 <br class="clear"/> 
    9099<div class="wrap"> 
    91100        <div class="icon32 icon32-posts-post" id="icon-edit"><br></div> 
    92101        <div class="revisiondiffcontainer diffsplit currentversion rightmodelloading"> 
     
    94103                <h2 class="long-header"><?php echo $h2; ?></h2> 
    95104                <div id="backbonerevisionsinteract"></div> 
    96105                <div id="backbonerevisionsdiff"></div> 
    97 <hr /> 
    98 <?php 
    99         $comparetworevisionslink = get_edit_post_link( $revision->ID ); 
    100 ?> 
     106                <hr /> 
    101107        </div> 
    102108</div> 
    103109 
     
    107113                <div id="difftitlefrom">{{{ data.revision_from_date_author }}} <?php _e( '- compared to -' ); ?></div> 
    108114                <div id="difftitle">{{{ data.revision_date_author }}}</div> 
    109115                <div id="diffcancel"><input class="button" onClick="document.location='<?php echo get_edit_post_link( $post->ID ); ?>'" type="submit" id="cancel" value="<?php esc_attr_e( 'Cancel' )?>" /></div> 
    110                 <div id="diffrestore"><input class="button button-primary" onClick="document.location='{{{ data.restoreaction }}}'" type="submit" id="restore" value="<?php esc_attr_e( 'Restore' )?>" /></div> 
    111                 <div id="comparetworevisions"><input type="checkbox" id="comparetwo" value="comparetwo" {{{ data.comparetwochecked }}} name="comparetwo"/> <?php esc_attr_e( 'Compare two revisions' )?></div> 
    112         </div> 
     116                <div id="diffrestore"><input class="button button-primary" onClick="document.location='{{{ data.restoreaction }}}'" type="submit" id="restore" value="<?php esc_attr_e( 'Restore revision ID' )?>" /></div> 
     117                <div id="comparetworevisions"><input type="checkbox" id="comparetwo" value="comparetwo" {{{ data.comparetwochecked }}} name="comparetwo"/> <label for="comparetwo"><?php esc_attr_e( 'Compare two revisions' ); ?></a></div>    </div> 
    113118        <div id="removedandadded"> 
    114119                <div id="removed"><?php _e( 'Removed -' ); ?></div> 
    115120                <div id="added"><?php _e( 'Added +' ); ?></div> 
     
    119124 
    120125<script id="tmpl-revisionvinteract" type="text/html"> 
    121126        <div id="diffheader"> 
    122 <div id="diffprevious"><input class="button" type="submit" id="previous" value="Previous" /></div> 
    123                         <div id="diffnext"><input class="button" type="submit" id="next" value="Next" /></div> 
     127<div id="diffprevious"><input class="button" type="submit" id="previous" value="<?php esc_attr_e( 'Previous' ); ?>" /></div> 
     128                        <div id="diffnext"><input class="button" type="submit" id="next" value="<?php esc_attr_e( 'Next' ); ?>" /></div> 
    124129                        <div id="diffslider"> 
    125130        <div id="revisioncount"> 
    126131                                        <?php _e( 'Comparing' ); ?> 
  • wp-admin/css/wp-admin.css

     
    37233723.leftmodelloading #modelsloading, 
    37243724.rightmodelloading #modelsloading, 
    37253725.leftmodelloading #modelsloading .spinner, 
    3726 .rightmodelloading #modelsloading .spinner { 
     3726.rightmodelloading #modelsloading .spinner, 
     3727{ 
    37273728        display: inline; 
    37283729} 
    37293730 
     3731.diff-loading { 
     3732        margin-top: 50px; 
     3733        width: 100%; 
     3734        height: 200px; 
     3735} 
     3736.diff-loading .spinner 
     3737{ 
     3738        clear: both; 
     3739        margin-left: auto; 
     3740        margin-right: auto; 
     3741        display: block; 
     3742        float: none; 
     3743} 
     3744 
    37303745#difftitlefrom { 
    37313746        float: left; 
    37323747        display: none;