WordPress.org

Make WordPress Core

Ticket #24131: 24131-2.patch

File 24131-2.patch, 6.2 KB (added by azaozz, 5 years ago)
  • wp-admin/includes/post.php

     
    12121212        <?php
    12131213
    12141214        if ( $locked ) {
    1215                 $preview_link = set_url_scheme( add_query_arg( 'preview', 'true', get_permalink( $post->ID ) ) );
     1215                $preview_args = array( 'preview' => 'true' );
    12161216
    1217                 if ( 'publish' == $post->post_status || $user->ID != $post->post_author ) {
    1218                         // Latest content is in autosave
    1219                         $nonce = wp_create_nonce( 'post_preview_' . $post->ID );
    1220                         $preview_link = add_query_arg( array( 'preview_id' => $post->ID, 'preview_nonce' => $nonce ), $preview_link );
    1221                 }
     1217                if ( 'publish' == $post->post_status || $user->ID != $post->post_author ) // Latest content is in autosave
     1218                        $preview_args['latest_changes'] = 'true';
    12221219
    1223                 $preview_link = apply_filters( 'preview_post_link', $preview_link );
     1220                $preview_link = apply_filters( 'preview_post_link', add_query_arg( $preview_args, get_permalink( $post->ID ) ) );
    12241221                $override = apply_filters( 'override_post_lock', true, $post, $user );
    12251222                $tab_last = $override ? '' : ' wp-tab-last';
    12261223
     
    13661363        }
    13671364
    13681365        $user_id = get_current_user_id();
     1366        $query_args = array( 'preview' => 'true' );
     1367
    13691368        if ( 'draft' == $post->post_status && $user_id == $post->post_author ) {
    13701369                $id = edit_post();
    13711370        } else { // Non drafts are not overwritten. The autosave is stored in a special post revision.
    13721371                $id = wp_create_post_autosave( $post->ID );
    1373                 if ( ! is_wp_error($id) )
     1372                if ( ! is_wp_error($id) ) {
    13741373                        $id = $post->ID;
     1374                        $query_args['latest_changes'] = 'true';
     1375                }
    13751376        }
    13761377
    13771378        if ( is_wp_error($id) )
    13781379                wp_die( $id->get_error_message() );
    13791380
    1380         if ( $_POST['post_status'] == 'draft' && $user_id == $post->post_author ) {
    1381                 $url = add_query_arg( 'preview', 'true', get_permalink($id) );
    1382         } else {
    1383                 $nonce = wp_create_nonce('post_preview_' . $id);
    1384                 $url = add_query_arg( array( 'preview' => 'true', 'preview_id' => $id, 'preview_nonce' => $nonce ), get_permalink($id) );
    1385         }
    1386 
    1387         return apply_filters( 'preview_post_link', $url );
     1381        return apply_filters( 'preview_post_link', add_query_arg( $query_args, get_permalink($id) ) );
    13881382}
  • wp-includes/default-filters.php

     
    277277add_action( 'template_redirect', 'wp_old_slug_redirect'              );
    278278add_action( 'post_updated',      'wp_check_for_changed_slugs', 12, 3 );
    279279
    280 // Nonce check for Post Previews
    281 add_action( 'init', '_show_post_preview' );
     280// Post Previews
     281add_filter( 'the_preview', '_set_preview' );
     282add_filter( 'preview_post_link', '_wp_add_preview_nonce', 5 );
    282283
    283284// Timezone
    284285add_filter( 'pre_option_gmt_offset','wp_timezone_override_offset' );
  • wp-includes/query.php

     
    27322732                                }
    27332733                        }
    27342734
    2735                         if ( $this->is_preview && $this->posts && current_user_can( $edit_cap, $this->posts[0]->ID ) )
    2736                                 $this->posts[0] = get_post( apply_filters_ref_array( 'the_preview', array( $this->posts[0], &$this ) ) );
     2735                        if ( $this->is_preview && $this->posts && current_user_can( $edit_cap, $this->posts[0]->ID ) ) {
     2736                                if ( $the_preview = apply_filters( 'the_preview', $this->posts[0], $this ) )
     2737                                        $this->posts[0] = get_post( $the_preview );
     2738                                else
     2739                                        $this->posts = array();
     2740                        }
    27372741                }
    27382742
    27392743                // Put sticky posts at the top of the posts array
  • wp-includes/revision.php

     
    496496        return (int) apply_filters( 'wp_revisions_to_keep', $num, $post );
    497497}
    498498
    499 function _set_preview($post) {
     499/**
     500 * Check the nonce for preview links. Overload the content
     501 * wiht the latest autosave when 'latest_changes' is set.
     502 *
     503 * @access private
     504 */
     505function _set_preview( $post ) {
     506        // Don't show a preview if the user is not coming from a 'preview' link in the admin
     507        if ( empty( $_GET['preview_nonce'] ) || ! wp_verify_nonce( $_GET['preview_nonce'], 'post-preview' ) )
     508                return false;
    500509
    501         if ( ! is_object($post) )
    502                 return $post;
     510        if ( isset($_GET['latest_changes']) ) {
     511                if ( ! is_object($post) )
     512                        return $post;
    503513
    504         $preview = wp_get_post_autosave($post->ID);
     514                $preview = wp_get_post_autosave( $post->ID );
    505515
    506         if ( ! is_object($preview) )
    507                 return $post;
     516                if ( ! is_object($preview) )
     517                        return $post;
    508518
    509         $preview = sanitize_post($preview);
     519                $preview = sanitize_post($preview);
    510520
    511         $post->post_content = $preview->post_content;
    512         $post->post_title = $preview->post_title;
    513         $post->post_excerpt = $preview->post_excerpt;
     521                $post->post_content = $preview->post_content;
     522                $post->post_title = $preview->post_title;
     523                $post->post_excerpt = $preview->post_excerpt;
    514524
    515         add_filter( 'get_post_metadata', '_wp_preview_meta_filter', 10, 4 );
    516         add_filter( 'get_the_terms', '_wp_preview_terms_filter', 10, 3 );
     525                add_filter( 'get_post_metadata', '_wp_preview_meta_filter', 10, 4 );
     526                add_filter( 'get_the_terms', '_wp_preview_terms_filter', 10, 3 );
     527        }
    517528
    518529        return $post;
    519530}
    520531
    521 function _show_post_preview() {
    522 
    523         if ( isset($_GET['preview_id']) && isset($_GET['preview_nonce']) ) {
    524                 $id = (int) $_GET['preview_id'];
    525 
    526                 if ( false == wp_verify_nonce( $_GET['preview_nonce'], 'post_preview_' . $id ) )
    527                         wp_die( __('You do not have permission to preview drafts.') );
    528 
    529                 add_filter('the_preview', '_set_preview');
    530         }
    531 }
    532 
    533532/**
    534533 * Filters post meta retrieval to get values from the actual autosave post,
    535534 * and not its parent. Filters revisioned meta keys only.
     
    573572        return $terms;
    574573}
    575574
     575/**
     576 * Add a nonce to all preview links.
     577 *
     578 * @since 3.6.0
     579 * @access private
     580 */
     581function _wp_add_preview_nonce( $url )  {
     582        static $nonce;
     583
     584        if ( ! $nonce )
     585                $nonce = wp_create_nonce('post-preview');
     586
     587        return add_query_arg( 'preview_nonce', $nonce, $url );
     588}
     589
    576590function _wp_get_post_revision_version( $revision ) {
    577591        if ( is_object( $revision ) )
    578592                $revision = get_object_vars( $revision );