Make WordPress Core

Changeset 58201


Ignore:
Timestamp:
05/27/2024 09:04:10 AM (2 months ago)
Author:
swissspidy
Message:

Posts, Post Types: Autosave: Allow disabling autosave support per post type.

Not all post types support autosaving. By making autosave a post type feature, support can be more granularly handled without any workarounds or hardcoded allowlists. wp_font_family and wp_font_face are examples of built-in post types which do not support autosave.

For backward compatibility reasons, adding editor support implies autosave support, so one would need to explicitly use remove_post_type_support() to remove it again.

Props swissspidy, youknowriad, hellofromtonya, peterwilsoncc.
Fixes #41172.

Location:
trunk
Files:
1 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/class-wp-post-type.php

    r57628 r58201  
    671671            }
    672672            unset( $this->supports );
     673
     674            /*
     675             * 'editor' support implies 'autosave' support for backward compatibility.
     676             * 'autosave' support needs to be explicitly removed if not desired.
     677             */
     678            if (
     679                post_type_supports( $this->name, 'editor' ) &&
     680                ! post_type_supports( $this->name, 'autosave' )
     681            ) {
     682                add_post_type_support( $this->name, 'autosave' );
     683            }
    673684        } elseif ( false !== $this->supports ) {
    674685            // Add default features.
    675             add_post_type_support( $this->name, array( 'title', 'editor' ) );
     686            add_post_type_support( $this->name, array( 'title', 'editor', 'autosave' ) );
    676687        }
    677688    }
     
    920931    public function get_autosave_rest_controller() {
    921932        if ( ! $this->show_in_rest ) {
     933            return null;
     934        }
     935
     936        if ( ! post_type_supports( $this->name, 'autosave' ) ) {
    922937            return null;
    923938        }
  • trunk/src/wp-includes/post.php

    r58200 r58201  
    571571        'wp_font_family',
    572572        array(
    573             'labels'                         => array(
     573            'labels'                => array(
    574574                'name'          => __( 'Font Families' ),
    575575                'singular_name' => __( 'Font Family' ),
    576576            ),
    577             'public'                         => false,
    578             '_builtin'                       => true, /* internal use only. don't use this when registering your own post type. */
    579             'hierarchical'                   => false,
    580             'capabilities'                   => array(
     577            'public'                => false,
     578            '_builtin'              => true, /* internal use only. don't use this when registering your own post type. */
     579            'hierarchical'          => false,
     580            'capabilities'          => array(
    581581                'read'                   => 'edit_theme_options',
    582582                'read_private_posts'     => 'edit_theme_options',
     
    590590                'delete_published_posts' => 'edit_theme_options',
    591591            ),
    592             'map_meta_cap'                   => true,
    593             'query_var'                      => false,
    594             'rewrite'                        => false,
    595             'show_in_rest'                   => true,
    596             'rest_base'                      => 'font-families',
    597             'rest_controller_class'          => 'WP_REST_Font_Families_Controller',
    598             // Disable autosave endpoints for font families.
    599             'autosave_rest_controller_class' => 'stdClass',
     592            'map_meta_cap'          => true,
     593            'query_var'             => false,
     594            'rewrite'               => false,
     595            'show_in_rest'          => true,
     596            'rest_base'             => 'font-families',
     597            'rest_controller_class' => 'WP_REST_Font_Families_Controller',
     598            'supports'              => array( 'title' ),
    600599        )
    601600    );
     
    604603        'wp_font_face',
    605604        array(
    606             'labels'                         => array(
     605            'labels'                => array(
    607606                'name'          => __( 'Font Faces' ),
    608607                'singular_name' => __( 'Font Face' ),
    609608            ),
    610             'public'                         => false,
    611             '_builtin'                       => true, /* internal use only. don't use this when registering your own post type. */
    612             'hierarchical'                   => false,
    613             'capabilities'                   => array(
     609            'public'                => false,
     610            '_builtin'              => true, /* internal use only. don't use this when registering your own post type. */
     611            'hierarchical'          => false,
     612            'capabilities'          => array(
    614613                'read'                   => 'edit_theme_options',
    615614                'read_private_posts'     => 'edit_theme_options',
     
    623622                'delete_published_posts' => 'edit_theme_options',
    624623            ),
    625             'map_meta_cap'                   => true,
    626             'query_var'                      => false,
    627             'rewrite'                        => false,
    628             'show_in_rest'                   => true,
    629             'rest_base'                      => 'font-families/(?P<font_family_id>[\d]+)/font-faces',
    630             'rest_controller_class'          => 'WP_REST_Font_Faces_Controller',
    631             // Disable autosave endpoints for font faces.
    632             'autosave_rest_controller_class' => 'stdClass',
     624            'map_meta_cap'          => true,
     625            'query_var'             => false,
     626            'rewrite'               => false,
     627            'show_in_rest'          => true,
     628            'rest_base'             => 'font-families/(?P<font_family_id>[\d]+)/font-faces',
     629            'rest_controller_class' => 'WP_REST_Font_Faces_Controller',
     630            'supports'              => array( 'title' ),
    633631        )
    634632    );
     
    17201718 *                                                         'page-attributes', 'thumbnail', 'custom-fields', and 'post-formats'.
    17211719 *                                                         Additionally, the 'revisions' feature dictates whether the post type
    1722  *                                                         will store revisions, and the 'comments' feature dictates whether the
    1723  *                                                         comments count will show on the edit screen. A feature can also be
     1720 *                                                         will store revisions, the 'autosave' feature dictates whether the post type
     1721 *                                                         will be autosaved, and the 'comments' feature dictates whether the
     1722 *                                                         comments count will show on the edit screen. For backward compatibility reasons,
     1723 *                                                         adding 'editor' support implies 'autosave' support too. A feature can also be
    17241724 *                                                         specified as an array of arguments to provide additional information
    17251725 *                                                         about supporting that feature.
     
    21992199 *
    22002200 * Additionally, the 'revisions' feature dictates whether the post type will
    2201  * store revisions, and the 'comments' feature dictates whether the comments
     2201 * store revisions, the 'autosave' feature dictates whether the post type
     2202 * will be autosaved, and the 'comments' feature dictates whether the comments
    22022203 * count will show on the edit screen.
    22032204 *
  • trunk/tests/phpunit/tests/post/types.php

    r57987 r58201  
    218218    /**
    219219     * @ticket 21586
     220     * @ticket 41172
    220221     */
    221222    public function test_post_type_with_no_support() {
    222223        register_post_type( 'foo', array( 'supports' => array() ) );
    223         $this->assertTrue( post_type_supports( 'foo', 'editor' ) );
    224         $this->assertTrue( post_type_supports( 'foo', 'title' ) );
     224        $this->assertTrue( post_type_supports( 'foo', 'editor' ), 'Editor support should be enabled by default.' );
     225        $this->assertTrue( post_type_supports( 'foo', 'title' ), 'Title support should be enabled by default.' );
     226        $this->assertTrue( post_type_supports( 'foo', 'autosave' ), 'Autosaves support should be enabled by default.' );
    225227        _unregister_post_type( 'foo' );
    226228
    227229        register_post_type( 'foo', array( 'supports' => false ) );
    228         $this->assertFalse( post_type_supports( 'foo', 'editor' ) );
    229         $this->assertFalse( post_type_supports( 'foo', 'title' ) );
     230        $this->assertFalse( post_type_supports( 'foo', 'editor' ), 'Editor support should be disabled.' );
     231        $this->assertFalse( post_type_supports( 'foo', 'title' ), 'Title support should be disabled.' );
     232        $this->assertFalse( post_type_supports( 'foo', 'autosave' ), 'Autosaves support should be disabled.' );
    230233        _unregister_post_type( 'foo' );
    231234    }
     
    433436        $this->assertSameSetsWithIndex(
    434437            array(
    435                 'editor' => true,
    436                 'author' => true,
    437                 'title'  => true,
     438                'editor'   => true,
     439                'author'   => true,
     440                'title'    => true,
     441                'autosave' => true,
    438442            ),
    439443            $_wp_post_type_features['foo']
     
    590594        $this->assertSameSets( array(), get_post_types_by_support( 'somefeature' ) );
    591595    }
     596
     597    /**
     598     * @ticket 41172
     599     */
     600    public function test_post_type_supports_autosave_based_on_editor_support() {
     601        register_post_type( 'foo', array( 'supports' => array( 'editor' ) ) );
     602        $this->assertTrue( post_type_supports( 'foo', 'autosave' ) );
     603        _unregister_post_type( 'foo' );
     604
     605        register_post_type( 'foo', array( 'supports' => array( 'title' ) ) );
     606        $this->assertFalse( post_type_supports( 'foo', 'autosave' ) );
     607        _unregister_post_type( 'foo' );
     608    }
     609
     610    /**
     611     * @ticket 41172
     612     */
     613    public function test_removing_autosave_support_removes_rest_api_controller() {
     614        register_post_type(
     615            'foo',
     616            array(
     617                'show_in_rest' => true,
     618                'supports'     => array( 'editor' ),
     619            )
     620        );
     621
     622        $post_type_object = get_post_type_object( 'foo' );
     623        $this->assertInstanceOf( 'WP_REST_Autosaves_Controller', $post_type_object->get_autosave_rest_controller(), 'Autosave controller should be set by default.' );
     624
     625        remove_post_type_support( 'foo', 'autosave' );
     626        $post_type_object = get_post_type_object( 'foo' );
     627        $this->assertSame( null, $post_type_object->get_autosave_rest_controller(), 'Autosave controller should be removed.' );
     628        _unregister_post_type( 'foo' );
     629    }
     630
     631    /**
     632     * @ticket 41172
     633     */
     634    public function test_removing_editor_support_does_not_remove_autosave_support() {
     635        register_post_type(
     636            'foo',
     637            array(
     638                'show_in_rest' => true,
     639                'supports'     => array( 'editor' ),
     640            )
     641        );
     642        remove_post_type_support( 'foo', 'editor' );
     643
     644        $this->assertFalse( post_type_supports( 'foo', 'editor' ), 'Post type should not support editor.' );
     645        $this->assertTrue( post_type_supports( 'foo', 'autosave' ), 'Post type should still support autosaves.' );
     646    }
    592647}
  • trunk/tests/phpunit/tests/post/wpPostType.php

    r56819 r58201  
    2525        $this->assertSameSets(
    2626            array(
    27                 'title'  => true,
    28                 'editor' => true,
     27                'title'    => true,
     28                'editor'   => true,
     29                'autosave' => true,
    2930            ),
    3031            $post_type_supports
     
    5758                'comments'  => true,
    5859                'revisions' => true,
     60                'autosave'  => true,
    5961            ),
    6062            $post_type_supports
Note: See TracChangeset for help on using the changeset viewer.