diff -r be944660c56a -r 3d72ae0968f4 wp/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php --- a/wp/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php Wed Sep 21 18:19:35 2022 +0200 +++ b/wp/wp-includes/rest-api/endpoints/class-wp-rest-posts-controller.php Tue Sep 27 16:37:53 2022 +0200 @@ -40,6 +40,14 @@ protected $password_check_passed = array(); /** + * Whether the controller supports batching. + * + * @since 5.9.0 + * @var array + */ + protected $allow_batch = array( 'v1' => true ); + + /** * Constructor. * * @since 4.7.0 @@ -48,9 +56,9 @@ */ public function __construct( $post_type ) { $this->post_type = $post_type; - $this->namespace = 'wp/v2'; $obj = get_post_type_object( $post_type ); $this->rest_base = ! empty( $obj->rest_base ) ? $obj->rest_base : $obj->name; + $this->namespace = ! empty( $obj->rest_namespace ) ? $obj->rest_namespace : 'wp/v2'; $this->meta = new WP_REST_Post_Meta_Fields( $this->post_type ); } @@ -80,7 +88,8 @@ 'permission_callback' => array( $this, 'create_item_permissions_check' ), 'args' => $this->get_endpoint_args_for_item_schema( WP_REST_Server::CREATABLE ), ), - 'schema' => array( $this, 'get_public_item_schema' ), + 'allow_batch' => $this->allow_batch, + 'schema' => array( $this, 'get_public_item_schema' ), ) ); @@ -98,7 +107,7 @@ $this->namespace, '/' . $this->rest_base . '/(?P[\d]+)', array( - 'args' => array( + 'args' => array( 'id' => array( 'description' => __( 'Unique identifier for the post.' ), 'type' => 'integer', @@ -128,7 +137,8 @@ ), ), ), - 'schema' => array( $this, 'get_public_item_schema' ), + 'allow_batch' => $this->allow_batch, + 'schema' => array( $this, 'get_public_item_schema' ), ) ); } @@ -1024,6 +1034,12 @@ * * They dynamic portion of the hook name, `$this->post_type`, refers to the post type slug. * + * Possible hook names include: + * + * - `rest_delete_post` + * - `rest_delete_page` + * - `rest_delete_attachment` + * * @since 4.7.0 * * @param WP_Post $post The deleted or trashed post. @@ -1535,7 +1551,7 @@ continue; } - foreach ( $request[ $base ] as $term_id ) { + foreach ( (array) $request[ $base ] as $term_id ) { // Invalid terms will be rejected later. if ( ! get_term( $term_id, $taxonomy->name ) ) { continue; @@ -1673,12 +1689,15 @@ * Prepares a single post output for response. * * @since 4.7.0 + * @since 5.9.0 Renamed `$post` to `$item` to match parent class for PHP 8 named parameter support. * - * @param WP_Post $post Post object. + * @param WP_Post $item Post object. * @param WP_REST_Request $request Request object. * @return WP_REST_Response Response object. */ - public function prepare_item_for_response( $post, $request ) { + public function prepare_item_for_response( $item, $request ) { + // Restores the more descriptive, specific name for use within this method. + $post = $item; $GLOBALS['post'] = $post; setup_postdata( $post ); @@ -2020,7 +2039,7 @@ if ( $post_type_obj->hierarchical && ! empty( $post->post_parent ) ) { $links['up'] = array( - 'href' => rest_url( trailingslashit( $base ) . (int) $post->post_parent ), + 'href' => rest_url( rest_get_route_for_post( $post->post_parent ) ), 'embeddable' => true, ); } @@ -2028,7 +2047,7 @@ // If we have a featured media, add that. $featured_media = get_post_thumbnail_id( $post->ID ); if ( $featured_media ) { - $image_url = rest_url( 'wp/v2/media/' . $featured_media ); + $image_url = rest_url( rest_get_route_for_post( $featured_media ) ); $links['https://api.w.org/featuredmedia'] = array( 'href' => $image_url, @@ -2037,7 +2056,7 @@ } if ( ! in_array( $post->post_type, array( 'attachment', 'nav_menu_item', 'revision' ), true ) ) { - $attachments_url = rest_url( 'wp/v2/media' ); + $attachments_url = rest_url( rest_get_route_for_post_type_items( 'attachment' ) ); $attachments_url = add_query_arg( 'parent', $post->ID, $attachments_url ); $links['https://api.w.org/attachment'] = array( @@ -2051,19 +2070,16 @@ $links['https://api.w.org/term'] = array(); foreach ( $taxonomies as $tax ) { - $taxonomy_obj = get_taxonomy( $tax ); + $taxonomy_route = rest_get_route_for_taxonomy_items( $tax ); // Skip taxonomies that are not public. - if ( empty( $taxonomy_obj->show_in_rest ) ) { + if ( empty( $taxonomy_route ) ) { continue; } - - $tax_base = ! empty( $taxonomy_obj->rest_base ) ? $taxonomy_obj->rest_base : $tax; - $terms_url = add_query_arg( 'post', $post->ID, - rest_url( 'wp/v2/' . $tax_base ) + rest_url( $taxonomy_route ) ); $links['https://api.w.org/term'][] = array( @@ -2534,6 +2550,12 @@ * The dynamic portion of the filter, `$this->post_type`, refers to the * post type slug for the controller. * + * Possible hook names include: + * + * - `rest_post_item_schema` + * - `rest_page_item_schema` + * - `rest_attachment_item_schema` + * * @since 5.4.0 * * @param array $schema Item schema data.