REST API: Fix fatal error when making HEAD requests with _fields filter.

In [59889] the REST API controllers were adjusted to perform less work when responding to HEAD requests. The WP_REST_Response body would now be `null`, which caused issues with filters that expected the response body to be an array.

This commit sets the response body to be an empty array when preparing the response instead. The body will still be discarded, but this provides better backward comppatibility with code that assumes an array will be used.

See #56481.
Props antonvlasenko, timothyblynjacobs, mamaduka, wildworks.

Built from https://develop.svn.wordpress.org/trunk@59970


git-svn-id: http://core.svn.wordpress.org/trunk@59312 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
TimothyBlynJacobs
2025-03-11 14:19:20 +00:00
parent e2496ddcd8
commit 448ffcdaa4
19 changed files with 35 additions and 35 deletions

View File

@@ -307,7 +307,7 @@ class WP_REST_Autosaves_Controller extends WP_REST_Revisions_Controller {
if ( $request->is_method( 'HEAD' ) ) {
// Return early as this handler doesn't add any response headers.
return new WP_REST_Response();
return new WP_REST_Response( array() );
}
$response = array();
$parent_id = $parent->ID;
@@ -455,7 +455,7 @@ class WP_REST_Autosaves_Controller extends WP_REST_Revisions_Controller {
// Don't prepare the response body for HEAD requests.
if ( $request->is_method( 'HEAD' ) ) {
/** This filter is documented in wp-includes/rest-api/endpoints/class-wp-rest-autosaves-controller.php */
return apply_filters( 'rest_prepare_autosave', new WP_REST_Response(), $post, $request );
return apply_filters( 'rest_prepare_autosave', new WP_REST_Response( array() ), $post, $request );
}
$response = $this->revisions_controller->prepare_item_for_response( $post, $request );
$fields = $this->get_fields_for_response( $request );

View File

@@ -83,7 +83,7 @@ class WP_REST_Block_Pattern_Categories_Controller extends WP_REST_Controller {
public function get_items( $request ) {
if ( $request->is_method( 'HEAD' ) ) {
// Return early as this handler doesn't add any response headers.
return new WP_REST_Response();
return new WP_REST_Response( array() );
}
$response = array();

View File

@@ -133,7 +133,7 @@ class WP_REST_Block_Types_Controller extends WP_REST_Controller {
public function get_items( $request ) {
if ( $request->is_method( 'HEAD' ) ) {
// Return early as this handler doesn't add any response headers.
return new WP_REST_Response();
return new WP_REST_Response( array() );
}
$data = array();
@@ -258,7 +258,7 @@ class WP_REST_Block_Types_Controller extends WP_REST_Controller {
// Don't prepare the response body for HEAD requests.
if ( $request->is_method( 'HEAD' ) ) {
/** This filter is documented in wp-includes/rest-api/endpoints/class-wp-rest-block-types-controller.php */
return apply_filters( 'rest_prepare_block_type', new WP_REST_Response(), $block_type, $request );
return apply_filters( 'rest_prepare_block_type', new WP_REST_Response( array() ), $block_type, $request );
}
$fields = $this->get_fields_for_response( $request );

View File

@@ -313,7 +313,7 @@ class WP_REST_Comments_Controller extends WP_REST_Controller {
$max_pages = (int) ceil( $total_comments / $request['per_page'] );
}
$response = $is_head_request ? new WP_REST_Response() : rest_ensure_response( $comments );
$response = $is_head_request ? new WP_REST_Response( array() ) : rest_ensure_response( $comments );
$response->header( 'X-WP-Total', $total_comments );
$response->header( 'X-WP-TotalPages', $max_pages );
@@ -1054,7 +1054,7 @@ class WP_REST_Comments_Controller extends WP_REST_Controller {
// Don't prepare the response body for HEAD requests.
if ( $request->is_method( 'HEAD' ) ) {
/** This filter is documented in wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php */
return apply_filters( 'rest_prepare_comment', new WP_REST_Response(), $comment, $request );
return apply_filters( 'rest_prepare_comment', new WP_REST_Response( array() ), $comment, $request );
}
$fields = $this->get_fields_for_response( $request );

View File

@@ -113,7 +113,7 @@ class WP_REST_Font_Collections_Controller extends WP_REST_Controller {
$items[] = $item;
}
$response = $is_head_request ? new WP_REST_Response() : rest_ensure_response( $items );
$response = $is_head_request ? new WP_REST_Response( array() ) : rest_ensure_response( $items );
$response->header( 'X-WP-Total', (int) $total_items );
$response->header( 'X-WP-TotalPages', $max_pages );
@@ -193,7 +193,7 @@ class WP_REST_Font_Collections_Controller extends WP_REST_Controller {
*/
if ( $request->is_method( 'HEAD' ) ) {
/** This filter is documented in wp-includes/rest-api/endpoints/class-wp-rest-font-collections-controller.php */
return apply_filters( 'rest_prepare_font_collection', new WP_REST_Response(), $item, $request );
return apply_filters( 'rest_prepare_font_collection', new WP_REST_Response( array() ), $item, $request );
}
foreach ( $data_fields as $field ) {
@@ -209,7 +209,7 @@ class WP_REST_Font_Collections_Controller extends WP_REST_Controller {
*/
if ( $request->is_method( 'HEAD' ) ) {
/** This filter is documented in wp-includes/rest-api/endpoints/class-wp-rest-font-collections-controller.php */
return apply_filters( 'rest_prepare_font_collection', new WP_REST_Response(), $item, $request );
return apply_filters( 'rest_prepare_font_collection', new WP_REST_Response( array() ), $item, $request );
}
$response = rest_ensure_response( $data );

View File

@@ -248,7 +248,7 @@ class WP_REST_Global_Styles_Revisions_Controller extends WP_REST_Revisions_Contr
$response = rest_ensure_response( $response );
} else {
$response = new WP_REST_Response();
$response = new WP_REST_Response( array() );
}
$response->header( 'X-WP-Total', (int) $total_revisions );
@@ -291,7 +291,7 @@ class WP_REST_Global_Styles_Revisions_Controller extends WP_REST_Revisions_Contr
public function prepare_item_for_response( $post, $request ) {
// Don't prepare the response body for HEAD requests.
if ( $request->is_method( 'HEAD' ) ) {
return new WP_REST_Response();
return new WP_REST_Response( array() );
}
$parent = $this->get_parent( $request['parent'] );

View File

@@ -163,7 +163,7 @@ class WP_REST_Pattern_Directory_Controller extends WP_REST_Controller {
if ( $request->is_method( 'HEAD' ) ) {
// Return early as this handler doesn't add any response headers.
return new WP_REST_Response();
return new WP_REST_Response( array() );
}
$response = array();

View File

@@ -111,7 +111,7 @@ class WP_REST_Post_Types_Controller extends WP_REST_Controller {
public function get_items( $request ) {
if ( $request->is_method( 'HEAD' ) ) {
// Return early as this handler doesn't add any response headers.
return new WP_REST_Response();
return new WP_REST_Response( array() );
}
$data = array();
@@ -186,7 +186,7 @@ class WP_REST_Post_Types_Controller extends WP_REST_Controller {
// Don't prepare the response body for HEAD requests.
if ( $request->is_method( 'HEAD' ) ) {
/** This filter is documented in wp-includes/rest-api/endpoints/class-wp-rest-post-types-controller.php */
return apply_filters( 'rest_prepare_post_type', new WP_REST_Response(), $post_type, $request );
return apply_filters( 'rest_prepare_post_type', new WP_REST_Response( array() ), $post_type, $request );
}
$taxonomies = wp_list_filter( get_object_taxonomies( $post_type->name, 'objects' ), array( 'show_in_rest' => true ) );

View File

@@ -499,7 +499,7 @@ class WP_REST_Posts_Controller extends WP_REST_Controller {
);
}
$response = $is_head_request ? new WP_REST_Response() : rest_ensure_response( $posts );
$response = $is_head_request ? new WP_REST_Response( array() ) : rest_ensure_response( $posts );
$response->header( 'X-WP-Total', (int) $total_posts );
$response->header( 'X-WP-TotalPages', (int) $max_pages );
@@ -1847,7 +1847,7 @@ class WP_REST_Posts_Controller extends WP_REST_Controller {
// Don't prepare the response body for HEAD requests.
if ( $request->is_method( 'HEAD' ) ) {
/** This filter is documented in wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php */
return apply_filters( "rest_prepare_{$this->post_type}", new WP_REST_Response(), $post, $request );
return apply_filters( "rest_prepare_{$this->post_type}", new WP_REST_Response( array() ), $post, $request );
}
$fields = $this->get_fields_for_response( $request );

View File

@@ -355,7 +355,7 @@ class WP_REST_Revisions_Controller extends WP_REST_Controller {
$response = rest_ensure_response( $response );
} else {
$response = new WP_REST_Response();
$response = new WP_REST_Response( array() );
}
$response->header( 'X-WP-Total', (int) $total_revisions );
@@ -591,7 +591,7 @@ class WP_REST_Revisions_Controller extends WP_REST_Controller {
// Don't prepare the response body for HEAD requests.
if ( $request->is_method( 'HEAD' ) ) {
/** This filter is documented in wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php */
return apply_filters( 'rest_prepare_revision', new WP_REST_Response(), $post, $request );
return apply_filters( 'rest_prepare_revision', new WP_REST_Response( array() ), $post, $request );
}
$fields = $this->get_fields_for_response( $request );

View File

@@ -165,7 +165,7 @@ class WP_REST_Search_Controller extends WP_REST_Controller {
);
}
$response = $is_head_request ? new WP_REST_Response() : rest_ensure_response( $results );
$response = $is_head_request ? new WP_REST_Response( array() ) : rest_ensure_response( $results );
$response->header( 'X-WP-Total', $total );
$response->header( 'X-WP-TotalPages', $max_pages );

View File

@@ -121,7 +121,7 @@ class WP_REST_Sidebars_Controller extends WP_REST_Controller {
public function get_items( $request ) {
if ( $request->is_method( 'HEAD' ) ) {
// Return early as this handler doesn't add any response headers.
return new WP_REST_Response();
return new WP_REST_Response( array() );
}
$this->retrieve_widgets();
@@ -329,7 +329,7 @@ class WP_REST_Sidebars_Controller extends WP_REST_Controller {
// Don't prepare the response body for HEAD requests.
if ( $request->is_method( 'HEAD' ) ) {
/** This filter is documented in wp-includes/rest-api/endpoints/class-wp-rest-sidebars-controller.php */
return apply_filters( 'rest_prepare_sidebar', new WP_REST_Response(), $raw_sidebar, $request );
return apply_filters( 'rest_prepare_sidebar', new WP_REST_Response( array() ), $raw_sidebar, $request );
}
$id = $raw_sidebar['id'];

View File

@@ -115,7 +115,7 @@ class WP_REST_Taxonomies_Controller extends WP_REST_Controller {
public function get_items( $request ) {
if ( $request->is_method( 'HEAD' ) ) {
// Return early as this handler doesn't add any response headers.
return new WP_REST_Response();
return new WP_REST_Response( array() );
}
// Retrieve the list of registered collection query parameters.
@@ -217,7 +217,7 @@ class WP_REST_Taxonomies_Controller extends WP_REST_Controller {
// Don't prepare the response body for HEAD requests.
if ( $request->is_method( 'HEAD' ) ) {
/** This filter is documented in wp-includes/rest-api/endpoints/class-wp-rest-taxonomies-controller.php */
return apply_filters( 'rest_prepare_taxonomy', new WP_REST_Response(), $taxonomy, $request );
return apply_filters( 'rest_prepare_taxonomy', new WP_REST_Response( array() ), $taxonomy, $request );
}
$base = ! empty( $taxonomy->rest_base ) ? $taxonomy->rest_base : $taxonomy->name;

View File

@@ -271,7 +271,7 @@ class WP_REST_Templates_Controller extends WP_REST_Controller {
public function get_items( $request ) {
if ( $request->is_method( 'HEAD' ) ) {
// Return early as this handler doesn't add any response headers.
return new WP_REST_Response();
return new WP_REST_Response( array() );
}
$query = array();
@@ -675,7 +675,7 @@ class WP_REST_Templates_Controller extends WP_REST_Controller {
public function prepare_item_for_response( $item, $request ) {
// Don't prepare the response body for HEAD requests.
if ( $request->is_method( 'HEAD' ) ) {
return new WP_REST_Response();
return new WP_REST_Response( array() );
}
/*

View File

@@ -370,7 +370,7 @@ class WP_REST_Terms_Controller extends WP_REST_Controller {
}
}
$response = $is_head_request ? new WP_REST_Response() : rest_ensure_response( $response );
$response = $is_head_request ? new WP_REST_Response( array() ) : rest_ensure_response( $response );
// Store pagination values for headers.
$per_page = (int) $prepared_args['number'];
@@ -899,7 +899,7 @@ class WP_REST_Terms_Controller extends WP_REST_Controller {
// Don't prepare the response body for HEAD requests.
if ( $request->is_method( 'HEAD' ) ) {
/** This filter is documented in wp-includes/rest-api/endpoints/class-wp-rest-terms-controller.php */
return apply_filters( "rest_prepare_{$this->taxonomy}", new WP_REST_Response(), $item, $request );
return apply_filters( "rest_prepare_{$this->taxonomy}", new WP_REST_Response( array() ), $item, $request );
}
$fields = $this->get_fields_for_response( $request );

View File

@@ -384,7 +384,7 @@ class WP_REST_Users_Controller extends WP_REST_Controller {
}
}
$response = $is_head_request ? new WP_REST_Response() : rest_ensure_response( $users );
$response = $is_head_request ? new WP_REST_Response( array() ) : rest_ensure_response( $users );
// Store pagination values for headers then unset for count query.
$per_page = (int) $prepared_args['number'];
@@ -1032,7 +1032,7 @@ class WP_REST_Users_Controller extends WP_REST_Controller {
// Don't prepare the response body for HEAD requests.
if ( $request->is_method( 'HEAD' ) ) {
/** This filter is documented in wp-includes/rest-api/endpoints/class-wp-rest-users-controller.php */
return apply_filters( 'rest_prepare_user', new WP_REST_Response(), $user, $request );
return apply_filters( 'rest_prepare_user', new WP_REST_Response( array() ), $user, $request );
}
$fields = $this->get_fields_for_response( $request );

View File

@@ -147,7 +147,7 @@ class WP_REST_Widget_Types_Controller extends WP_REST_Controller {
public function get_items( $request ) {
if ( $request->is_method( 'HEAD' ) ) {
// Return early as this handler doesn't add any response headers.
return new WP_REST_Response();
return new WP_REST_Response( array() );
}
$data = array();
@@ -306,7 +306,7 @@ class WP_REST_Widget_Types_Controller extends WP_REST_Controller {
// Don't prepare the response body for HEAD requests.
if ( $request->is_method( 'HEAD' ) ) {
/** This filter is documented in wp-includes/rest-api/endpoints/class-wp-rest-widget-types-controller.php */
return apply_filters( 'rest_prepare_widget_type', new WP_REST_Response(), $widget_type, $request );
return apply_filters( 'rest_prepare_widget_type', new WP_REST_Response( array() ), $widget_type, $request );
}
$fields = $this->get_fields_for_response( $request );

View File

@@ -138,7 +138,7 @@ class WP_REST_Widgets_Controller extends WP_REST_Controller {
public function get_items( $request ) {
if ( $request->is_method( 'HEAD' ) ) {
// Return early as this handler doesn't add any response headers.
return new WP_REST_Response();
return new WP_REST_Response( array() );
}
$this->retrieve_widgets();
@@ -686,7 +686,7 @@ class WP_REST_Widgets_Controller extends WP_REST_Controller {
// Don't prepare the response body for HEAD requests.
if ( $request->is_method( 'HEAD' ) ) {
/** This filter is documented in wp-includes/rest-api/endpoints/class-wp-rest-widgets-controller.php */
return apply_filters( 'rest_prepare_widget', new WP_REST_Response(), $widget, $request );
return apply_filters( 'rest_prepare_widget', new WP_REST_Response( array() ), $widget, $request );
}
$parsed_id = wp_parse_widget_id( $widget_id );

View File

@@ -16,7 +16,7 @@
*
* @global string $wp_version
*/
$wp_version = '6.8-beta1-59969';
$wp_version = '6.8-beta1-59970';
/**
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.