wpseek.com
A WordPress-centric search engine for devs and theme authors



block_editor_rest_api_preload › WordPress Function

Since5.8.0
Deprecatedn/a
› block_editor_rest_api_preload ( $preload_paths, $block_editor_context )
Parameters: (2)
  • ((string|string[])[]) $preload_paths List of paths to preload.
    Required: Yes
  • (WP_Block_Editor_Context) $block_editor_context The current block editor context.
    Required: Yes
Defined at:
Codex:

Preloads common data used with the block editor by specifying an array of REST API paths that will be preloaded for a given block editor context.



Source

function block_editor_rest_api_preload( array $preload_paths, $block_editor_context ) {
	global $post, $wp_scripts, $wp_styles, $wp_script_modules;

	/**
	 * Filters the array of REST API paths that will be used to preloaded common data for the block editor.
	 *
	 * @since 5.8.0
	 *
	 * @param (string|string[])[]     $preload_paths        Array of paths to preload.
	 * @param WP_Block_Editor_Context $block_editor_context The current block editor context.
	 */
	$preload_paths = apply_filters( 'block_editor_rest_api_preload_paths', $preload_paths, $block_editor_context );

	if ( ! empty( $block_editor_context->post ) ) {
		$selected_post = $block_editor_context->post;

		/**
		 * Filters the array of paths that will be preloaded.
		 *
		 * Preload common data by specifying an array of REST API paths that will be preloaded.
		 *
		 * @since 5.0.0
		 * @deprecated 5.8.0 Use the {@see 'block_editor_rest_api_preload_paths'} filter instead.
		 *
		 * @param (string|string[])[] $preload_paths Array of paths to preload.
		 * @param WP_Post             $selected_post Post being edited.
		 */
		$preload_paths = apply_filters_deprecated( 'block_editor_preload_paths', array( $preload_paths, $selected_post ), '5.8.0', 'block_editor_rest_api_preload_paths' );
	}

	if ( empty( $preload_paths ) ) {
		return;
	}

	/*
	 * Ensure the globals $post, $wp_scripts, $wp_styles, and $wp_script_modules
	 * remain the same after API data is preloaded.
	 * Because API preloading can call the_content and other filters, plugins
	 * can unexpectedly modify the global $post or enqueue assets which are not
	 * intended for the block editor.
	 *
	 * Copies are swapped in for the duration of the preload and the original
	 * instances are restored afterwards, so that hooks and other references
	 * bound to those instances remain valid.
	 */
	$original_post              = $post;
	$original_wp_scripts        = $wp_scripts;
	$original_wp_styles         = $wp_styles;
	$original_wp_script_modules = $wp_script_modules;

	$post              = ! empty( $post ) ? clone $post : $post;
	$wp_scripts        = ! empty( $wp_scripts ) ? clone $wp_scripts : $wp_scripts;
	$wp_styles         = ! empty( $wp_styles ) ? clone $wp_styles : $wp_styles;
	$wp_script_modules = ! empty( $wp_script_modules ) ? clone $wp_script_modules : $wp_script_modules;

	foreach ( $preload_paths as &$path ) {
		if ( is_string( $path ) && ! str_starts_with( $path, '/' ) ) {
			$path = '/' . $path;
			continue;
		}

		if ( is_array( $path ) && is_string( $path[0] ) && ! str_starts_with( $path[0], '/' ) ) {
			$path[0] = '/' . $path[0];
		}
	}

	unset( $path );

	$preload_data = array_reduce(
		$preload_paths,
		'rest_preload_api_request',
		array()
	);

	// Restore the original $post, $wp_scripts, $wp_styles, and $wp_script_modules instances.
	$post = $original_post;
	if ( ! empty( $post ) ) {
		setup_postdata( $post );
	}
	$wp_scripts        = $original_wp_scripts;
	$wp_styles         = $original_wp_styles;
	$wp_script_modules = $original_wp_script_modules;

	wp_add_inline_script(
		'wp-api-fetch',
		sprintf(
			'wp.apiFetch.use( wp.apiFetch.createPreloadingMiddleware( %s ) );',
			wp_json_encode( $preload_data, JSON_HEX_TAG | JSON_UNESCAPED_SLASHES )
		),
		'after'
	);
}