diff --git a/lib/compat/wordpress-5.9/block-template-utils.php b/lib/compat/wordpress-5.9/block-template-utils.php index 712711af50cb2..99ee70c90e7b8 100644 --- a/lib/compat/wordpress-5.9/block-template-utils.php +++ b/lib/compat/wordpress-5.9/block-template-utils.php @@ -751,6 +751,77 @@ function gutenberg_get_block_template( $id, $template_type = 'wp_template' ) { return $block_template; } + $parts = explode( '//', $id, 2 ); + if ( count( $parts ) < 2 ) { + return null; + } + list( $theme, $slug ) = $parts; + $wp_query_args = array( + 'post_name__in' => array( $slug ), + 'post_type' => $template_type, + 'post_status' => array( 'auto-draft', 'draft', 'publish', 'trash' ), + 'posts_per_page' => 1, + 'no_found_rows' => true, + 'tax_query' => array( + array( + 'taxonomy' => 'wp_theme', + 'field' => 'name', + 'terms' => $theme, + ), + ), + ); + $template_query = new WP_Query( $wp_query_args ); + $posts = $template_query->posts; + + if ( count( $posts ) > 0 ) { + $template = _build_block_template_result_from_post( $posts[0] ); + + if ( ! is_wp_error( $template ) ) { + return $template; + } + } + + $block_template = get_block_file_template( $id, $template_type ); + + /** + * Filters the queried block template object after it's been fetched. + * + * @since 10.8 + * + * @param Gutenberg_Block_Template|null $block_template The found block template, or null if there isn't one. + * @param string $id Template unique identifier (example: theme_slug//template_slug). + * @param array $template_type wp_template or wp_template_part. + */ + return apply_filters( 'get_block_template', $block_template, $id, $template_type ); +} + +/** + * Retrieves a single unified template object using its id. If no template object is found with that ID, + * continues looking for a fallback using the template hierarchy resolution algorithm. + * + * @param string $id Template unique identifier (example: theme_slug//template_slug). + * @param array $template_type wp_template or wp_template_part. + * + * @return Gutenberg_Block_Template|null Template. + */ +function gutenberg_get_block_template_with_fallback( $id, $template_type = 'wp_template' ) { + /** + * Filters the block template object before the query takes place. + * + * Return a non-null value to bypass the WordPress queries. + * + * @since 10.8 + * + * @param Gutenberg_Block_Template|null $block_template Return block template object to short-circuit the default query, + * or null to allow WP to run it's normal queries. + * @param string $id Template unique identifier (example: theme_slug//template_slug). + * @param array $template_type wp_template or wp_template_part. + */ + $block_template = apply_filters( 'pre_get_block_template', null, $id, $template_type ); + if ( ! is_null( $block_template ) ) { + return $block_template; + } + $parts = explode( '//', $id, 2 ); if ( count( $parts ) < 2 ) { return null;