Make WordPress Core

Ticket #23665: 23665-2.patch

File 23665-2.patch, 7.5 KB (added by azaozz, 12 years ago)
  • wp-admin/includes/ajax-actions.php

     
    10381038        $do_autosave = (bool) $_POST['autosave'];
    10391039        $do_lock = true;
    10401040
     1041        if ( ! $user_id = get_current_user_id() )
     1042                wp_die('-1');
     1043
    10411044        $data = $alert = '';
    10421045        /* translators: draft saved date format, see http://php.net/date */
    10431046        $draft_saved_date_format = __('g:i:s a');
     
    10571060                $_POST['post_status'] = 'draft';
    10581061
    10591062        if ( $last = wp_check_post_lock( $post->ID ) ) {
    1060                 $do_autosave = $do_lock = false;
     1063                $do_lock = false;
    10611064
    10621065                $last_user = get_userdata( $last );
    10631066                $last_user_name = $last_user ? $last_user->display_name : __( 'Someone' );
    1064                 $data = __( 'Autosave disabled.' );
    1065 
    1066                 $supplemental['disable_autosave'] = 'disable';
    10671067                $alert .= sprintf( __( '%s is currently editing this article. If you update it, you will overwrite the changes.' ), esc_html( $last_user_name ) );
    10681068        }
    10691069
     
    10761076        }
    10771077
    10781078        if ( $do_autosave ) {
    1079                 // Drafts and auto-drafts are just overwritten by autosave
    1080                 if ( 'auto-draft' == $post->post_status || 'draft' == $post->post_status ) {
     1079                // Drafts and auto-drafts are just overwritten by autosave for the same user
     1080                if ( $user_id == $post->post_author && ( 'auto-draft' == $post->post_status || 'draft' == $post->post_status ) ) {
    10811081                        $id = edit_post();
    1082                 } else { // Non drafts are not overwritten. The autosave is stored in a special post revision.
     1082                } else { // Non drafts are not overwritten. The autosave is stored in a special post revision for each user.
    10831083                        $revision_id = wp_create_post_autosave( $post->ID );
    10841084                        if ( is_wp_error($revision_id) )
    10851085                                $id = $revision_id;
  • wp-admin/includes/post.php

     
    12361236        if ( is_wp_error( $translated ) )
    12371237                return $translated;
    12381238
    1239         // Only store one autosave. If there is already an autosave, overwrite it.
    1240         if ( $old_autosave = wp_get_post_autosave( $post_id ) ) {
     1239        $post_author = get_current_user_id();
     1240
     1241        // Store one autosave per author. If there is already an autosave, overwrite it.
     1242        if ( $old_autosave = wp_get_post_autosave( $post_id, $post_author ) ) {
    12411243                $new_autosave = _wp_post_revision_fields( $_POST, true );
    12421244                $new_autosave['ID'] = $old_autosave->ID;
    1243                 $new_autosave['post_author'] = get_current_user_id();
     1245                $new_autosave['post_author'] = $post_author;
    12441246                return wp_update_post( $new_autosave );
    12451247        }
    12461248
     
    12951297                        wp_die(__('You are not allowed to edit this post.'));
    12961298        }
    12971299
    1298         if ( 'draft' == $post->post_status ) {
     1300        $user_id = get_current_user_id();
     1301        if ( 'draft' == $post->post_status && $user_id == $post->post_author ) {
    12991302                $id = edit_post();
    13001303        } else { // Non drafts are not overwritten. The autosave is stored in a special post revision.
    13011304                $id = wp_create_post_autosave( $post->ID );
     
    13061309        if ( is_wp_error($id) )
    13071310                wp_die( $id->get_error_message() );
    13081311
    1309         if ( $_POST['post_status'] == 'draft' ) {
     1312        if ( $_POST['post_status'] == 'draft' && $user_id == $post->post_author ) {
    13101313                $url = add_query_arg( 'preview', 'true', get_permalink($id) );
    13111314        } else {
    13121315                $nonce = wp_create_nonce('post_preview_' . $id);
  • wp-admin/post.php

     
    169169                add_action('admin_notices', '_admin_notice_post_locked' );
    170170        } else {
    171171                $active_post_lock = wp_set_post_lock( $post->ID );
    172 
    173                 if ( 'attachment' !== $post_type )
    174                         wp_enqueue_script('autosave');
    175172        }
    176173
     174        if ( 'attachment' !== $post_type )
     175                wp_enqueue_script('autosave');
     176
    177177        $title = $post_type_object->labels->edit_item;
    178178        $post = get_post($post_id, OBJECT, 'edit');
    179179
  • wp-includes/revision.php

     
    135135 * Retrieve the autosaved data of the specified post.
    136136 *
    137137 * Returns a post object containing the information that was autosaved for the
    138  * specified post.
     138 * specified post. If the optional $user_id is passed, returns the autosave for that user
     139 * otherwise returns the latest autosave.
    139140 *
    140141 * @package WordPress
    141142 * @subpackage Post_Revisions
    142143 * @since 2.6.0
    143  *
     144 * @uses wp_get_post_revisions()
     145 * 
    144146 * @param int $post_id The post ID.
     147 * @param int $user_id optional The post author ID.
    145148 * @return object|bool The autosaved data or false on failure or when no autosave exists.
    146149 */
    147 function wp_get_post_autosave( $post_id ) {
     150function wp_get_post_autosave( $post_id, $user_id = 0 ) {
     151        $revisions = wp_get_post_revisions($post_id);
    148152
    149         if ( !$post = get_post( $post_id ) )
    150                 return false;
     153        foreach ( $revisions as $revision ) {
     154                if ( false !== strpos( $revision->post_name, "{$post_id}-autosave" ) ) {
     155                        if ( $user_id && $user_id != $revision->post_author )
     156                                continue;
    151157
    152         $q = array(
    153                 'name' => "{$post->ID}-autosave",
    154                 'post_parent' => $post->ID,
    155                 'post_type' => 'revision',
    156                 'post_status' => 'inherit'
    157         );
     158                        return $revision;
     159                        break;
     160                }
     161        }
    158162
    159         // Use WP_Query so that the result gets cached
    160         $autosave_query = new WP_Query;
    161 
    162         add_action( 'parse_query', '_wp_get_post_autosave_hack' );
    163         $autosave = $autosave_query->query( $q );
    164         remove_action( 'parse_query', '_wp_get_post_autosave_hack' );
    165 
    166         if ( $autosave && is_array($autosave) && is_object($autosave[0]) )
    167                 return $autosave[0];
    168 
    169163        return false;
    170164}
    171165
    172166/**
    173  * Internally used to hack WP_Query into submission.
    174  *
    175  * @package WordPress
    176  * @subpackage Post_Revisions
    177  * @since 2.6.0
    178  *
    179  * @param object $query WP_Query object
    180  */
    181 function _wp_get_post_autosave_hack( $query ) {
    182         $query->is_single = false;
    183 }
    184 
    185 /**
    186167 * Determines if the specified post is a revision.
    187168 *
    188169 * @package WordPress
     
    195176function wp_is_post_revision( $post ) {
    196177        if ( !$post = wp_get_post_revision( $post ) )
    197178                return false;
     179
    198180        return (int) $post->post_parent;
    199181}
    200182
     
    211193function wp_is_post_autosave( $post ) {
    212194        if ( !$post = wp_get_post_revision( $post ) )
    213195                return false;
    214         if ( "{$post->post_parent}-autosave" !== $post->post_name )
    215                 return false;
    216         return (int) $post->post_parent;
     196
     197        if ( false !== strpos( $post->post_name, "{$post->post_parent}-autosave" ) )
     198                return (int) $post->post_parent;
     199
     200        return false;
    217201}
    218202
    219203/**
     
    234218                $post = get_object_vars( $post );
    235219        elseif ( !is_array($post) )
    236220                $post = get_post($post, ARRAY_A);
     221
    237222        if ( !$post || empty($post['ID']) )
    238223                return;
    239224
     
    249234
    250235        if ( $revision_id )
    251236                do_action( '_wp_put_post_revision', $revision_id );
     237
    252238        return $revision_id;
    253239}
    254240
     
    312298                $fields = array_keys( _wp_post_revision_fields() );
    313299
    314300        $update = array();
    315         foreach( array_intersect( array_keys( $revision ), $fields ) as $field )
     301        foreach( array_intersect( array_keys( $revision ), $fields ) as $field ) {
    316302                $update[$field] = $revision[$field];
     303        }
    317304
    318305        if ( !$update )
    319306                return false;
     
    374361 * @return array empty if no revisions
    375362 */
    376363function wp_get_post_revisions( $post_id = 0, $args = null ) {
    377         if ( ! WP_POST_REVISIONS )
    378                 return array();
    379364        if ( ( !$post = get_post( $post_id ) ) || empty( $post->ID ) )
    380365                return array();
    381366
     
    385370
    386371        if ( !$revisions = get_children( $args ) )
    387372                return array();
     373
    388374        return $revisions;
    389375}
    390376