WordPress.org

Make WordPress Core

Ticket #23314: 23314.2.diff

File 23314.2.diff, 16.8 KB (added by kovshenin, 5 years ago)
  • wp-includes/post.php

     
    3030                'rewrite' => false,
    3131                'query_var' => false,
    3232                'delete_with_user' => true,
    33                 'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions', 'post-formats' ),
     33                'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'excerpt', 'trackbacks', 'custom-fields', 'comments', 'revisions', 'advanced-revisions', 'post-formats' ),
    3434        ) );
    3535
    3636        register_post_type( 'page', array(
     
    4747                'rewrite' => false,
    4848                'query_var' => false,
    4949                'delete_with_user' => true,
    50                 'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'page-attributes', 'custom-fields', 'comments', 'revisions' ),
     50                'supports' => array( 'title', 'editor', 'author', 'thumbnail', 'page-attributes', 'custom-fields', 'comments', 'revisions', 'advanced-revisions' ),
    5151        ) );
    5252
    5353        register_post_type( 'attachment', array(
     
    7979                'labels' => array(
    8080                        'name' => __( 'Revisions' ),
    8181                        'singular_name' => __( 'Revision' ),
     82                        'edit_item' => __( 'Edit Revision' ),
    8283                ),
    8384                'public' => false,
    8485                '_builtin' => true, /* internal use only. don't use this when registering your own post type. */
     
    52415242                return $post;
    52425243
    52435244        $preview = wp_get_post_autosave($post->ID);
     5245        $autosave_id = ( $preview ) ? $preview->ID : 0;
    52445246
     5247        $preview_id = (int) $_GET['preview_id'];
     5248        if ( $autosave_id != $preview_id && current_user_can( 'read_post', $preview_id ) ) {
     5249                $revision = get_post( $preview_id );
     5250                if ( 'revision' == $revision->post_type && $revision->post_parent == $post->ID ) {
     5251                        $preview = $revision;
     5252                }
     5253        }
     5254
    52455255        if ( ! is_object($preview) )
    52465256                return $post;
    52475257
  • wp-admin/includes/post.php

     
    160160        $post_data['post_type'] = $post->post_type;
    161161        $post_data['post_mime_type'] = $post->post_mime_type;
    162162
     163        $parent = null;
     164        $is_advanced_revision = false;
     165        if ( 'revision' == $post->post_type ) {
     166                $parent = get_post( $post->post_parent );
     167                if ( post_type_supports( $parent->post_type, 'advanced-revisions' ) )
     168                        $is_advanced_revision = true;
     169        }
     170
    163171        $ptype = get_post_type_object($post_data['post_type']);
    164172        if ( !current_user_can( $ptype->cap->edit_post, $post_ID ) ) {
    165173                if ( 'page' == $post_data['post_type'] )
     
    243251
    244252        update_post_meta( $post_ID, '_edit_last', $GLOBALS['current_user']->ID );
    245253
    246         wp_update_post( $post_data );
     254        if ( ! empty( $_POST['save-version'] ) && post_type_supports( $post->post_type, 'advanced-revisions' ) ) {
     255                unset( $post_data['post_ID'], $post_data['ID'] );
     256                $post_data['post_type'] = 'revision';
     257                $post_data['post_parent'] = $post_ID;
     258                $post_data['post_status'] = 'draft';
     259        }
    247260
     261        if ( ! empty( $_POST['publish'] ) && $is_advanced_revision ) {
     262                if ( ! current_user_can( 'edit_post', $parent->ID ) )
     263                        wp_die( __( 'You are not allowed to edit this post.' ) );
     264
     265                unset( $post_data['post_parent'] );
     266                $post_data['post_type'] = $parent->post_type;
     267                $post_data['post_status'] = $parent->post_status;
     268                $post_data['ID'] = $parent->ID;
     269                $post_data['post_ID'] = $parent->ID;
     270
     271                // Discard the revision
     272                wp_delete_post( $post->ID, true );
     273        }
     274
     275        $post_ID = ( ! empty( $post_data['ID'] ) ) ? wp_update_post( $post_data ) : wp_insert_post( $post_data );
     276
    248277        // Now that we have an ID we can fix any attachment anchor hrefs
    249278        _fix_attachment_links( $post_ID );
    250279
     
    12791308        $_POST['ID'] = $post_ID;
    12801309        $post = get_post($post_ID);
    12811310
     1311        $parent = null;
     1312        $is_advanced_revision = null;
     1313        if ( 'revision' == $post->post_type ) {
     1314                $parent = get_post( $post->post_parent );
     1315                if ( post_type_supports( $parent->post_type, 'advanced-revisions' ) )
     1316                        $is_advanced_revision = true;
     1317        }
     1318
    12821319        if ( 'page' == $post->post_type ) {
    12831320                if ( !current_user_can('edit_page', $post_ID) )
    12841321                        wp_die(__('You are not allowed to edit this page.'));
     
    12871324                        wp_die(__('You are not allowed to edit this post.'));
    12881325        }
    12891326
     1327        if ( $is_advanced_revision ) {
     1328                $nonce = wp_create_nonce( 'post_preview_' . $post->ID );
     1329                $url = add_query_arg( array( 'preview' => 'true', 'preview_id' => $post->ID, 'preview_nonce' => $nonce ), get_permalink( $parent->ID ) );
     1330                return $url;
     1331        }
     1332
    12901333        if ( 'draft' == $post->post_status ) {
    12911334                $id = edit_post();
    12921335        } else { // Non drafts are not overwritten. The autosave is stored in a special post revision.
  • wp-admin/includes/meta-boxes.php

     
    1515        $post_type = $post->post_type;
    1616        $post_type_object = get_post_type_object($post_type);
    1717        $can_publish = current_user_can($post_type_object->cap->publish_posts);
     18
     19        $parent = null;
     20        $is_advanced_revision = false;
     21        if ( 'revision' == $post->post_type && $post->post_parent ) {
     22                $parent = get_post( $post->post_parent );
     23                $is_advanced_revision = post_type_supports( $parent->post_type, 'advanced-revisions' );
     24        }
    1825?>
    1926<div class="submitbox" id="submitpost">
    2027
     
    2734
    2835<div id="minor-publishing-actions">
    2936<div id="save-action">
    30 <?php if ( 'publish' != $post->post_status && 'future' != $post->post_status && 'pending' != $post->post_status ) { ?>
     37<?php if ( $is_advanced_revision ) { ?>
     38<input type="submit" name="save" id="save-post" value="<?php esc_attr_e( 'Save Changes' ); ?>" class="button" />
     39<?php } elseif ( 'publish' != $post->post_status && 'future' != $post->post_status && 'pending' != $post->post_status ) { ?>
    3140<input <?php if ( 'private' == $post->post_status ) { ?>style="display:none"<?php } ?> type="submit" name="save" id="save-post" value="<?php esc_attr_e('Save Draft'); ?>" class="button" />
    3241<?php } elseif ( 'pending' == $post->post_status && $can_publish ) { ?>
    3342<input type="submit" name="save" id="save-post" value="<?php esc_attr_e('Save as Pending'); ?>" class="button" />
     43<?php } elseif ( 'publish' == $post->post_status && post_type_supports( $post->post_type, 'advanced-revisions' ) ) { ?>
     44<input type="submit" name="save-version" id="save-post" value="<?php esc_attr_e( 'Save a Version' ); ?>" class="button" />
    3445<?php } ?>
    3546<span class="spinner"></span>
    3647</div>
    37 <?php if ( $post_type_object->public ) : ?>
     48<?php if ( $post_type_object->public || $is_advanced_revision ) : ?>
    3849<div id="preview-action">
    3950<?php
    4051if ( 'publish' == $post->post_status ) {
     
    4354} else {
    4455        $preview_link = set_url_scheme( get_permalink( $post->ID ) );
    4556        $preview_link = esc_url( apply_filters( 'preview_post_link', add_query_arg( 'preview', 'true', $preview_link ) ) );
    46         $preview_button = __( 'Preview' );
     57        $preview_button = ( $is_advanced_revision ) ? __( 'Preview Changes' ) : __( 'Preview' );
    4758}
    4859?>
    4960<a class="preview button" href="<?php echo $preview_link; ?>" target="wp-preview" id="post-preview"><?php echo $preview_button; ?></a>
     
    5465</div><!-- #minor-publishing-actions -->
    5566
    5667<div id="misc-publishing-actions">
     68<?php if ( $is_advanced_revision ) : ?>
     69<?php else: ?>
    5770
    5871<div class="misc-pub-section"><label for="post_status"><?php _e('Status:') ?></label>
    5972<span id="post-status-display">
     
    181194<?php endif; ?>
    182195
    183196<?php do_action('post_submitbox_misc_actions'); ?>
    184 </div>
     197<?php endif; // $is_advanced_revision ?>
     198</div><!-- #misc-publishing-actions -->
    185199<div class="clear"></div>
    186200</div>
    187201
     
    194208                $delete_text = __('Delete Permanently');
    195209        else
    196210                $delete_text = __('Move to Trash');
     211
     212        $delete_link = get_delete_post_link( $post->ID );
     213        if ( $is_advanced_revision ) {
     214                $delete_text = __( 'Discard Changes' );
     215                $delete_link = add_query_arg( 'post', $post->ID, get_delete_post_link( $post->post_parent, '', true ) );
     216                $delete_link = wp_nonce_url( $delete_link, "delete-post_{$post->ID}" );
     217        }
    197218        ?>
    198 <a class="submitdelete deletion" href="<?php echo get_delete_post_link($post->ID); ?>"><?php echo $delete_text; ?></a><?php
     219<a class="submitdelete deletion" href="<?php echo esc_url( $delete_link ); ?>"><?php echo esc_html( $delete_text ); ?></a><?php
    199220} ?>
    200221</div>
    201222
     
    208229                <input name="original_publish" type="hidden" id="original_publish" value="<?php esc_attr_e('Schedule') ?>" />
    209230                <?php submit_button( __( 'Schedule' ), 'primary button-large', 'publish', false, array( 'accesskey' => 'p' ) ); ?>
    210231<?php   else : ?>
     232                <?php $publish_label = ( $is_advanced_revision ) ? __( 'Publish Changes' ) : __( 'Publish' ); ?>
     233                <?php if ( $is_advanced_revision ) : ?>
     234                <input name="publish_revision" type="hidden" value="1" />
     235                <?php endif; ?>
    211236                <input name="original_publish" type="hidden" id="original_publish" value="<?php esc_attr_e('Publish') ?>" />
    212                 <?php submit_button( __( 'Publish' ), 'primary button-large', 'publish', false, array( 'accesskey' => 'p' ) ); ?>
     237                <?php submit_button( $publish_label, 'primary button-large', 'publish', false, array( 'accesskey' => 'p' ) ); ?>
    213238<?php   endif;
    214239        else : ?>
    215240                <input name="original_publish" type="hidden" id="original_publish" value="<?php esc_attr_e('Submit for Review') ?>" />
  • wp-admin/post.php

     
    3131if ( $post ) {
    3232        $post_type = $post->post_type;
    3333        $post_type_object = get_post_type_object( $post_type );
     34
     35        if ( post_type_supports( $post_type, 'advanced-revisions' ) ) {
     36                $revisions = get_posts( array(
     37                        'post_parent' => $post->ID,
     38                        'post_type' => 'revision',
     39                        'post_status' => array( 'draft' ),
     40                ) );
     41
     42                if ( ! empty( $revisions ) && is_array( $revisions ) ) {
     43                        $revision = $revisions[0];
     44                        if ( current_user_can( 'edit_post', $revision->ID ) )
     45                                redirect_post( $revision->ID );
     46                }
     47        }
    3448}
    3549
    3650/**
     
    3953 * @param int $post_id Optional. Post ID.
    4054 */
    4155function redirect_post($post_id = '') {
    42         if ( isset($_POST['save']) || isset($_POST['publish']) ) {
     56        $post = get_post( $post_id );
     57
     58        $parent = null;
     59        $is_advanced_revision = false;
     60        if ( 'revision' == $post->post_type ) {
     61                $parent = get_post( $post->post_parent );
     62                if ( post_type_supports( $parent->post_type, 'advanced-revisions' ) )
     63                        $is_advanced_revision = true;
     64        }
     65
     66        if ( ( isset( $_POST['save'] ) || isset( $_POST['publish'] ) ) && ! $is_advanced_revision ) {
    4367                $status = get_post_status( $post_id );
    4468
    4569                if ( isset( $_POST['publish'] ) ) {
     
    5781                                $message = 'draft' == $status ? 10 : 1;
    5882                }
    5983
     84                if ( ! empty( $_POST['publish_revision'] ) )
     85                        $message = 13;
     86
    6087                $location = add_query_arg( 'message', $message, get_edit_post_link( $post_id, 'url' ) );
    6188        } elseif ( isset($_POST['addmeta']) && $_POST['addmeta'] ) {
    6289                $location = add_query_arg( 'message', 2, wp_get_referer() );
     
    6895                $location = $location[0] . '#postcustom';
    6996        } elseif ( 'post-quickpress-save-cont' == $_POST['action'] ) {
    7097                $location = "post.php?action=edit&post=$post_id&message=7";
     98        } elseif ( $is_advanced_revision ) {
     99                $location = add_query_arg( 'post', $post->ID, get_edit_post_link( $parent->ID, 'url' ) );
     100
     101                if ( ! empty( $_POST['save-version'] ) )
     102                        $message = 11;
     103                elseif ( ! empty( $_POST['save'] ) )
     104                        $message = 12;
     105
     106                if ( $message )
     107                        $location = add_query_arg( 'message', $message, $location );
    71108        } else {
    72109                $location = add_query_arg( 'message', 4, get_edit_post_link( $post_id, 'url' ) );
    73110        }
     
    253290                        wp_die( __('Error in deleting.') );
    254291        }
    255292
     293        if ( 'revision' == $post->post_type ) {
     294                $parent = get_post( $post->post_parent );
     295                $sendback = get_edit_post_link( $post->post_parent, 'url' );
     296                $sendback = add_query_arg( 'message', 14, $sendback );
     297        }
     298
    256299        wp_redirect( add_query_arg('deleted', 1, $sendback) );
    257300        exit();
    258301        break;
  • wp-admin/edit-form-advanced.php

     
    2424$user_ID = isset($user_ID) ? (int) $user_ID : 0;
    2525$action = isset($action) ? $action : '';
    2626
    27 if ( post_type_supports($post_type, 'editor') || post_type_supports($post_type, 'thumbnail') ) {
     27$parent = null;
     28$is_advanced_revision = false;
     29if ( 'revision' == $post->post_type ) {
     30        $parent = get_post( $post->post_parent );
     31        if ( post_type_supports( $parent->post_type, 'advanced-revisions' ) )
     32                $is_advanced_revision = true;
     33}
     34
     35if ( post_type_supports( $post_type, 'editor' ) || post_type_supports( $post_type, 'thumbnail' ) || ( $is_advanced_revision && post_type_supports( $parent->post_type, 'editor' ) ) ) {
    2836        add_thickbox();
    2937        wp_enqueue_media( array( 'post' => $post_ID ) );
    3038}
     
    4553                // translators: Publish box date format, see http://php.net/date
    4654                date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ), esc_url( get_permalink($post_ID) ) ),
    4755        10 => sprintf( __('Post draft updated. <a target="_blank" href="%s">Preview post</a>'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ),
     56        11 => __( 'A new version of this post has been created, but not published.' ),
     57        12 => __( 'Your changes have been saved, but not published.' ),
     58        13 => sprintf( __( 'Your changes have been saved and published. <a href="%s">View post</a>' ), esc_url( get_permalink( $post_ID ) ) ),
     59        14 => __( 'Your changes have been discarded.' ),
    4860);
    4961$messages['page'] = array(
    5062         0 => '', // Unused. Messages start at index 1.
     
    5870         8 => sprintf( __('Page submitted. <a target="_blank" href="%s">Preview page</a>'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ),
    5971         9 => sprintf( __('Page scheduled for: <strong>%1$s</strong>. <a target="_blank" href="%2$s">Preview page</a>'), date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) ), esc_url( get_permalink($post_ID) ) ),
    6072        10 => sprintf( __('Page draft updated. <a target="_blank" href="%s">Preview page</a>'), esc_url( add_query_arg( 'preview', 'true', get_permalink($post_ID) ) ) ),
     73        11 => __( 'A new version of this page has been created, but not published.' ),
     74        12 => __( 'Your changes have been saved, but not published.' ),
     75        13 => sprintf( __( 'Your changes have been saved and published. <a href="%s">View page</a>' ), esc_url( get_permalink( $post_ID ) ) ),
     76        14 => __( 'Your changes have been discarded.' ),
    6177);
    6278$messages['attachment'] = array_fill( 1, 10, __( 'Media attachment updated.' ) ); // Hack, for now.
    6379
     
    135151if ( current_theme_supports( 'post-thumbnails', $post_type ) && post_type_supports( $post_type, 'thumbnail' ) )
    136152                add_meta_box('postimagediv', __('Featured Image'), 'post_thumbnail_meta_box', null, 'side', 'low');
    137153
    138 if ( post_type_supports($post_type, 'excerpt') )
     154if ( post_type_supports($post_type, 'excerpt') || ( $is_advanced_revision && post_type_supports( $parent->post_type, 'excerpt' ) ) )
    139155        add_meta_box('postexcerpt', __('Excerpt'), 'post_excerpt_meta_box', null, 'normal', 'core');
    140156
    141157if ( post_type_supports($post_type, 'trackbacks') )
     
    151167if ( ( 'publish' == get_post_status( $post ) || 'private' == get_post_status( $post ) ) && post_type_supports($post_type, 'comments') )
    152168        add_meta_box('commentsdiv', __('Comments'), 'post_comment_meta_box', null, 'normal', 'core');
    153169
    154 if ( ! ( 'pending' == get_post_status( $post ) && ! current_user_can( $post_type_object->cap->publish_posts ) ) )
     170if ( ! ( 'pending' == get_post_status( $post ) && ! current_user_can( $post_type_object->cap->publish_posts ) ) && ! $is_advanced_revision )
    155171        add_meta_box('slugdiv', __('Slug'), 'post_slug_meta_box', null, 'normal', 'core');
    156172
    157 if ( post_type_supports($post_type, 'author') ) {
     173if ( post_type_supports($post_type, 'author') && ! $is_advanced_revision ) {
    158174        if ( is_super_admin() || current_user_can( $post_type_object->cap->edit_others_posts ) )
    159175                add_meta_box('authordiv', __('Author'), 'post_author_meta_box', null, 'normal', 'core');
    160176}
     
    323339
    324340<div id="post-body" class="metabox-holder columns-<?php echo 1 == get_current_screen()->get_columns() ? '1' : '2'; ?>">
    325341<div id="post-body-content">
    326 <?php if ( post_type_supports($post_type, 'title') ) { ?>
     342<?php if ( post_type_supports( $post_type, 'title' ) || ( $is_advanced_revision && post_type_supports( $parent->post_type, 'title' ) ) ) { ?>
    327343<div id="titlediv">
    328344<div id="titlewrap">
    329345        <label class="screen-reader-text" id="title-prompt-text" for="title"><?php echo apply_filters( 'enter_title_here', __( 'Enter title here' ), $post ); ?></label>
     
    356372
    357373do_action( 'edit_form_after_title' );
    358374
    359 if ( post_type_supports($post_type, 'editor') ) {
     375if ( post_type_supports( $post_type, 'editor' ) || ( $is_advanced_revision && post_type_supports( $parent->post_type, 'editor' ) ) ) {
    360376?>
    361377<div id="postdivrich" class="postarea">
    362378