From 129d030c20b2c928895c4444c515712d86ad76c7 Mon Sep 17 00:00:00 2001 From: ryan Date: Thu, 8 May 2008 17:25:07 +0000 Subject: [PATCH] Move autosave to post revisions. Props mdawaffe. see #6775 git-svn-id: http://svn.automattic.com/wordpress/trunk@7907 1a063a9b-81f0-0310-95a4-ce76da25c4cd --- wp-admin/admin-ajax.php | 18 ++- wp-admin/css/global.css | 4 + wp-admin/edit-form-advanced.php | 39 +++-- wp-admin/includes/post.php | 274 +++++++++++++++----------------- wp-admin/revision.php | 166 +++++++++++-------- wp-includes/js/autosave.js | 2 - wp-includes/pluggable.php | 14 +- wp-includes/post-template.php | 50 +++--- wp-includes/post.php | 90 ++++++++--- wp-includes/script-loader.php | 2 +- 10 files changed, 391 insertions(+), 268 deletions(-) diff --git a/wp-admin/admin-ajax.php b/wp-admin/admin-ajax.php index 839070c34..5e27b8148 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 926aa88bd..295adea87 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 89e84877e..188b95135 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 8cd3c9e03..d683a49bf 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 18bfcc4a3..a2ddef563 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 ); ?>
-

+

- - + - - $field_title ) : - if ( !$diff ) - add_filter( "_wp_revision_field_$field", 'htmlspecialchars' ); - $content = apply_filters( "_wp_revision_field_$field", $revision->$field, $field ); - if ( $diff ) { + if ( 'diff' == $action ) { $left_content = apply_filters( "_wp_revision_field_$field", $left_revision->$field, $field ); - if ( !$content = wp_text_diff( $left_content, $content ) ) - continue; + $right_content = apply_filters( "_wp_revision_field_$field", $right_revision->$field, $field ); + if ( !$content = wp_text_diff( $left_content, $right_content ) ) + continue; // There is no difference between left and right + $identical = false; + } else { + add_filter( "_wp_revision_field_$field", 'htmlspecialchars' ); + $content = apply_filters( "_wp_revision_field_$field", $revision->$field, $field ); } - $identical = false; ?> - + - + - + 'form-table', 'exclude' => $revision->ID, 'parent' => true, 'right' => $right, 'left' => $left ) ); - require_once( 'admin-footer.php' ); +wp_list_post_revisions( $post, array( 'format' => 'form-table', 'parent' => true, 'right' => $right, 'left' => $left ) ); + +require_once( 'admin-footer.php' ); diff --git a/wp-includes/js/autosave.js b/wp-includes/js/autosave.js index b0a2fa562..aed3a0ece 100644 --- a/wp-includes/js/autosave.js +++ b/wp-includes/js/autosave.js @@ -168,8 +168,6 @@ var autosave = function() { autosave_disable_buttons(); var origStatus = jQuery('#original_post_status').val(); - if ( 'draft' != origStatus ) // autosave currently only turned on for drafts - doAutoSave = false; autosaveLast = jQuery("#title").val()+jQuery("#content").val(); goodcats = ([]); diff --git a/wp-includes/pluggable.php b/wp-includes/pluggable.php index 1d9ed4d51..ab102909c 100644 --- a/wp-includes/pluggable.php +++ b/wp-includes/pluggable.php @@ -1392,7 +1392,7 @@ if ( !function_exists( 'wp_text_diff' ) ) : * @return string human readable HTML of string differences. Empty string if strings are equivalent */ function wp_text_diff( $left_string, $right_string, $args = null ) { - $defaults = array( 'title' => '' ); + $defaults = array( 'title' => '', 'title_left' => '', 'title_right' => '' ); $args = wp_parse_args( $args, $defaults ); // PEAR Text_Diff is lame; it includes things from include_path rather than it's own path. @@ -1425,8 +1425,18 @@ function wp_text_diff( $left_string, $right_string, $args = null ) { $r = "
- + + + +

\n"; $r .= ""; + if ( $args['title'] || $args['title_left'] || $args['title_right'] ) + $r .= ""; if ( $args['title'] ) - $r .= "\n"; + $r .= "\n"; + if ( $args['title_left'] || $args['title_right'] ) { + $r .= "\n"; + $r .= "\t\n"; + $r .= "\t\n"; + $r .= "\n"; + } + if ( $args['title'] || $args['title_left'] || $args['title_right'] ) + $r .= "\n"; $r .= "\n$diff\n\n"; $r .= "
$args[title]
$args[title]
$args[title_left]$args[title_right]
"; diff --git a/wp-includes/post-template.php b/wp-includes/post-template.php index 7bbdbadb3..9dc7f26de 100644 --- a/wp-includes/post-template.php +++ b/wp-includes/post-template.php @@ -566,27 +566,39 @@ function is_page_template($template = '') { } /** - * wp_post_revision_time() - returns formatted datetimestamp of a revision + * wp_post_revision_title() - returns formatted datetimestamp of a revision (linked to that revisions's page) * * @package WordPress * @subpackage Post Revisions * @since 2.6 * - * @uses wp_get_revision() * @uses date_i18n() * * @param int|object $revision revision ID or revision object + * @param bool $link optional Link to revisions's page? * @return string i18n formatted datetimestamp or localized 'Corrent Revision' */ -function wp_post_revision_time( $revision ) { - if ( !$revision = wp_get_revision( $revision ) ) { - if ( $revision = get_post( $revision ) ) - return __( 'Current Revision' ); +function wp_post_revision_title( $revision, $link = true ) { + if ( !$revision = get_post( $revision ) ) return $revision; - } - $datef = _c( 'j F, Y @ G:i|revision date format'); - return date_i18n( $datef, strtotime( $revision->post_date_gmt . ' +0000' ) ); + if ( !in_array( $revision->post_type, array( 'post', 'page', 'revision' ) ) ) + return false; + + $datef = _c( 'j F, Y @ G:i|revision date format'); + $autosavef = __( '%s [Autosave]' ); + $currentf = __( '%s [Current Revision]' ); + + $date = date_i18n( $datef, strtotime( $revision->post_modified_gmt . ' +0000' ) ); + if ( $link && current_user_can( 'edit_post', $revision->ID ) && $link = get_edit_post_link( $revision->ID ) ) + $date = "$date"; + + if ( 'revision' != $revision->post_type ) + $date = sprintf( $currentf, $date ); + elseif ( "{$revision->post_parent}-autosave" == $revision->post_name ) + $date = sprintf( $autosavef, $date ); + + return $date; } /** @@ -605,7 +617,7 @@ function wp_post_revision_time( $revision ) { * @since 2.6 * * @uses wp_get_post_revisions() - * @uses wp_post_revision_time() + * @uses wp_post_revision_title() * @uses get_edit_post_link() * @uses get_author_name() * @@ -630,33 +642,32 @@ function wp_list_post_revisions( $post_id = 0, $args = null ) { // TODO? split i $rows = ''; $class = false; foreach ( $revisions as $revision ) { - $date = wp_post_revision_time( $revision ); - if ( $link = get_edit_post_link( $revision->ID ) ) - $date = "$date"; + $date = wp_post_revision_title( $revision ); $name = get_author_name( $revision->post_author ); if ( 'form-table' == $format ) { if ( $left ) - $old_checked = $left == $revision->ID ? ' checked="checked"' : ''; + $left_checked = $left == $revision->ID ? ' checked="checked"' : ''; else - $old_checked = $new_checked ? ' checked="checked"' : ''; - $new_checked = $right == $revision->ID ? ' checked="checked"' : ''; + $left_checked = $right_checked ? ' checked="checked"' : ''; // [sic] (the next one) + $right_checked = $right == $revision->ID ? ' checked="checked"' : ''; $class = $class ? '' : " class='alternate'"; if ( $post->ID != $revision->ID && current_user_can( 'edit_post', $post->ID ) ) - $actions = 'ID|$revision->ID" ) . '">' . __( 'Restore' ) . ''; + $actions = 'ID|$revision->ID" ) . '">' . __( 'Restore' ) . ''; else $actions = ''; $rows .= "\n"; - $rows .= "\t\n"; + $rows .= "\t\n"; $rows .= "\t$date\n"; $rows .= "\t$name\n"; $rows .= "\t$actions\n"; $rows .= "\n"; } else { - $rows .= "\t
  • " . sprintf( $titlef, $date, $name ). "
  • \n"; + $title = sprintf( $titlef, $date, $name ); + $rows .= "\t
  • $title
  • \n"; } } @@ -667,6 +678,7 @@ function wp_list_post_revisions( $post_id = 0, $args = null ) { // TODO? split i
    +
    diff --git a/wp-includes/post.php b/wp-includes/post.php index 62053f278..7733794f8 100644 --- a/wp-includes/post.php +++ b/wp-includes/post.php @@ -88,7 +88,6 @@ function &get_children($args = '', $output = OBJECT) { $r = wp_parse_args( $args, $defaults ); $children = get_posts( $r ); - if ( !$children ) return false; @@ -2957,18 +2956,19 @@ function _get_post_ancestors(&$_post) { /** * _wp_revision_fields() - determines which fields of posts are to be saved in revisions * - * Does two things. If passed a postn *array*, it will return a post array ready to be + * Does two things. If passed a post *array*, it will return a post array ready to be * insterted into the posts table as a post revision. - * Otherwise, returns an array whose keys are the post fields to be saved post revisions. + * Otherwise, returns an array whose keys are the post fields to be saved for post revisions. * * @package WordPress * @subpackage Post Revisions * @since 2.6 * * @param array $post optional a post array to be processed for insertion as a post revision + * @param bool $autosave optional Is the revision an autosave? * @return array post array ready to be inserted as a post revision or array of fields that can be versioned */ -function _wp_revision_fields( $post = null ) { +function _wp_revision_fields( $post = null, $autosave = false ) { static $fields = false; if ( !$fields ) { @@ -2980,6 +2980,9 @@ function _wp_revision_fields( $post = null ) { 'post_excerpt' => __( 'Excerpt' ), ); + // Runs only once + $fields = apply_filters( '_wp_revision_fields', $fields ); + // WP uses these internally either in versioning or elsewhere - they cannot be versioned foreach ( array( 'ID', 'post_name', 'post_parent', 'post_date', 'post_date_gmt', 'post_status', 'post_type', 'comment_count' ) as $protect ) unset( $fields[$protect] ); @@ -2995,7 +2998,7 @@ function _wp_revision_fields( $post = null ) { $return['post_parent'] = $post['ID']; $return['post_status'] = 'inherit'; $return['post_type'] = 'revision'; - $return['post_name'] = "$post[ID]-revision"; + $return['post_name'] = $autosave ? "$post[ID]-autosave" : "$post[ID]-revision"; $return['post_date'] = $post['post_modified']; $return['post_date_gmt'] = $post['post_modified_gmt']; @@ -3015,20 +3018,61 @@ function _wp_revision_fields( $post = null ) { * @return mixed null or 0 if error, new revision ID if success */ function wp_save_revision( $post_id ) { - // TODO: rework autosave to use special type of post revision + // We do autosaves manually with wp_create_autosave() if ( @constant( 'DOING_AUTOSAVE' ) ) return; if ( !$post = get_post( $post_id, ARRAY_A ) ) return; - // TODO: open this up for pages also - if ( 'post' != $post->post_type ) + if ( !in_array( $post['post_type'], array( 'post', 'page' ) ) ) return; return _wp_put_revision( $post ); } +/** + * wp_get_autosave() - returns the autosaved data of the specified post. + * + * Returns a post object containing the information that was autosaved for the specified post. + * + * @package WordPress + * @subpackage Post Revisions + * @since 2.6 + * + * @param int $post_id The post ID + * @return object|bool the autosaved data or false on failure or when no autosave exists + */ +function wp_get_autosave( $post_id ) { + global $wpdb; + if ( !$post = get_post( $post_id ) ) + return false; + + $q = array( + 'name' => "{$post->ID}-autosave", + 'post_parent' => $post->ID, + 'post_type' => 'revision', + 'post_status' => 'inherit' + ); + + // Use WP_Query so that the result gets cached + $autosave_query = new WP_Query; + + add_action( 'parse_query', '_wp_get_autosave_hack' ); + $autosave = $autosave_query->query( $q ); + remove_action( 'parse_query', '_wp_get_autosave_hack' ); + + if ( $autosave && is_array($autosave) && is_object($autosave[0]) ) + return $autosave[0]; + + return false; +} + +// Internally used to hack WP_Query into submission +function _wp_get_autosave_hack( $query ) { + $query->is_single = false; +} + /** * _wp_put_revision() - Inserts post data into the posts table as a post revision * @@ -3039,25 +3083,28 @@ function wp_save_revision( $post_id ) { * @uses wp_insert_post() * * @param int|object|array $post post ID, post object OR post array + * @param bool $autosave optional Is the revision an autosave? * @return mixed null or 0 if error, new revision ID if success */ -function _wp_put_revision( $post = null ) { +function _wp_put_revision( $post = null, $autosave = false ) { if ( is_object($post) ) $post = get_object_vars( $post ); elseif ( !is_array($post) ) $post = get_post($post, ARRAY_A); - if ( !$post || empty($post['ID']) ) return; if ( isset($post['post_type']) && 'revision' == $post_post['type'] ) return new WP_Error( 'post_type', __( 'Cannot create a revision of a revision' ) ); - $post = _wp_revision_fields( $post ); + $post = _wp_revision_fields( $post, $autosave ); - if ( $revision_id = wp_insert_post( $post ) ) + $revision_id = wp_insert_post( $post ); + if ( is_wp_error($revision_id) ) + return $revision_id; + + if ( $revision_id ) do_action( '_wp_put_revision', $revision_id ); - return $revision_id; } @@ -3127,7 +3174,11 @@ function wp_restore_revision( $revision_id, $fields = null ) { $update['ID'] = $revision['post_parent']; - if ( $post_id = wp_update_post( $update ) ) + $post_id = wp_update_post( $update ); + if ( is_wp_error( $post_id ) ) + return $post_id; + + if ( $post_id ) do_action( 'wp_restore_revision', $post_id, $revision['ID'] ); return $post_id; @@ -3153,7 +3204,11 @@ function wp_delete_revision( $revision_id ) { if ( !$revision = wp_get_revision( $revision_id ) ) return $revision; - if ( $delete = wp_delete_post( $revision->ID ) ) + $delete = wp_delete_post( $revision->ID ); + if ( is_wp_error( $delete ) ) + return $delete; + + if ( $delete ) do_action( 'wp_delete_revision', $revision->ID, $revision ); return $delete; @@ -3174,10 +3229,7 @@ function wp_delete_revision( $revision_id ) { function wp_get_post_revisions( $post_id = 0 ) { if ( ( !$post = get_post( $post_id ) ) || empty( $post->ID ) ) return array(); - - if ( !$revisions = get_children( array( 'post_parent' => $post->ID, 'post_type' => 'revision' ) ) ) + if ( !$revisions = get_children( array( 'post_parent' => $post->ID, 'post_type' => 'revision', 'post_status' => 'inherit' ) ) ) return array(); return $revisions; } - -?> diff --git a/wp-includes/script-loader.php b/wp-includes/script-loader.php index 6d7ecee96..b9208a0df 100644 --- a/wp-includes/script-loader.php +++ b/wp-includes/script-loader.php @@ -47,7 +47,7 @@ class WP_Scripts { 'broken' => __('An unidentified error has occurred.') ) ); - $this->add( 'autosave', '/wp-includes/js/autosave.js', array('schedule', 'wp-ajax-response'), '20080424' ); + $this->add( 'autosave', '/wp-includes/js/autosave.js', array('schedule', 'wp-ajax-response'), '20080507' ); $this->add( 'wp-ajax', '/wp-includes/js/wp-ajax.js', array('prototype'), '20070306'); $this->localize( 'wp-ajax', 'WPAjaxL10n', array(