WordPress.org

Make WordPress Core

Changeset 39343


Ignore:
Timestamp:
11/23/16 02:46:42 (9 months ago)
Author:
joehoyle
Message:

REST API: Allow unsetting of page templates in update requests.

Sending a request to update a page with the template property set to an empty string resulted in an error because “” was not a valid value in the enum.

Props lucasstark, swissspidy.
Fixes #38877.

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php

    r39342 r39343  
    19291929            'description' => __( 'The theme file to use to display the object.' ), 
    19301930            'type'        => 'string', 
    1931             'enum'        => array_keys( wp_get_theme()->get_page_templates( null, $this->post_type ) ), 
     1931            'enum'        => array_merge( array_keys( wp_get_theme()->get_page_templates( null, $this->post_type ) ), array( '' ) ), 
    19321932            'context'     => array( 'view', 'edit' ), 
    19331933        ); 
  • trunk/tests/phpunit/includes/spy-rest-server.php

    r37163 r39343  
    66    public $sent_body = ''; 
    77    public $last_request = null; 
     8    public $override_by_default = false; 
    89 
    910    /** 
     
    4243    } 
    4344 
     45    /** 
     46     * Override the register_route method so we can re-register routes internally if needed. 
     47     * 
     48     * @param string $namespace  Namespace. 
     49     * @param string $route      The REST route. 
     50     * @param array  $route_args Route arguments. 
     51     * @param bool   $override   Optional. Whether the route should be overridden if it already exists. 
     52     *                           Default false. Also set $GLOBALS['wp_rest_server']->override_by_default = true 
     53     *                           to set overrides when you don't have access to the caller context. 
     54     */ 
     55    public function register_route( $namespace, $route, $route_args, $override = false ) { 
     56        parent::register_route( $namespace, $route, $route_args, $override || $this->override_by_default ); 
     57    } 
     58 
    4459    public function serve_request( $path = null ) { 
    4560 
  • trunk/tests/phpunit/tests/rest-api/rest-pages-controller.php

    r39289 r39343  
    2828        $this->has_setup_template = false; 
    2929        add_filter( 'theme_page_templates', array( $this, 'filter_theme_page_templates' ) ); 
     30        // reregister the route as we now have a template available. 
     31        $GLOBALS['wp_rest_server']->override_by_default = true; 
     32        $controller = new WP_REST_Posts_Controller( 'page' ); 
     33        $controller->register_routes(); 
     34        $GLOBALS['wp_rest_server']->override_by_default = false; 
    3035    } 
    3136 
  • trunk/tests/phpunit/tests/rest-api/rest-posts-controller.php

    r39182 r39343  
    10331033        add_filter( 'theme_post_templates', array( $this, 'filter_theme_post_templates' ) ); 
    10341034 
     1035        // reregister the route as we now have a template available. 
     1036        $GLOBALS['wp_rest_server']->override_by_default = true; 
     1037        $controller = new WP_REST_Posts_Controller( 'post' ); 
     1038        $controller->register_routes(); 
     1039        $GLOBALS['wp_rest_server']->override_by_default = false; 
     1040 
    10351041        $request = new WP_REST_Request( 'POST', '/wp/v2/posts' ); 
    10361042        $params = $this->set_post_data( array( 
     
    10581064        $params = $this->set_post_data( array( 
    10591065            'template' => 'post-my-test-template.php', 
     1066        ) ); 
     1067        $request->set_body_params( $params ); 
     1068        $response = $this->server->dispatch( $request ); 
     1069 
     1070        $this->assertErrorResponse( 'rest_invalid_param', $response, 400 ); 
     1071    } 
     1072 
     1073    /** 
     1074     * @ticket 38877 
     1075     */ 
     1076    public function test_create_item_with_template_none() { 
     1077        wp_set_current_user( self::$editor_id ); 
     1078        add_filter( 'theme_post_templates', array( $this, 'filter_theme_post_templates' ) ); 
     1079        update_post_meta( self::$post_id, '_wp_page_template', 'post-my-test-template.php' ); 
     1080 
     1081        $request = new WP_REST_Request( 'PUT', sprintf( '/wp/v2/posts/%d', self::$post_id ) ); 
     1082        $params = $this->set_post_data( array( 
     1083            'template' => '', 
    10601084        ) ); 
    10611085        $request->set_body_params( $params ); 
     
    20552079        $this->assertErrorResponse( 'rest_cannot_assign_term', $response, 403 ); 
    20562080    } 
     2081 
     2082    /** 
     2083     * @ticket 38698 
     2084     */ 
     2085    public function test_update_item_with_template() { 
     2086        wp_set_current_user( self::$editor_id ); 
     2087        add_filter( 'theme_post_templates', array( $this, 'filter_theme_post_templates' ) ); 
     2088 
     2089        // reregister the route as we now have a template available. 
     2090        $GLOBALS['wp_rest_server']->override_by_default = true; 
     2091        $controller = new WP_REST_Posts_Controller( 'post' ); 
     2092        $controller->register_routes(); 
     2093        $GLOBALS['wp_rest_server']->override_by_default = false; 
     2094 
     2095        $request = new WP_REST_Request( 'PUT', sprintf( '/wp/v2/posts/%d', self::$post_id ) ); 
     2096        $params = $this->set_post_data( array( 
     2097            'template' => 'post-my-test-template.php', 
     2098        ) ); 
     2099        $request->set_body_params( $params ); 
     2100        $response = $this->server->dispatch( $request ); 
     2101 
     2102        $data = $response->get_data(); 
     2103        $post_template = get_page_template_slug( get_post( $data['id'] ) ); 
     2104 
     2105        $this->assertEquals( 'post-my-test-template.php', $data['template'] ); 
     2106        $this->assertEquals( 'post-my-test-template.php', $post_template ); 
     2107    } 
     2108 
     2109    /** 
     2110     * @ticket 38877 
     2111     */ 
     2112    public function test_update_item_with_template_none() { 
     2113        wp_set_current_user( self::$editor_id ); 
     2114        add_filter( 'theme_post_templates', array( $this, 'filter_theme_post_templates' ) ); 
     2115        update_post_meta( self::$post_id, '_wp_page_template', 'post-my-test-template.php' ); 
     2116 
     2117        // reregister the route as we now have a template available. 
     2118        $GLOBALS['wp_rest_server']->override_by_default = true; 
     2119        $controller = new WP_REST_Posts_Controller( 'post' ); 
     2120        $controller->register_routes(); 
     2121        $GLOBALS['wp_rest_server']->override_by_default = false; 
     2122 
     2123        $request = new WP_REST_Request( 'PUT', sprintf( '/wp/v2/posts/%d', self::$post_id ) ); 
     2124        $params = $this->set_post_data( array( 
     2125            'template' => '', 
     2126        ) ); 
     2127        $request->set_body_params( $params ); 
     2128        $response = $this->server->dispatch( $request ); 
     2129 
     2130        $data = $response->get_data(); 
     2131        $post_template = get_page_template_slug( get_post( $data['id'] ) ); 
     2132 
     2133        $this->assertEquals( '', $data['template'] ); 
     2134        $this->assertEquals( '', $post_template ); 
     2135    } 
     2136 
    20572137 
    20582138    public function verify_post_roundtrip( $input = array(), $expected_output = array() ) { 
Note: See TracChangeset for help on using the changeset viewer.