wp/wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php
changeset 22 8c2e4d02f4ef
parent 21 48c4eec2b7e6
--- a/wp/wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php	Fri Sep 05 18:40:08 2025 +0200
+++ b/wp/wp-includes/rest-api/endpoints/class-wp-rest-revisions-controller.php	Fri Sep 05 18:52:52 2025 +0200
@@ -253,6 +253,8 @@
 			);
 		}
 
+		$is_head_request = $request->is_method( 'HEAD' );
+
 		if ( wp_revisions_enabled( $parent ) ) {
 			$registered = $this->get_collection_params();
 			$args       = array(
@@ -287,6 +289,14 @@
 				$args['orderby'] = 'date ID';
 			}
 
+			if ( $is_head_request ) {
+				// Force the 'fields' argument. For HEAD requests, only post IDs are required to calculate pagination.
+				$args['fields'] = 'ids';
+				// Disable priming post meta for HEAD requests to improve performance.
+				$args['update_post_term_cache'] = false;
+				$args['update_post_meta_cache'] = false;
+			}
+
 			/** This filter is documented in wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php */
 			$args       = apply_filters( 'rest_revision_query', $args, $request );
 			$query_args = $this->prepare_items_query( $args, $request );
@@ -294,7 +304,7 @@
 			$revisions_query = new WP_Query();
 			$revisions       = $revisions_query->query( $query_args );
 			$offset          = isset( $query_args['offset'] ) ? (int) $query_args['offset'] : 0;
-			$page            = (int) $query_args['paged'];
+			$page            = isset( $query_args['paged'] ) ? (int) $query_args['paged'] : 0;
 			$total_revisions = $revisions_query->found_posts;
 
 			if ( $total_revisions < 1 ) {
@@ -335,15 +345,19 @@
 			$page            = (int) $request['page'];
 		}
 
-		$response = array();
+		if ( ! $is_head_request ) {
+			$response = array();
 
-		foreach ( $revisions as $revision ) {
-			$data       = $this->prepare_item_for_response( $revision, $request );
-			$response[] = $this->prepare_response_for_collection( $data );
+			foreach ( $revisions as $revision ) {
+				$data       = $this->prepare_item_for_response( $revision, $request );
+				$response[] = $this->prepare_response_for_collection( $data );
+			}
+
+			$response = rest_ensure_response( $response );
+		} else {
+			$response = new WP_REST_Response( array() );
 		}
 
-		$response = rest_ensure_response( $response );
-
 		$response->header( 'X-WP-Total', (int) $total_revisions );
 		$response->header( 'X-WP-TotalPages', (int) $max_pages );
 
@@ -574,6 +588,12 @@
 
 		setup_postdata( $post );
 
+		// 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( array() ), $post, $request );
+		}
+
 		$fields = $this->get_fields_for_response( $request );
 		$data   = array();