diff --git a/wp-admin/edit-form-advanced.php b/wp-admin/edit-form-advanced.php index 744f3b2978..6df923493e 100644 --- a/wp-admin/edit-form-advanced.php +++ b/wp-admin/edit-form-advanced.php @@ -301,7 +301,7 @@ if ( isset( $post_new_file ) && current_user_can( $post_type_object->cap->create echo ' ' . esc_html( $post_type_object->labels->add_new ) . ''; ?> -

+

diff --git a/wp-admin/includes/ajax-actions.php b/wp-admin/includes/ajax-actions.php index 6d587657f4..3724bfe9ef 100644 --- a/wp-admin/includes/ajax-actions.php +++ b/wp-admin/includes/ajax-actions.php @@ -1050,9 +1050,9 @@ function wp_ajax_autosave() { $id = $revision_id = 0; - $post_ID = (int) $_POST['post_ID']; - $_POST['ID'] = $post_ID; - $post = get_post($post_ID); + $post_id = (int) $_POST['post_id']; + $_POST['ID'] = $_POST['post_ID'] = $post_id; + $post = get_post($post_id); if ( 'auto-draft' == $post->post_status ) $_POST['post_status'] = 'draft'; @@ -1068,10 +1068,10 @@ function wp_ajax_autosave() { } if ( 'page' == $post->post_type ) { - if ( !current_user_can('edit_page', $post_ID) ) + if ( !current_user_can('edit_page', $post->ID) ) wp_die( __( 'You are not allowed to edit this page.' ) ); } else { - if ( !current_user_can('edit_post', $post_ID) ) + if ( !current_user_can('edit_post', $post->ID) ) wp_die( __( 'You are not allowed to edit this post.' ) ); } diff --git a/wp-admin/includes/misc.php b/wp-admin/includes/misc.php index 8f7aa2200c..f954c5b6fa 100644 --- a/wp-admin/includes/misc.php +++ b/wp-admin/includes/misc.php @@ -632,3 +632,29 @@ function wp_refresh_post_lock( $response, $data, $screen_id ) { return $response; } add_filter( 'heartbeat_received', 'wp_refresh_post_lock', 10, 3 ); + +/** + * Output the HTML for restoring the post data from DOM storage + * + * @since 3.6 + * @access private + */ +function _local_storage_notice() { + $screen = get_current_screen(); + if ( ! $screen || 'post' != $screen->id ) + return; + + ?> + + ]+>/g, ''); + + return string.replace(/[\x20\t\r\n\f]+/g, ''); + } + + return ( remove( str1 || '', strip_tags ) == remove( str2 || '', strip_tags ) ); + }, + + /** + * Check if the saved data for the current post (if any) is different than the loaded post data on the screen + * + * Shows a standard message letting the user restore the post data if different. + * + * @return void + */ + checkPost: function() { + var self = this, post_data = this.getData(), content, check_data, strip_tags = false, notice; + + if ( ! post_data ) + return; + + // There is a newer autosave. Don't show two "restore" notices at the same time. + if ( $('#has-newer-autosave').length ) + return; + + content = $('#content').val(); + check_data = $.extend( {}, post_data ); + + if ( $('#wp-content-wrap').hasClass('tmce-active') ) + content = switchEditors.pre_wpautop( content ); + + // The post has just been published, only compare text + if ( $('#post_status').val() == 'publish' && check_data.status != 'publish' ) + strip_tags = true; + + if ( this.compare( content, check_data.content, strip_tags ) && this.compare( $('#title').val(), check_data.post_title, strip_tags ) && this.compare( $('#excerpt').val(), check_data.excerpt, strip_tags ) ) + return; + + // We have three choices here: + // - Do an autosave and then show the standard notice "There is an autosave newer than...". + // - Offer to load/restore the backed up post data. + // - Restore the post_data without asking, then show a notice with an Undo link/button. + // Doing an autosave will take few seconds and may take up to 30 and fail if network connectivity is bad + // Restoring the post will leave the user with the proper content, but it won't be saved to the server until the next autosave. + + this.restore_post_data = post_data; + this.undo_post_data = wp.autosave.getPostData(); + + /* + if ( $('#post_status').val() == 'publish' ) { + // Different message when a post is published? + // Comparing the current and saved post data may fail (false positive) when the post is published + // as in some cases there are changes to post_content on publishing and updating before saving to the DB. + } + */ + + notice = $('#local-storage-notice'); + $('form#post').before( notice.addClass('updated').show() ); + + notice.on( 'click', function(e) { + var target = $( e.target ); + + if ( target.hasClass('restore-backup') ) { + self.restorePost( self.restore_post_data ); + target.parent().hide(); + $(this).find('p.undo-restore').show(); + } else if ( target.hasClass('undo-restore-backup') ) { + self.restorePost( self.undo_post_data ); + target.parent().hide(); + $(this).find('p.local-restore').show(); + } + + e.preventDefault(); + }); + }, + + // Restore the current title, content and excerpt from post_data. + restorePost: function( post_data ) { + var editor; + + if ( post_data ) { + // Set the last saved data + this.lastsaveddata = post_data.post_title + ': ' + post_data.content; + + if ( $('#title').val() != post_data.post_title ) + $('#title').focus().val( post_data.post_title || '' ); + + $('#excerpt').val( post_data.excerpt || '' ); + editor = typeof tinymce != 'undefined' && tinymce.get('content'); + + if ( editor && ! editor.isHidden() ) { + // Make sure there's an undo level in the editor + editor.undoManager.add(); + editor.setContent( post_data.content ? switchEditors.wpautop( post_data.content ) : '' ); + } else { + // Make sure the Text editor is selected + $('#content-html').click(); + $('#content').val( post_data.content ); + } + + return true; + } + + return false; + } +} + +wp.autosave.local.init(); + +}(jQuery)); diff --git a/wp-includes/script-loader.php b/wp-includes/script-loader.php index 38c44889a1..e8c0cdd611 100644 --- a/wp-includes/script-loader.php +++ b/wp-includes/script-loader.php @@ -106,7 +106,7 @@ function wp_default_scripts( &$scripts ) { 'dismiss' => __('Dismiss'), ) ); - $scripts->add( 'autosave', "/wp-includes/js/autosave$suffix.js", array('schedule', 'wp-ajax-response'), false, 1 ); + $scripts->add( 'autosave', "/wp-includes/js/autosave$suffix.js", array('schedule', 'wp-ajax-response', 'editor'), false, 1 ); $scripts->add( 'heartbeat', "/wp-includes/js/heartbeat$suffix.js", array('jquery'), false, 1 ); did_action( 'init' ) && $scripts->localize( 'heartbeat', 'heartbeatSettings', @@ -585,7 +585,8 @@ function wp_just_in_time_script_localization() { wp_localize_script( 'autosave', 'autosaveL10n', array( 'autosaveInterval' => AUTOSAVE_INTERVAL, 'savingText' => __('Saving Draft…'), - 'saveAlert' => __('The changes you made will be lost if you navigate away from this page.') + 'saveAlert' => __('The changes you made will be lost if you navigate away from this page.'), + 'blog_id' => get_current_blog_id(), ) ); } diff --git a/wp-login.php b/wp-login.php index 10ff47bd39..f26731eab1 100644 --- a/wp-login.php +++ b/wp-login.php @@ -68,6 +68,15 @@ function login_header($title = 'Log In', $message = '', $wp_error = '') { get_error_code() ) { + ?> + +