WordPress.org

Make WordPress Core

Ticket #23893: 23893.diff

File 23893.diff, 3.8 KB (added by kovshenin, 16 months ago)
  • wp-includes/revision.php

     
    8080} 
    8181 
    8282/** 
     83 * Determines which taxonomies are revisioned. 
     84 * 
     85 * @since 3.6 
     86 * @access private 
     87 * @return array An array of taxonomies that should be revisioned. 
     88 */ 
     89function _wp_post_revision_taxonomies() { 
     90        return array( 
     91                'post_format', 
     92        ); 
     93} 
     94 
     95/** 
    8396 * Saves an already existing post as a post revision. 
    8497 * 
    8598 * Typically used immediately after post updates. 
     
    140153                                } 
    141154                        } 
    142155 
     156                        // Check whether revisioned terms have changed. 
     157                        foreach ( _wp_post_revision_taxonomies() as $taxonomy ) { 
     158                                if ( wp_get_object_terms( $post->ID, $taxonomy ) != wp_get_object_terms( $last_revision->ID, $taxonomy ) ) { 
     159                                        $post_has_changed = true; 
     160                                        break; 
     161                                } 
     162                        } 
     163 
    143164                        //don't save revision if post unchanged 
    144165                        if( ! $post_has_changed ) 
    145166                                return; 
     
    290311                        add_metadata( 'post', $revision_id, $meta_key, $meta_value ); 
    291312        } 
    292313 
     314        // Save revisioned taxonomy. 
     315        foreach ( _wp_post_revision_taxonomies() as $taxonomy ) { 
     316                $terms = wp_get_object_terms( $post_id, $taxonomy, array( 'fields' => 'ids' ) ); 
     317                $terms = array_map( 'absint', $terms ); // see #23894 
     318                wp_set_object_terms( $revision_id, $terms, $taxonomy ); 
     319        } 
     320 
    293321        return $revision_id; 
    294322} 
    295323 
     
    375403                        add_post_meta( $update['ID'], $meta_key, $meta_value ); 
    376404        } 
    377405 
     406        // Restore revisioned terms. 
     407        foreach ( _wp_post_revision_taxonomies() as $taxonomy ) { 
     408                $terms = wp_get_object_terms( $revision['ID'], $taxonomy, array( 'fields' => 'ids' ) ); 
     409                $terms = array_map( 'absint', $terms ); // see #23894 
     410                wp_set_object_terms( $update['ID'], $terms, $taxonomy ); 
     411        } 
     412 
    378413        $post_id = wp_update_post( $update ); 
    379414        if ( is_wp_error( $post_id ) ) 
    380415                return $post_id; 
     
    505540        $post->post_excerpt = $preview->post_excerpt; 
    506541 
    507542        add_filter( 'get_post_metadata', '_wp_preview_meta_filter', 10, 4 ); 
     543        add_filter( 'get_the_terms', '_wp_preview_terms_filter', 10, 3 ); 
    508544 
    509545        return $post; 
    510546} 
     
    526562        return get_post_meta( $preview->ID, $meta_key, $single ); 
    527563} 
    528564 
     565/** 
     566 * Filters terms retrieval and looks inside the actual autosaved post, 
     567 * and not its parent. Only for revisioned taxonomies. 
     568 * 
     569 * @since 3.6 
     570 * @access private 
     571 */ 
     572function _wp_preview_terms_filter( $terms, $post_id, $taxonomy ) { 
     573        $post = get_post(); 
     574 
     575        if ( $post->ID != $post_id || ! in_array( $taxonomy, _wp_post_revision_taxonomies() ) || 'revision' == $post->post_type ) 
     576                return $terms; 
     577 
     578        $preview = wp_get_post_autosave( $post->ID ); 
     579        if ( ! is_object( $preview ) ) 
     580                return $terms; 
     581 
     582        return get_the_terms( $preview, $taxonomy ); 
     583} 
     584 
    529585function _wp_get_post_revision_version( $revision ) { 
    530586        if ( is_object( $revision ) ) 
    531587                $revision = get_object_vars( $revision ); 
  • wp-includes/post.php

     
    9090                'query_var' => false, 
    9191                'can_export' => false, 
    9292                'delete_with_user' => true, 
    93                 'supports' => array( 'author' ), 
     93                'supports' => array( 'author', 'post-formats' ), 
    9494        ) ); 
    9595 
    9696        register_post_type( 'nav_menu_item', array( 
  • wp-admin/includes/post.php

     
    12901290                        add_metadata( 'post', $new_autosave['ID'], $meta_key, $_POST[ $meta_key ] ); 
    12911291                } 
    12921292 
     1293                // Auto-save revisioned taxonomy. 
     1294                foreach ( _wp_post_revision_taxonomies() as $taxonomy ) { 
     1295                        if ( ! isset( $_POST[ $taxonomy ] ) ) 
     1296                                continue; 
     1297 
     1298                        wp_set_object_terms( $new_autosave['ID'], $_POST[ $taxonomy ], $taxonomy ); 
     1299                } 
     1300 
    12931301                return wp_update_post( $new_autosave ); 
    12941302        } 
    12951303