diff --git a/wp-admin/admin-ajax.php b/wp-admin/admin-ajax.php
index 839070c346..5e27b81488 100644
--- a/wp-admin/admin-ajax.php
+++ b/wp-admin/admin-ajax.php
@@ -461,10 +461,9 @@ case 'add-user' :
case 'autosave' : // The name of this action is hardcoded in edit_post()
define( 'DOING_AUTOSAVE', true );
- $nonce_age = check_ajax_referer( 'autosave', 'autosavenonce');
+ $nonce_age = check_ajax_referer( 'autosave', 'autosavenonce' );
global $current_user;
- $_POST['post_status'] = 'draft';
$_POST['post_category'] = explode(",", $_POST['catslist']);
$_POST['tags_input'] = explode(",", $_POST['tags_input']);
if($_POST['post_type'] == 'page' || empty($_POST['post_category']))
@@ -478,8 +477,9 @@ case 'autosave' : // The name of this action is hardcoded in edit_post()
$supplemental = array();
- $id = 0;
+ $id = $revision_id = 0;
if($_POST['post_ID'] < 0) {
+ $_POST['post_status'] = 'draft';
$_POST['temp_ID'] = $_POST['post_ID'];
if ( $do_autosave ) {
$id = wp_write_post();
@@ -510,8 +510,18 @@ case 'autosave' : // The name of this action is hardcoded in edit_post()
if ( !current_user_can('edit_post', $post_ID) )
die(__('You are not allowed to edit this post.'));
}
+
if ( $do_autosave ) {
- $id = edit_post();
+ // Drafts are just overwritten by autosave
+ if ( 'draft' == $post->post_status ) {
+ $id = edit_post();
+ } else { // Non drafts are not overwritten. The autosave is stored in a special post revision.
+ $revision_id = wp_create_autosave( $post->ID );
+ if ( is_wp_error($revision_id) )
+ $id = $revision_id;
+ else
+ $id = $post->ID;
+ }
$data = $message;
} else {
$id = $post->ID;
diff --git a/wp-admin/css/global.css b/wp-admin/css/global.css
index 926aa88bd7..295adea872 100644
--- a/wp-admin/css/global.css
+++ b/wp-admin/css/global.css
@@ -194,3 +194,7 @@ th.check-column + th, th.check-column + td {
padding-bottom: 7px;
padding-right: 280px;
}
+
+.wrap h2.long-header {
+ padding-right: 0;
+}
diff --git a/wp-admin/edit-form-advanced.php b/wp-admin/edit-form-advanced.php
index 89e84877e7..188b95135f 100644
--- a/wp-admin/edit-form-advanced.php
+++ b/wp-admin/edit-form-advanced.php
@@ -1,13 +1,35 @@
- go back.' ), attribute_escape( stripslashes( $_GET['_wp_original_http_referer'] ) ) );
$messages[2] = __('Custom field updated.');
$messages[3] = __('Custom field deleted.');
$messages[4] = __('Post updated.');
-$messages[5] = sprintf( __('Post restored to revision from %s'), wp_post_revision_time( $_GET['revision'] ) );
+$messages[5] = sprintf( __('Post restored to revision from %s'), wp_post_revision_title( $_GET['revision'], false ) );
+
+$notice = false;
+$notices[1] = __( 'There is an autosave of this post that is more recent than the version below. View the autosave.' );
+
+if ( !isset($post_ID) || 0 == $post_ID ) {
+ $form_action = 'post';
+ $temp_ID = -1 * time(); // don't change this formula without looking at wp_write_post()
+ $form_extra = "";
+ $autosave = false;
+} else {
+ $post_ID = (int) $post_ID;
+ $form_action = 'editpost';
+ $form_extra = "";
+ $autosave = wp_get_autosave( $post_id );
+ if ( $autosave && mysql2date( 'U', $autosave->post_modified_gmt ) > mysql2date( 'U', $post->post_modified_gmt ) )
+ $notice = sprintf( $notices[1], get_edit_post_link( $autosave->ID ) );
+}
+
?>
+
+
+
@@ -21,17 +43,10 @@ $messages[5] = sprintf( __('Post restored to revision from %s'), wp_post_revisio
";
+if ( !isset($post_ID) || 0 == $post_ID)
wp_nonce_field('add-post');
-} else {
- $post_ID = (int) $post_ID;
- $form_action = 'editpost';
- $form_extra = "";
+else
wp_nonce_field('update-post_' . $post_ID);
-}
$form_pingback = '';
diff --git a/wp-admin/includes/post.php b/wp-admin/includes/post.php
index 8cd3c9e036..d683a49bfa 100644
--- a/wp-admin/includes/post.php
+++ b/wp-admin/includes/post.php
@@ -1,5 +1,102 @@
31 ) ? 31 : $jj;
+ $hh = ($hh > 23 ) ? $hh -24 : $hh;
+ $mn = ($mn > 59 ) ? $mn -60 : $mn;
+ $ss = ($ss > 59 ) ? $ss -60 : $ss;
+ $_POST['post_date'] = sprintf( "%04d-%02d-%02d %02d:%02d:%02d", $aa, $mm, $jj, $hh, $mn, $ss );
+ $_POST['post_date_gmt'] = get_gmt_from_date( $_POST['post_date'] );
+ }
+
+ return true;
+}
+
+
// Update an existing post with values provided in $_POST.
function edit_post() {
@@ -23,78 +120,9 @@ function edit_post() {
return $post_ID;
}
- // Rename.
- $_POST['ID'] = (int) $_POST['post_ID'];
- $_POST['post_content'] = $_POST['content'];
- $_POST['post_excerpt'] = $_POST['excerpt'];
- $_POST['post_parent'] = isset($_POST['parent_id'])? $_POST['parent_id'] : '';
- $_POST['to_ping'] = $_POST['trackback_url'];
-
- if (!empty ( $_POST['post_author_override'] ) ) {
- $_POST['post_author'] = (int) $_POST['post_author_override'];
- } else
- if (!empty ( $_POST['post_author'] ) ) {
- $_POST['post_author'] = (int) $_POST['post_author'];
- } else {
- $_POST['post_author'] = (int) $_POST['user_ID'];
- }
-
- if ( $_POST['post_author'] != $_POST['user_ID'] ) {
- if ( 'page' == $_POST['post_type'] ) {
- if ( !current_user_can( 'edit_others_pages' ) )
- wp_die( __('You are not allowed to edit pages as this user.' ));
- } else {
- if ( !current_user_can( 'edit_others_posts' ) )
- wp_die( __('You are not allowed to edit posts as this user.' ));
-
- }
- }
-
- // What to do based on which button they pressed
- if ( isset($_POST['saveasdraft']) && '' != $_POST['saveasdraft'] )
- $_POST['post_status'] = 'draft';
- if ( isset($_POST['saveasprivate']) && '' != $_POST['saveasprivate'] )
- $_POST['post_status'] = 'private';
- if ( isset($_POST['publish']) && ( '' != $_POST['publish'] ) && ( $_POST['post_status'] != 'private' ) )
- $_POST['post_status'] = 'publish';
- if ( isset($_POST['advanced']) && '' != $_POST['advanced'] )
- $_POST['post_status'] = 'draft';
-
- if ( 'page' == $_POST['post_type'] ) {
- if ('publish' == $_POST['post_status'] && !current_user_can( 'publish_pages' ))
- $_POST['post_status'] = 'pending';
- } else {
- if ('publish' == $_POST['post_status'] && !current_user_can( 'publish_posts' ))
- $_POST['post_status'] = 'pending';
- }
-
- if (!isset( $_POST['comment_status'] ))
- $_POST['comment_status'] = 'closed';
-
- if (!isset( $_POST['ping_status'] ))
- $_POST['ping_status'] = 'closed';
-
- foreach ( array ('aa', 'mm', 'jj', 'hh', 'mn') as $timeunit ) {
- if ( !empty( $_POST['hidden_' . $timeunit] ) && $_POST['hidden_' . $timeunit] != $_POST[$timeunit] ) {
- $_POST['edit_date'] = '1';
- break;
- }
- }
-
- if (!empty ( $_POST['edit_date'] ) ) {
- $aa = $_POST['aa'];
- $mm = $_POST['mm'];
- $jj = $_POST['jj'];
- $hh = $_POST['hh'];
- $mn = $_POST['mn'];
- $ss = $_POST['ss'];
- $jj = ($jj > 31 ) ? 31 : $jj;
- $hh = ($hh > 23 ) ? $hh -24 : $hh;
- $mn = ($mn > 59 ) ? $mn -60 : $mn;
- $ss = ($ss > 59 ) ? $ss -60 : $ss;
- $_POST['post_date'] = "$aa-$mm-$jj $hh:$mn:$ss";
- $_POST['post_date_gmt'] = get_gmt_from_date( "$aa-$mm-$jj $hh:$mn:$ss" );
- }
+ $translated = _wp_translate_postdata( true );
+ if ( is_wp_error($translated) )
+ wp_die( $translated->get_error_message() );
// Meta Stuff
if ( isset($_POST['meta']) && $_POST['meta'] ) {
@@ -236,79 +264,9 @@ function wp_write_post() {
}
}
- // Rename.
- $_POST['post_content'] = $_POST['content'];
- $_POST['post_excerpt'] = $_POST['excerpt'];
- $_POST['post_parent'] = isset($_POST['parent_id'])? $_POST['parent_id'] : '';
- $_POST['to_ping'] = $_POST['trackback_url'];
-
- if (!empty ( $_POST['post_author_override'] ) ) {
- $_POST['post_author'] = (int) $_POST['post_author_override'];
- } else {
- if (!empty ( $_POST['post_author'] ) ) {
- $_POST['post_author'] = (int) $_POST['post_author'];
- } else {
- $_POST['post_author'] = (int) $_POST['user_ID'];
- }
-
- }
-
- if ( $_POST['post_author'] != $_POST['user_ID'] ) {
- if ( 'page' == $_POST['post_type'] ) {
- if ( !current_user_can( 'edit_others_pages' ) )
- return new WP_Error( 'edit_others_pages', __( 'You are not allowed to create pages as this user.' ) );
- } else {
- if ( !current_user_can( 'edit_others_posts' ) )
- return new WP_Error( 'edit_others_posts', __( 'You are not allowed to post as this user.' ) );
-
- }
- }
-
- // What to do based on which button they pressed
- if ( isset($_POST['saveasdraft']) && '' != $_POST['saveasdraft'] )
- $_POST['post_status'] = 'draft';
- if ( isset($_POST['saveasprivate']) && '' != $_POST['saveasprivate'] )
- $_POST['post_status'] = 'private';
- if ( isset($_POST['publish']) && ( '' != $_POST['publish'] ) && ( $_POST['post_status'] != 'private' ) )
- $_POST['post_status'] = 'publish';
- if ( isset($_POST['advanced']) && '' != $_POST['advanced'] )
- $_POST['post_status'] = 'draft';
-
- if ( 'page' == $_POST['post_type'] ) {
- if ('publish' == $_POST['post_status'] && !current_user_can( 'publish_pages' ) )
- $_POST['post_status'] = 'pending';
- } else {
- if ('publish' == $_POST['post_status'] && !current_user_can( 'publish_posts' ) )
- $_POST['post_status'] = 'pending';
- }
-
- if (!isset( $_POST['comment_status'] ))
- $_POST['comment_status'] = 'closed';
-
- if (!isset( $_POST['ping_status'] ))
- $_POST['ping_status'] = 'closed';
-
- foreach ( array ('aa', 'mm', 'jj', 'hh', 'mn') as $timeunit ) {
- if ( !empty( $_POST['hidden_' . $timeunit] ) && $_POST['hidden_' . $timeunit] != $_POST[$timeunit] ) {
- $_POST['edit_date'] = '1';
- break;
- }
- }
-
- if (!empty ( $_POST['edit_date'] ) ) {
- $aa = $_POST['aa'];
- $mm = $_POST['mm'];
- $jj = $_POST['jj'];
- $hh = $_POST['hh'];
- $mn = $_POST['mn'];
- $ss = $_POST['ss'];
- $jj = ($jj > 31 ) ? 31 : $jj;
- $hh = ($hh > 23 ) ? $hh -24 : $hh;
- $mn = ($mn > 59 ) ? $mn -60 : $mn;
- $ss = ($ss > 59 ) ? $ss -60 : $ss;
- $_POST['post_date'] = sprintf( "%04d-%02d-%02d %02d:%02d:%02d", $aa, $mm, $jj, $hh, $mn, $ss );
- $_POST['post_date_gmt'] = get_gmt_from_date( $_POST['post_date'] );
- }
+ $translated = _wp_translate_postdata( false );
+ if ( is_wp_error($translated) )
+ return $translated;
// Create the post.
$post_ID = wp_insert_post( $_POST );
@@ -687,4 +645,28 @@ function wp_set_post_lock( $post_id ) {
update_post_meta( $post->ID, '_edit_last', $current_user->ID );
}
-?>
+/**
+ * wp_create_autosave() - creates autosave data for the specified post from $_POST data
+ *
+ * @package WordPress
+ * @subpackage Post Revisions
+ * @since 2.6
+ *
+ * @uses _wp_translate_postdata()
+ * @uses _wp_revision_fields()
+ */
+function wp_create_autosave( $post_id ) {
+ $translated = _wp_translate_postdata( true );
+ if ( is_wp_error( $translated ) )
+ return $translated;
+
+ // Only store one autosave. If there is already an autosave, overwrite it.
+ if ( $old_autosave = wp_get_autosave( $post_id ) ) {
+ $new_autosave = _wp_revision_fields( $_POST, true );
+ $new_autosave['ID'] = $old_autosave->ID;
+ return wp_update_post( $new_autosave );
+ }
+
+ // Otherwise create the new autosave as a special post revision
+ return _wp_put_revision( $_POST, true );
+}
diff --git a/wp-admin/revision.php b/wp-admin/revision.php
index 18bfcc4a31..a2ddef5631 100644
--- a/wp-admin/revision.php
+++ b/wp-admin/revision.php
@@ -2,117 +2,156 @@
require_once('admin.php');
-$parent_file = 'edit.php';
-$submenu_file = 'edit.php';
-
-wp_reset_vars(array('revision', 'diff', 'restore'));
-
+wp_reset_vars(array('revision', 'left', 'right', 'action'));
$revision_id = absint($revision);
$diff = absint($diff);
+$left = absint($left);
+$right = absint($right);
-if ( $diff ) {
- $restore = false;
- $revision = get_post( $revision_id );
- $post = 'revision' == $revision->post_type ? get_post( $revision->post_parent ) : get_post( $revision_id );
- $left_revision = get_post( $diff );
+
+$parent_file = $redirect = 'edit.php';
+$submenu_file = 'edit.php';
+$title = __( 'Post Revision' );
+
+
+switch ( $action ) :
+case 'delete' : // stubs
+case 'edit' :
+ $redirect = remove_query_arg( 'action' );
+ break;
+case 'restore' :
+ if ( !current_user_can( 'edit_post', $revision->post_parent ) )
+ break;
+ if ( !$revision = wp_get_revision( $revision_id ) )
+ break;
+ if ( !$post = get_post( $revision->post_parent ) )
+ break;
+
+ check_admin_referer( "restore-post_$post->ID|$revision->ID" );
+
+ wp_restore_revision( $revision->ID );
+ $redirect = add_query_arg( array( 'message' => 5, 'revision' => $revision->ID ), get_edit_post_link( $post->ID, 'url' ) );
+ break;
+case 'diff' :
+ if ( !$left_revision = get_post( $left ) )
+ break;
+ if ( !$right_revision = get_post( $right ) )
+ break;
+
+ if ( !current_user_can( 'edit_post', $left_revision->ID ) || !current_user_can( 'edit_post', $right_revision->ID ) )
+ break;
// Don't allow reverse diffs?
- if ( strtotime($revision->post_modified_gmt) < strtotime($left_revision->post_modified_gmt) ) {
- wp_redirect( add_query_arg( array( 'diff' => $revision->ID, 'revision' => $diff ) ) );
- exit;
+ if ( strtotime($right_revision->post_modified_gmt) < strtotime($left_revision->post_modified_gmt) ) {
+ $redirect = add_query_arg( array( 'left' => $right, 'right' => $left ) );
+ break;
}
- $h2 = __( 'Compare Revisions of “%1$s”' );
- $right = $revision->ID;
- $left = $left_revision->ID;
+ if ( $left_revision->ID == $right_revision->post_parent ) // right is a revision of left
+ $post =& $left_revision;
+ elseif ( $left_revision->post_parent == $right_revision->ID ) // left is a revision of right
+ $post =& $right_revision;
+ elseif ( $left_revision->post_parent == $right_revision->post_parent ) // both are revisions of common parent
+ $post = get_post( $left_revision->post_parent );
+ else
+ break; // Don't diff two unrelated revisions
if (
// They're the same
- $left_revision->ID == $revision->ID
- ||
- // They don't have a comment parent (and we're not comparing a revision to it's post)
- ( $left_revision->ID != $revision->post_parent && $left_revision->post_parent != $revision->ID && $left_revision->post_parent != $revision->post_parent )
+ $left_revision->ID == $right_revision->ID
||
// Neither is a revision
- ( !wp_get_revision( $left_revision->ID ) && !wp_get_revision( $revision->ID ) )
- ) {
- wp_redirect( get_edit_post_link( $revision->ID, 'url' ) );
- exit();
- }
-} else {
- $revision = wp_get_revision( $revision_id );
- $post = get_post( $revision->post_parent );
- $h2 = __( 'Post Revision for “%1$s” created on %2$s' );
- $right = $post->ID;
+ ( !wp_get_revision( $left_revision->ID ) && !wp_get_revision( $right_revision->ID ) )
+ )
+ break;
+
+ $post_title = '' . get_the_title() . '';
+ $h2 = sprintf( __( 'Compare Revisions of “%1$s”' ), $post_title );
+
+ $left = $left_revision->ID;
+ $right = $right_revision->ID;
+
+ $redirect = false;
+ break;
+case 'view' :
+default :
+ if ( !$revision = wp_get_revision( $revision_id ) )
+ break;
+ if ( !$post = get_post( $revision->post_parent ) )
+ break;
+
+ if ( !current_user_can( 'edit_post', $revision->ID ) || !current_user_can( 'edit_post', $post->ID ) )
+ break;
+
+ $post_title = '' . get_the_title() . '';
+ $revision_title = wp_post_revision_title( $revision, false );
+ $h2 = sprintf( __( 'Post Revision for “%1$s” created on %2$s' ), $post_title, $revision_title );
+
+ // Sets up the diff radio buttons
$left = $revision->ID;
-}
+ $right = $post->ID;
-if ( !$revision || !$post ) {
- wp_redirect("edit.php");
- exit();
-}
+ $redirect = false;
+ break;
+endswitch;
-if ( $restore && current_user_can( 'edit_post', $revision->post_parent ) ) {
- check_admin_referer( "restore-post_$post->ID|$revision->ID" );
- wp_restore_revision( $revision->ID );
- wp_redirect( add_query_arg( array( 'message' => 5, 'revision' => $revision->ID ), get_edit_post_link( $post->ID, 'url' ) ) );
+if ( $redirect ) {
+ wp_redirect( $redirect );
exit;
}
+// Converts post_author ID# into name
add_filter( '_wp_revision_field_post_author', 'get_author_name' );
-$title = __( 'Post Revision' );
-
require_once( 'admin-header.php' );
-$post_title = '' . get_the_title() . '';
-$revision_time = wp_post_revision_time( $revision );
?>