diff -r 48c4eec2b7e6 -r 8c2e4d02f4ef wp/wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php --- a/wp/wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php Fri Sep 05 18:40:08 2025 +0200 +++ b/wp/wp-includes/rest-api/endpoints/class-wp-rest-comments-controller.php Fri Sep 05 18:52:52 2025 +0200 @@ -262,6 +262,14 @@ $prepared_args['offset'] = $prepared_args['number'] * ( absint( $request['page'] ) - 1 ); } + $is_head_request = $request->is_method( 'HEAD' ); + if ( $is_head_request ) { + // Force the 'fields' argument. For HEAD requests, only post IDs are required to calculate pagination. + $prepared_args['fields'] = 'ids'; + // Disable priming comment meta for HEAD requests to improve performance. + $prepared_args['update_comment_meta_cache'] = false; + } + /** * Filters WP_Comment_Query arguments when querying comments via the REST API. * @@ -277,15 +285,17 @@ $query = new WP_Comment_Query(); $query_result = $query->query( $prepared_args ); - $comments = array(); + if ( ! $is_head_request ) { + $comments = array(); - foreach ( $query_result as $comment ) { - if ( ! $this->check_read_permission( $comment, $request ) ) { - continue; + foreach ( $query_result as $comment ) { + if ( ! $this->check_read_permission( $comment, $request ) ) { + continue; + } + + $data = $this->prepare_item_for_response( $comment, $request ); + $comments[] = $this->prepare_response_for_collection( $data ); } - - $data = $this->prepare_item_for_response( $comment, $request ); - $comments[] = $this->prepare_response_for_collection( $data ); } $total_comments = (int) $query->found_comments; @@ -303,7 +313,7 @@ $max_pages = (int) ceil( $total_comments / $request['per_page'] ); } - $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 ); @@ -1041,6 +1051,12 @@ // Restores the more descriptive, specific name for use within this method. $comment = $item; + // 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( array() ), $comment, $request ); + } + $fields = $this->get_fields_for_response( $request ); $data = array(); @@ -1247,7 +1263,7 @@ * * @since 4.7.0 * - * @param string|int $comment_approved comment status. + * @param string $comment_approved Comment status. * @return string Comment status. */ protected function prepare_status_response( $comment_approved ) {