mirror of
https://github.com/gosticks/wordpress-develop.git
synced 2026-04-03 20:24:26 +00:00
Blocks: Add support for variations in block.json` file
We integrated variations with block types and the corresponding REST API endpoint in #52688. It's a follow-up patch to add missing support to the `block.json` metadata file when using `register_block_type`. Some fields for variations are translatable.Therefore, i18n schema was copied over from Gutenberg: https://github.com/WordPress/gutenberg/blob/trunk/packages/blocks/src/api/i18n-block.json. The accompanying implementation was adapted as `translate_settings_using_i18n_schema`. Props: gwwar, swissspidy, schlessera, jorgefilipecosta. Fixes #53238. git-svn-id: https://develop.svn.wordpress.org/trunk@51599 602fd350-edb4-49c9-b593-d223f7449a82
This commit is contained in:
@@ -187,11 +187,29 @@ function register_block_style_handle( $metadata, $field_name ) {
|
||||
return $result ? $style_handle : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets i18n schema for block's metadata read from `block.json` file.
|
||||
*
|
||||
* @since 5.9.0
|
||||
*
|
||||
* @return array The schema for block's metadata.
|
||||
*/
|
||||
function get_block_metadata_i18n_schema() {
|
||||
static $i18n_block_schema;
|
||||
|
||||
if ( ! isset( $i18n_block_schema ) ) {
|
||||
$i18n_block_schema = wp_json_file_decode( __DIR__ . '/block-i18n.json' );
|
||||
}
|
||||
|
||||
return $i18n_block_schema;
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers a block type from the metadata stored in the `block.json` file.
|
||||
*
|
||||
* @since 5.5.0
|
||||
* @since 5.9.0 Added support for the `viewScript` field.
|
||||
* @since 5.7.0 Added support for `textdomain` field and i18n handling for all translatable fields.
|
||||
* @since 5.9.0 Added support for `variations` and `viewScript` fields.
|
||||
*
|
||||
* @param string $file_or_folder Path to the JSON file with metadata definition for
|
||||
* the block or path to the folder where the `block.json` file is located.
|
||||
@@ -209,7 +227,7 @@ function register_block_type_from_metadata( $file_or_folder, $args = array() ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$metadata = json_decode( file_get_contents( $metadata_file ), true );
|
||||
$metadata = wp_json_file_decode( $metadata_file, array( 'associative' => true ) );
|
||||
if ( ! is_array( $metadata ) || empty( $metadata['name'] ) ) {
|
||||
return false;
|
||||
}
|
||||
@@ -238,6 +256,7 @@ function register_block_type_from_metadata( $file_or_folder, $args = array() ) {
|
||||
|
||||
$settings = array();
|
||||
$property_mappings = array(
|
||||
'apiVersion' => 'api_version',
|
||||
'title' => 'title',
|
||||
'category' => 'category',
|
||||
'parent' => 'parent',
|
||||
@@ -249,53 +268,17 @@ function register_block_type_from_metadata( $file_or_folder, $args = array() ) {
|
||||
'usesContext' => 'uses_context',
|
||||
'supports' => 'supports',
|
||||
'styles' => 'styles',
|
||||
'variations' => 'variations',
|
||||
'example' => 'example',
|
||||
'apiVersion' => 'api_version',
|
||||
);
|
||||
$textdomain = ! empty( $metadata['textdomain'] ) ? $metadata['textdomain'] : null;
|
||||
$i18n_schema = get_block_metadata_i18n_schema();
|
||||
|
||||
foreach ( $property_mappings as $key => $mapped_key ) {
|
||||
if ( isset( $metadata[ $key ] ) ) {
|
||||
$value = $metadata[ $key ];
|
||||
if ( empty( $metadata['textdomain'] ) ) {
|
||||
$settings[ $mapped_key ] = $value;
|
||||
continue;
|
||||
}
|
||||
$textdomain = $metadata['textdomain'];
|
||||
switch ( $key ) {
|
||||
case 'title':
|
||||
case 'description':
|
||||
// phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText,WordPress.WP.I18n.NonSingularStringLiteralContext,WordPress.WP.I18n.NonSingularStringLiteralDomain
|
||||
$settings[ $mapped_key ] = translate_with_gettext_context( $value, sprintf( 'block %s', $key ), $textdomain );
|
||||
break;
|
||||
case 'keywords':
|
||||
$settings[ $mapped_key ] = array();
|
||||
if ( ! is_array( $value ) ) {
|
||||
continue 2;
|
||||
}
|
||||
|
||||
foreach ( $value as $keyword ) {
|
||||
// phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText,WordPress.WP.I18n.NonSingularStringLiteralDomain
|
||||
$settings[ $mapped_key ][] = translate_with_gettext_context( $keyword, 'block keyword', $textdomain );
|
||||
}
|
||||
|
||||
break;
|
||||
case 'styles':
|
||||
$settings[ $mapped_key ] = array();
|
||||
if ( ! is_array( $value ) ) {
|
||||
continue 2;
|
||||
}
|
||||
|
||||
foreach ( $value as $style ) {
|
||||
if ( ! empty( $style['label'] ) ) {
|
||||
// phpcs:ignore WordPress.WP.I18n.LowLevelTranslationFunction,WordPress.WP.I18n.NonSingularStringLiteralText,WordPress.WP.I18n.NonSingularStringLiteralDomain
|
||||
$style['label'] = translate_with_gettext_context( $style['label'], 'block style label', $textdomain );
|
||||
}
|
||||
$settings[ $mapped_key ][] = $style;
|
||||
}
|
||||
|
||||
break;
|
||||
default:
|
||||
$settings[ $mapped_key ] = $value;
|
||||
$settings[ $mapped_key ] = $metadata[ $key ];
|
||||
if ( $textdomain && isset( $i18n_schema->$key ) ) {
|
||||
$settings[ $mapped_key ] = translate_settings_using_i18n_schema( $i18n_schema->$key, $settings[ $key ], $textdomain );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user