Editor: Introduce block context

Backports a new block context feature from Gutenberg. The purpose of this feature is to be able to establish values in a block hierarchy which can be consumed by blocks anywhere lower in the same hierarchy. These values can be established either by the framework, or by other blocks which provide these values. See documentation: https://github.com/WordPress/gutenberg/blob/master/docs/designers-developers/developers/block-api/block-context.md

Props aduth, epiqueras.
Fixes #49927.


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


git-svn-id: http://core.svn.wordpress.org/trunk@47993 1a063a9b-81f0-0310-95a4-ce76da25c4cd
This commit is contained in:
gziolo 2020-06-30 11:04:04 +00:00
parent 0a805dbee6
commit 0249959306
3 changed files with 46 additions and 32 deletions

View File

@ -649,67 +649,74 @@ function _excerpt_render_inner_columns_blocks( $columns, $allowed_blocks ) {
* *
* @since 5.0.0 * @since 5.0.0
* *
* @global WP_Post $post The post to edit. * @global WP_Post $post The post to edit.
* @global WP_Query $wp_the_query WordPress Query object.
* *
* @param array $block A single parsed block object. * @param array $parsed_block A single parsed block object.
* @return string String of rendered HTML. * @return string String of rendered HTML.
*/ */
function render_block( $block ) { function render_block( $parsed_block ) {
global $post; global $post, $wp_query;
/** /**
* Allows render_block() to be short-circuited, by returning a non-null value. * Allows render_block() to be short-circuited, by returning a non-null value.
* *
* @since 5.1.0 * @since 5.1.0
* *
* @param string|null $pre_render The pre-rendered content. Default null. * @param string|null $pre_render The pre-rendered content. Default null.
* @param array $block The block being rendered. * @param array $parsed_block The block being rendered.
*/ */
$pre_render = apply_filters( 'pre_render_block', null, $block ); $pre_render = apply_filters( 'pre_render_block', null, $parsed_block );
if ( ! is_null( $pre_render ) ) { if ( ! is_null( $pre_render ) ) {
return $pre_render; return $pre_render;
} }
$source_block = $block; $source_block = $parsed_block;
/** /**
* Filters the block being rendered in render_block(), before it's processed. * Filters the block being rendered in render_block(), before it's processed.
* *
* @since 5.1.0 * @since 5.1.0
* *
* @param array $block The block being rendered. * @param array $parsed_block The block being rendered.
* @param array $source_block An un-modified copy of $block, as it appeared in the source content. * @param array $source_block An un-modified copy of $parsed_block, as it appeared in the source content.
*/ */
$block = apply_filters( 'render_block_data', $block, $source_block ); $parsed_block = apply_filters( 'render_block_data', $parsed_block, $source_block );
$block_type = WP_Block_Type_Registry::get_instance()->get_registered( $block['blockName'] ); $context = array();
$is_dynamic = $block['blockName'] && null !== $block_type && $block_type->is_dynamic();
$block_content = '';
$index = 0;
foreach ( $block['innerContent'] as $chunk ) { if ( ! empty( $post ) ) {
$block_content .= is_string( $chunk ) ? $chunk : render_block( $block['innerBlocks'][ $index++ ] ); $context['postId'] = $post->ID;
/*
* The `postType` context is largely unnecessary server-side, since the
* ID is usually sufficient on its own. That being said, since a block's
* manifest is expected to be shared between the server and the client,
* it should be included to consistently fulfill the expectation.
*/
$context['postType'] = $post->post_type;
} }
if ( ! is_array( $block['attrs'] ) ) { if ( isset( $wp_query->tax_query->queried_terms['category'] ) ) {
$block['attrs'] = array(); $context['query'] = array( 'categoryIds' => array() );
} foreach ( $wp_query->tax_query->queried_terms['category']['terms'] as $category_slug_or_id ) {
$context['query']['categoryIds'][] = 'slug' === $wp_query->tax_query->queried_terms['category']['field'] ? get_cat_ID( $category_slug_or_id ) : $category_slug_or_id;
if ( $is_dynamic ) { }
$global_post = $post;
$block_content = $block_type->render( $block['attrs'], $block_content );
$post = $global_post;
} }
/** /**
* Filters the content of a single block. * Filters the default context provided to a rendered block.
* *
* @since 5.0.0 * @since 5.5.0
* *
* @param string $block_content The block content about to be appended. * @param array $context Default context.
* @param array $block The full block, including name and attributes. * @param array $parsed_block Block being rendered, filtered by `render_block_data`.
*/ */
return apply_filters( 'render_block', $block_content, $block ); $context = apply_filters( 'render_block_context', $context, $parsed_block );
$block = new WP_Block( $parsed_block, $context );
return $block->render();
} }
/** /**

View File

@ -226,7 +226,14 @@ class WP_Block {
wp_enqueue_style( $this->block_type->style ); wp_enqueue_style( $this->block_type->style );
} }
/** This filter is documented in src/wp-includes/blocks.php */ /**
* Filters the content of a single block.
*
* @since 5.0.0
*
* @param string $block_content The block content about to be appended.
* @param array $block The full block, including name and attributes.
*/
return apply_filters( 'render_block', $block_content, $this->parsed_block ); return apply_filters( 'render_block', $block_content, $this->parsed_block );
} }

View File

@ -13,7 +13,7 @@
* *
* @global string $wp_version * @global string $wp_version
*/ */
$wp_version = '5.5-alpha-48223'; $wp_version = '5.5-alpha-48224';
/** /**
* Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema. * Holds the WordPress DB revision, increments when changes are made to the WordPress DB schema.