Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Plugin: Post WordPress 6.0 Beta 1 cleanup #40349

Merged
merged 1 commit into from
Apr 20, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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