WordPress.org

Make WordPress Core

Ticket #23697: 23697.patch

File 23697.patch, 9.0 KB (added by azaozz, 2 years ago)
  • wp-admin/css/wp-admin.css

     
    34073407        border-style: solid; 
    34083408} 
    34093409 
     3410#post-locked-dialog-wrap { 
     3411        position: fixed; 
     3412        top: 0; 
     3413        left: 0; 
     3414        right: 0; 
     3415        bottom: 0; 
     3416        background-color: rgba(0, 0, 0, 0.5); 
     3417        z-index: 1000000; 
     3418} 
    34103419 
     3420#post-locked-dialog { 
     3421        position: absolute; 
     3422        top: 10%; 
     3423        left: 10%; 
     3424        right: 10%; 
     3425        border: 1px solid #f00; 
     3426        background: #fff; 
     3427        padding: 20px; 
     3428        z-index: 1000005; 
     3429} 
     3430 
     3431 
    34113432/*------------------------------------------------------------------------------ 
    34123433  11.1 - Custom Fields 
    34133434------------------------------------------------------------------------------*/ 
  • wp-admin/includes/ajax-actions.php

     
    10571057                $_POST['post_status'] = 'draft'; 
    10581058 
    10591059        if ( $last = wp_check_post_lock( $post->ID ) ) { 
     1060                // This will change after we have per-user autosaves 
    10601061                $do_autosave = $do_lock = false; 
    10611062 
    10621063                $last_user = get_userdata( $last ); 
     
    10641065                $data = __( 'Autosave disabled.' ); 
    10651066 
    10661067                $supplemental['disable_autosave'] = 'disable'; 
    1067                 $alert .= sprintf( __( '%s is currently editing this article. If you update it, you will overwrite the changes.' ), esc_html( $last_user_name ) ); 
    10681068        } 
    10691069 
    10701070        if ( 'page' == $post->post_type ) { 
     
    10941094                        $id = $post->ID; 
    10951095        } 
    10961096 
    1097         if ( $do_lock && empty( $_POST['auto_draft'] ) && $id && is_numeric( $id ) ) { 
    1098                 $lock_result = wp_set_post_lock( $id ); 
    1099                 $supplemental['active-post-lock'] = implode( ':', $lock_result ); 
    1100         } 
    1101  
    11021097        if ( $nonce_age == 2 ) { 
    11031098                $supplemental['replace-autosavenonce'] = wp_create_nonce('autosave'); 
    11041099                $supplemental['replace-getpermalinknonce'] = wp_create_nonce('getpermalink'); 
     
    17771772        if ( $active_lock[1] != get_current_user_id() ) 
    17781773                wp_die( 0 ); 
    17791774 
    1780         $new_lock = ( time() - apply_filters( 'wp_check_post_lock_window', AUTOSAVE_INTERVAL * 2 ) + 5 ) . ':' . $active_lock[1]; 
     1775        $new_lock = ( time() - apply_filters( 'wp_check_post_lock_window', 120 ) + 5 ) . ':' . $active_lock[1]; 
    17811776        update_post_meta( $post_id, '_edit_lock', $new_lock, implode( ':', $active_lock ) ); 
    17821777        wp_die( 1 ); 
    17831778} 
  • wp-admin/includes/misc.php

     
    586586        return $response; 
    587587} 
    588588add_filter( 'heartbeat_received', 'wp_check_locked_posts', 10, 2 ); 
     589 
     590/** 
     591 * Check lock status on the New/Edit Post screen and refresh the lock 
     592 * 
     593 * @since 3.6 
     594 */ 
     595function wp_refresh_post_lock( $response, $data, $screen_id ) { 
     596        if ( 'post' == $screen_id && array_key_exists( 'wp-refresh-post-lock', $data ) ) { 
     597                $received = $data['wp-refresh-post-lock']; 
     598                $send = array(); 
     599                 
     600                if ( !$post_id = absint( $received['post_id'] ) ) 
     601                        return $response; 
     602 
     603                if ( !current_user_can('edit_post', $post_id) ) 
     604                        return $response; 
     605                 
     606                if ( $user_id = wp_check_post_lock( $post_id ) ) { 
     607                        $user = get_userdata( $user_id ); 
     608                        $send['lock_error'] = sprintf( __( '%s has taken over and is currently editing.' ), $user->display_name ); 
     609                } else { 
     610                        if ( $new_lock = wp_set_post_lock( $post_id ) ) 
     611                                $send['new_lock'] = implode( ':', $new_lock ); 
     612                } 
     613 
     614                $response['wp-refresh-post-lock'] = $send; 
     615        } 
     616         
     617        return $response; 
     618} 
     619add_filter( 'heartbeat_received', 'wp_refresh_post_lock', 10, 3 ); 
     620 
  • wp-admin/includes/post.php

     
    11621162        $time = $lock[0]; 
    11631163        $user = isset( $lock[1] ) ? $lock[1] : get_post_meta( $post->ID, '_edit_last', true ); 
    11641164 
    1165         $time_window = apply_filters( 'wp_check_post_lock_window', AUTOSAVE_INTERVAL * 2 ); 
     1165        $time_window = apply_filters( 'wp_check_post_lock_window', 120 ); 
    11661166 
    11671167        if ( $time && $time > time() - $time_window && $user != get_current_user_id() ) 
    11681168                return $user; 
     
    11921192} 
    11931193 
    11941194/** 
    1195  * Outputs the notice message to say that someone else is editing this post at the moment. 
     1195 * Outputs the HTML for the notice to say that someone else is editing or has taken over editing of this post. 
    11961196 * 
    11971197 * @since 2.8.5 
    11981198 * @return none 
    11991199 */ 
    12001200function _admin_notice_post_locked() { 
    1201         $post = get_post(); 
    1202         $lock = explode( ':', get_post_meta( $post->ID, '_edit_lock', true ) ); 
    1203         $user = isset( $lock[1] ) ? $lock[1] : get_post_meta( $post->ID, '_edit_last', true ); 
    1204         $last_user = get_userdata( $user ); 
    1205         $last_user_name = $last_user ? $last_user->display_name : __('Somebody'); 
     1201        global $post_ID; 
     1202         
     1203        if ( $post_ID && ( $user = wp_check_post_lock( $post_ID ) ) ) { 
     1204                $user = get_userdata( $user ); 
     1205                $message = sprintf( __( '%s is currently editing.' ), $user->display_name ); 
     1206        } else { 
     1207                $message = ''; 
     1208        } 
    12061209 
    1207         switch ($post->post_type) { 
    1208                 case 'post': 
    1209                         $message = __( 'Warning: %s is currently editing this post' ); 
    1210                         break; 
    1211                 case 'page': 
    1212                         $message = __( 'Warning: %s is currently editing this page' ); 
    1213                         break; 
    1214                 default: 
    1215                         $message = __( 'Warning: %s is currently editing this.' ); 
     1210        ?> 
     1211        <div id="post-locked-dialog-wrap"<?php if ( ! $message ) echo ' style="display:none"'; ?>> 
     1212        <div id="post-locked-dialog"> 
     1213        <?php 
     1214         
     1215        if ( $message ) { 
     1216                ?> 
     1217                <div class="post-locked-message"> 
     1218                        <p><?php echo esc_html( $message ); ?></p> 
     1219                        <p> 
     1220                        <a class="button" href="<?php echo esc_url( add_query_arg( 'get-post-lock', '1', get_edit_post_link( $post_ID, 'url' ) ) ); ?>"><?php _e('Take over'); ?></a> 
     1221                        <a class="button" href="<?php echo esc_url( wp_get_referer() ); ?>"><?php _e('Go back'); ?></a> 
     1222                        </p> 
     1223                </div> 
     1224                <?php 
     1225        } else { 
     1226                ?> 
     1227                <div class="post-taken-over"> 
     1228                        <p class="currently-editing"></p> 
     1229                        <p><a class="button" href="<?php echo esc_url( admin_url('edit.php') ); ?>"><?php _e('Go to All Posts'); ?></a></p> 
     1230                </div> 
     1231                <?php 
    12161232        } 
    12171233 
    1218         $message = sprintf( $message, esc_html( $last_user_name ) ); 
    1219         echo "<div class='error'><p>$message</p></div>"; 
     1234        ?> 
     1235        </div> 
     1236        </div> 
     1237        <?php 
    12201238} 
    12211239 
    12221240/** 
  • wp-admin/js/post.js

     
    251251        ); 
    252252}; 
    253253 
    254 })(jQuery); 
     254$(document).on( 'heartbeat-send.refresh-lock', function( e, data ) { 
     255        var lock = $('#active_post_lock').val(), post_id = $('#post_ID').val(), send = {}; 
    255256 
     257        if ( !post_id ) 
     258                return; 
     259         
     260        send['post_id'] = post_id; 
     261         
     262        if ( lock ) 
     263                send['lock'] = lock; 
     264 
     265        data['wp-refresh-post-lock'] = send; 
     266}); 
     267 
     268$(document).on( 'heartbeat-tick.refresh-lock', function( e, data ) { 
     269        var received; 
     270 
     271        if ( data['wp-refresh-post-lock'] ) { 
     272                received = data['wp-refresh-post-lock']; 
     273 
     274                if ( received['lock_error'] ) { 
     275                        // show "editing taken over" message 
     276                        var wrap = $('#post-locked-dialog-wrap'); 
     277 
     278                        if ( !wrap.is(':visible') ) { 
     279                                autosave(); 
     280                                wrap.find('p.currently-editing').text( received['lock_error'] ); 
     281                                wrap.show(); 
     282                        } 
     283                } 
     284 
     285                if ( received['new_lock'] ) 
     286                        $('#active_post_lock').val( received['new_lock'].replace(/[^0-9:]+/, '') ); 
     287        } 
     288}); 
     289 
     290}(jQuery)); 
     291 
    256292jQuery(document).ready( function($) { 
    257293        var stamp, visibility, sticky = '', last = 0, co = $('#content'); 
    258294 
  • wp-admin/post.php

     
    147147        if ( 'trash' == $post->post_status ) 
    148148                wp_die( __('You can&#8217;t edit this item because it is in the Trash. Please restore it and try again.') ); 
    149149 
     150        if ( !empty( $_GET['get-post-lock'] ) ) { 
     151                wp_set_post_lock( $post_id ); 
     152                wp_redirect( get_edit_post_link( $post_id, 'url' ) ); 
     153                exit(); 
     154        } 
     155         
    150156        $post_type = $post->post_type; 
    151157        if ( 'post' == $post_type ) { 
    152158                $parent_file = "edit.php"; 
     
    165171                $post_new_file = "post-new.php?post_type=$post_type"; 
    166172        } 
    167173 
    168         if ( $last = wp_check_post_lock( $post->ID ) ) { 
    169                 add_action('admin_notices', '_admin_notice_post_locked' ); 
    170         } else { 
     174        if ( ! wp_check_post_lock( $post->ID ) ) { 
    171175                $active_post_lock = wp_set_post_lock( $post->ID ); 
    172176 
    173177                if ( 'attachment' !== $post_type ) 
    174178                        wp_enqueue_script('autosave'); 
    175179        } 
    176180 
     181        add_action( 'admin_footer', '_admin_notice_post_locked' ); 
     182 
    177183        $title = $post_type_object->labels->edit_item; 
    178184        $post = get_post($post_id, OBJECT, 'edit'); 
    179185 
     
    217223        if ( !current_user_can($post_type_object->cap->delete_post, $post_id) ) 
    218224                wp_die( __('You are not allowed to move this item to the Trash.') ); 
    219225 
     226        if ( $user_id = wp_check_post_lock( $post_id ) ) { 
     227                $user = get_userdata( $user_id ); 
     228                wp_die( sprintf( __( 'You cannot move this item to the Trash. %s is currently editing.' ), $user->display_name ) ); 
     229        } 
     230 
    220231        if ( ! wp_trash_post($post_id) ) 
    221232                wp_die( __('Error in moving to Trash.') ); 
    222233