mirror of
https://github.com/WordPress/WordPress.git
synced 2024-09-06 20:58:21 +02:00
Caches the output of get_item_schema() to avoid redundant recomputation of translatable strings and other computed values. This method is called many times per item in each REST request, and the results of the method should not vary between calls. Additional schema fields are not cached. Props kadamwhite, joehoyle, TimothyBlynJacobs. Fixes #47871. Built from https://develop.svn.wordpress.org/trunk@45811 git-svn-id: http://core.svn.wordpress.org/trunk@45622 1a063a9b-81f0-0310-95a4-ce76da25c4cd
94 lines
2.7 KiB
PHP
94 lines
2.7 KiB
PHP
<?php
|
||
/**
|
||
* Reusable blocks REST API: WP_REST_Blocks_Controller class
|
||
*
|
||
* @package WordPress
|
||
* @subpackage REST_API
|
||
* @since 5.0.0
|
||
*/
|
||
|
||
/**
|
||
* Controller which provides a REST endpoint for the editor to read, create,
|
||
* edit and delete reusable blocks. Blocks are stored as posts with the wp_block
|
||
* post type.
|
||
*
|
||
* @since 5.0.0
|
||
*
|
||
* @see WP_REST_Posts_Controller
|
||
* @see WP_REST_Controller
|
||
*/
|
||
class WP_REST_Blocks_Controller extends WP_REST_Posts_Controller {
|
||
|
||
/**
|
||
* Checks if a block can be read.
|
||
*
|
||
* @since 5.0.0
|
||
*
|
||
* @param object $post Post object that backs the block.
|
||
* @return bool Whether the block can be read.
|
||
*/
|
||
public function check_read_permission( $post ) {
|
||
// Ensure that the user is logged in and has the read_blocks capability.
|
||
$post_type = get_post_type_object( $post->post_type );
|
||
if ( ! current_user_can( $post_type->cap->read_post, $post->ID ) ) {
|
||
return false;
|
||
}
|
||
|
||
return parent::check_read_permission( $post );
|
||
}
|
||
|
||
/**
|
||
* Filters a response based on the context defined in the schema.
|
||
*
|
||
* @since 5.0.0
|
||
*
|
||
* @param array $data Response data to fiter.
|
||
* @param string $context Context defined in the schema.
|
||
* @return array Filtered response.
|
||
*/
|
||
public function filter_response_by_context( $data, $context ) {
|
||
$data = parent::filter_response_by_context( $data, $context );
|
||
|
||
/*
|
||
* Remove `title.rendered` and `content.rendered` from the response. It
|
||
* doesn't make sense for a reusable block to have rendered content on its
|
||
* own, since rendering a block requires it to be inside a post or a page.
|
||
*/
|
||
unset( $data['title']['rendered'] );
|
||
unset( $data['content']['rendered'] );
|
||
|
||
return $data;
|
||
}
|
||
|
||
/**
|
||
* Retrieves the block's schema, conforming to JSON Schema.
|
||
*
|
||
* @since 5.0.0
|
||
*
|
||
* @return array Item schema data.
|
||
*/
|
||
public function get_item_schema() {
|
||
// Do not cache this schema because all properties are derived from parent controller.
|
||
$schema = parent::get_item_schema();
|
||
|
||
/*
|
||
* Allow all contexts to access `title.raw` and `content.raw`. Clients always
|
||
* need the raw markup of a reusable block to do anything useful, e.g. parse
|
||
* it or display it in an editor.
|
||
*/
|
||
$schema['properties']['title']['properties']['raw']['context'] = array( 'view', 'edit' );
|
||
$schema['properties']['content']['properties']['raw']['context'] = array( 'view', 'edit' );
|
||
|
||
/*
|
||
* Remove `title.rendered` and `content.rendered` from the schema. It doesn’t
|
||
* make sense for a reusable block to have rendered content on its own, since
|
||
* rendering a block requires it to be inside a post or a page.
|
||
*/
|
||
unset( $schema['properties']['title']['properties']['rendered'] );
|
||
unset( $schema['properties']['content']['properties']['rendered'] );
|
||
|
||
return $schema;
|
||
}
|
||
|
||
}
|