Skip to content

Commit

Permalink
Plugin: Post WordPress 6.0 Beta 1 cleanup (#40349)
Browse files Browse the repository at this point in the history
  • Loading branch information
gziolo authored Apr 20, 2022
1 parent ef8c5b6 commit d509a92
Show file tree
Hide file tree
Showing 5 changed files with 184 additions and 168 deletions.
2 changes: 1 addition & 1 deletion docs/reference-guides/block-api/block-metadata.md
Original file line number Diff line number Diff line change
Expand Up @@ -461,7 +461,7 @@ Block type frontend and editor script definition. It will be enqueued both in th

Block type frontend script definition. It will be enqueued only when viewing the content on the front of the site.

_Note: An option to pass also an array of view scripts exists since WordPress `6.0.0`._
_Note: An option to pass also an array of view scripts exists since WordPress `6.1.0`._

### Editor Style

Expand Down
155 changes: 0 additions & 155 deletions lib/compat/wordpress-6.0/blocks.php
Original file line number Diff line number Diff line change
Expand Up @@ -123,161 +123,6 @@ function gutenberg_build_query_vars_from_query_block( $block, $page ) {
return $query;
}

/**
* Registers view scripts for core blocks if handling is missing in WordPress core.
*
* This is a temporary solution until the Gutenberg plugin sets
* the required WordPress version to 6.0.
*
* @param array $settings Array of determined settings for registering a block type.
* @param array $metadata Metadata provided for registering a block type.
*
* @return array Array of settings for registering a block type.
*/
function gutenberg_block_type_metadata_view_script( $settings, $metadata ) {
if (
! isset( $metadata['viewScript'] ) ||
! empty( $settings['view_script'] ) ||
! isset( $metadata['file'] ) ||
strpos( $metadata['file'], gutenberg_dir_path() ) !== 0
) {
return $settings;
}

$view_script_path = realpath( dirname( $metadata['file'] ) . '/' . remove_block_asset_path_prefix( $metadata['viewScript'] ) );

if ( file_exists( $view_script_path ) ) {
$view_script_id = str_replace( array( '.min.js', '.js' ), '', basename( remove_block_asset_path_prefix( $metadata['viewScript'] ) ) );
$view_script_handle = str_replace( 'core/', 'wp-block-', $metadata['name'] ) . '-' . $view_script_id;
wp_deregister_script( $view_script_handle );

// Replace suffix and extension with `.asset.php` to find the generated dependencies file.
$view_asset_file = substr( $view_script_path, 0, -( strlen( '.js' ) ) ) . '.asset.php';
$view_asset = file_exists( $view_asset_file ) ? require( $view_asset_file ) : null;
$view_script_dependencies = isset( $view_asset['dependencies'] ) ? $view_asset['dependencies'] : array();
$view_script_version = isset( $view_asset['version'] ) ? $view_asset['version'] : false;
$result = wp_register_script(
$view_script_handle,
gutenberg_url( str_replace( gutenberg_dir_path(), '', $view_script_path ) ),
$view_script_dependencies,
$view_script_version
);
if ( $result ) {
$settings['view_script'] = $view_script_handle;

if ( ! empty( $metadata['textdomain'] ) && in_array( 'wp-i18n', $view_script_dependencies, true ) ) {
wp_set_script_translations( $view_script_handle, $metadata['textdomain'] );
}
}
}
return $settings;
}
add_filter( 'block_type_metadata_settings', 'gutenberg_block_type_metadata_view_script', 10, 2 );

if ( ! function_exists( 'wp_enqueue_block_view_script' ) ) {
/**
* Enqueues a frontend script for a specific block.
*
* Scripts enqueued using this function will only get printed
* when the block gets rendered on the frontend.
*
* @since 6.0.0
*
* @param string $block_name The block name, including namespace.
* @param array $args An array of arguments [handle,src,deps,ver,media,textdomain].
*
* @return void
*/
function wp_enqueue_block_view_script( $block_name, $args ) {
$args = wp_parse_args(
$args,
array(
'handle' => '',
'src' => '',
'deps' => array(),
'ver' => false,
'in_footer' => false,

// Additional arg to allow translations for the script's textdomain.
'textdomain' => '',
)
);

/**
* Callback function to register and enqueue scripts.
*
* @param string $content When the callback is used for the render_block filter,
* the content needs to be returned so the function parameter
* is to ensure the content exists.
* @return string Block content.
*/
$callback = static function( $content, $block ) use ( $args, $block_name ) {

// Sanity check.
if ( empty( $block['blockName'] ) || $block_name !== $block['blockName'] ) {
return $content;
}

// Register the stylesheet.
if ( ! empty( $args['src'] ) ) {
wp_register_script( $args['handle'], $args['src'], $args['deps'], $args['ver'], $args['in_footer'] );
}

// Enqueue the stylesheet.
wp_enqueue_script( $args['handle'] );

// If a textdomain is defined, use it to set the script translations.
if ( ! empty( $args['textdomain'] ) && in_array( 'wp-i18n', $args['deps'], true ) ) {
wp_set_script_translations( $args['handle'], $args['textdomain'] );
}

return $content;
};

/*
* The filter's callback here is an anonymous function because
* using a named function in this case is not possible.
*
* The function cannot be unhooked, however, users are still able
* to dequeue the script registered/enqueued by the callback
* which is why in this case, using an anonymous function
* was deemed acceptable.
*/
add_filter( 'render_block', $callback, 10, 2 );
}
}

/**
* Allow multiple view scripts per block.
*
* Filters the metadata provided for registering a block type.
*
* @since 6.0.0
*
* @param array $metadata Metadata for registering a block type.
*
* @return array
*/
function gutenberg_block_type_metadata_multiple_view_scripts( $metadata ) {

// Early return if viewScript is empty, or not an array.
if ( ! isset( $metadata['viewScript'] ) || ! is_array( $metadata['viewScript'] ) ) {
return $metadata;
}

// Register all viewScript items.
foreach ( $metadata['viewScript'] as $view_script ) {
$item_metadata = $metadata;
$item_metadata['viewScript'] = $view_script;
gutenberg_block_type_metadata_view_script( array(), $item_metadata );
}

// Proceed with the default behavior.
$metadata['viewScript'] = $metadata['viewScript'][0];
return $metadata;
}
add_filter( 'block_type_metadata', 'gutenberg_block_type_metadata_multiple_view_scripts' );

if ( ! function_exists( 'build_comment_query_vars_from_block' ) ) {
/**
* Helper function that constructs a comment query vars array from the passed block properties.
Expand Down
160 changes: 160 additions & 0 deletions lib/compat/wordpress-6.1/blocks.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,160 @@
<?php
/**
* Temporary compatibility shims for block APIs present in Gutenberg.
*
* @package gutenberg
*/

/**
* Registers view scripts for core blocks if handling is missing in WordPress core.
*
* @since 6.1.0
*
* @param array $settings Array of determined settings for registering a block type.
* @param array $metadata Metadata provided for registering a block type.
*
* @return array Array of settings for registering a block type.
*/
function gutenberg_block_type_metadata_view_script( $settings, $metadata ) {
if (
! isset( $metadata['viewScript'] ) ||
! empty( $settings['view_script'] ) ||
! isset( $metadata['file'] ) ||
strpos( $metadata['file'], gutenberg_dir_path() ) !== 0
) {
return $settings;
}

$view_script_path = realpath( dirname( $metadata['file'] ) . '/' . remove_block_asset_path_prefix( $metadata['viewScript'] ) );

if ( file_exists( $view_script_path ) ) {
$view_script_id = str_replace( array( '.min.js', '.js' ), '', basename( remove_block_asset_path_prefix( $metadata['viewScript'] ) ) );
$view_script_handle = str_replace( 'core/', 'wp-block-', $metadata['name'] ) . '-' . $view_script_id;
wp_deregister_script( $view_script_handle );

// Replace suffix and extension with `.asset.php` to find the generated dependencies file.
$view_asset_file = substr( $view_script_path, 0, -( strlen( '.js' ) ) ) . '.asset.php';
$view_asset = file_exists( $view_asset_file ) ? require( $view_asset_file ) : null;
$view_script_dependencies = isset( $view_asset['dependencies'] ) ? $view_asset['dependencies'] : array();
$view_script_version = isset( $view_asset['version'] ) ? $view_asset['version'] : false;
$result = wp_register_script(
$view_script_handle,
gutenberg_url( str_replace( gutenberg_dir_path(), '', $view_script_path ) ),
$view_script_dependencies,
$view_script_version
);
if ( $result ) {
$settings['view_script'] = $view_script_handle;

if ( ! empty( $metadata['textdomain'] ) && in_array( 'wp-i18n', $view_script_dependencies, true ) ) {
wp_set_script_translations( $view_script_handle, $metadata['textdomain'] );
}
}
}
return $settings;
}
add_filter( 'block_type_metadata_settings', 'gutenberg_block_type_metadata_view_script', 10, 2 );

if ( ! function_exists( 'wp_enqueue_block_view_script' ) ) {
/**
* Enqueues a frontend script for a specific block.
*
* Scripts enqueued using this function will only get printed
* when the block gets rendered on the frontend.
*
* @since 6.1.0
*
* @param string $block_name The block name, including namespace.
* @param array $args An array of arguments [handle,src,deps,ver,media,textdomain].
*
* @return void
*/
function wp_enqueue_block_view_script( $block_name, $args ) {
$args = wp_parse_args(
$args,
array(
'handle' => '',
'src' => '',
'deps' => array(),
'ver' => false,
'in_footer' => false,

// Additional arg to allow translations for the script's textdomain.
'textdomain' => '',
)
);

/**
* Callback function to register and enqueue scripts.
*
* @param string $content When the callback is used for the render_block filter,
* the content needs to be returned so the function parameter
* is to ensure the content exists.
* @return string Block content.
*/
$callback = static function( $content, $block ) use ( $args, $block_name ) {

// Sanity check.
if ( empty( $block['blockName'] ) || $block_name !== $block['blockName'] ) {
return $content;
}

// Register the stylesheet.
if ( ! empty( $args['src'] ) ) {
wp_register_script( $args['handle'], $args['src'], $args['deps'], $args['ver'], $args['in_footer'] );
}

// Enqueue the stylesheet.
wp_enqueue_script( $args['handle'] );

// If a textdomain is defined, use it to set the script translations.
if ( ! empty( $args['textdomain'] ) && in_array( 'wp-i18n', $args['deps'], true ) ) {
wp_set_script_translations( $args['handle'], $args['textdomain'] );
}

return $content;
};

/*
* The filter's callback here is an anonymous function because
* using a named function in this case is not possible.
*
* The function cannot be unhooked, however, users are still able
* to dequeue the script registered/enqueued by the callback
* which is why in this case, using an anonymous function
* was deemed acceptable.
*/
add_filter( 'render_block', $callback, 10, 2 );
}
}

/**
* Allow multiple view scripts per block.
*
* Filters the metadata provided for registering a block type.
*
* @since 6.1.0
*
* @param array $metadata Metadata for registering a block type.
*
* @return array
*/
function gutenberg_block_type_metadata_multiple_view_scripts( $metadata ) {

// Early return if viewScript is empty, or not an array.
if ( ! isset( $metadata['viewScript'] ) || ! is_array( $metadata['viewScript'] ) ) {
return $metadata;
}

// Register all viewScript items.
foreach ( $metadata['viewScript'] as $view_script ) {
$item_metadata = $metadata;
$item_metadata['viewScript'] = $view_script;
gutenberg_block_type_metadata_view_script( array(), $item_metadata );
}

// Proceed with the default behavior.
$metadata['viewScript'] = $metadata['viewScript'][0];
return $metadata;
}
add_filter( 'block_type_metadata', 'gutenberg_block_type_metadata_multiple_view_scripts' );
File renamed without changes.
Loading

0 comments on commit d509a92

Please sign in to comment.