WordPress.org

Make WordPress Core

Ticket #24131: 24131-2.patch

File 24131-2.patch, 6.2 KB (added by azaozz, 12 months 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 );