Switch template registration to use register_block_template

[MAILPOET-6356]
This commit is contained in:
Rostislav Wolny
2024-12-13 15:59:42 +01:00
committed by Rostislav Wolný
parent 62b77b724c
commit 2fc0ad3c9e
5 changed files with 40 additions and 16 deletions

View File

@@ -251,7 +251,7 @@ export const getEmailTemplates = createRegistrySelector(
?.filter(
( template ) =>
// @ts-expect-error Missing property in type
template.theme === 'mailpoet/mailpoet'
template.plugin === 'mailpoet'
)
);

View File

@@ -72,7 +72,7 @@ class Renderer {
* @return array
*/
public function render( \WP_Post $post, string $subject, string $pre_header, string $language, $meta_robots = '' ): array { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed
$template_id = 'mailpoet/mailpoet//' . ( get_page_template_slug( $post ) ? get_page_template_slug( $post ) : 'email-general' );
$template_id = get_stylesheet() . '//' . ( get_page_template_slug( $post ) ? get_page_template_slug( $post ) : 'email-general' );
/** @var \WP_Block_Template $template */ // phpcs:ignore Generic.Commenting.DocComment.MissingShort -- used for phpstan
$template = $this->templates->get_block_template( $template_id );

View File

@@ -25,7 +25,7 @@ class Templates {
*
* @var string $plugin_slug
*/
private string $plugin_slug = 'mailpoet/mailpoet';
private string $template_prefix = 'mailpoet';
/**
* The post type.
*
@@ -60,11 +60,6 @@ class Templates {
* Initializes the class.
*/
public function initialize(): void {
add_filter( 'pre_get_block_file_template', array( $this, 'get_block_file_template' ), 10, 3 );
add_filter( 'get_block_templates', array( $this, 'add_block_templates' ), 10, 3 );
add_filter( 'theme_templates', array( $this, 'add_theme_templates' ), 10, 4 ); // Needed when saving post template association.
add_filter( 'get_block_template', array( $this, 'add_block_template_details' ), 10, 1 );
add_filter( 'rest_pre_insert_wp_template', array( $this, 'force_post_content' ), 9, 1 );
$this->initialize_templates();
}
@@ -75,8 +70,7 @@ class Templates {
* @return WP_Block_Template|null
*/
public function get_block_template( $template_id ) {
$templates = $this->get_block_templates();
return $templates[ $template_id ] ?? null;
return get_block_template( $template_id );
}
/**
@@ -90,7 +84,7 @@ class Templates {
public function get_block_file_template( $result, $template_id, $template_type ) { // phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundAfterLastUsed
['prefix' => $template_prefix, 'slug' => $template_slug] = $this->utils->get_template_id_parts( $template_id );
if ( $this->plugin_slug !== $template_prefix ) {
if ( $this->template_prefix !== $template_prefix ) {
return $result;
}
@@ -201,6 +195,9 @@ class Templates {
* Initialize template details. This is done at runtime because of localisation.
*/
private function initialize_templates(): void {
if ( ! function_exists( 'register_block_template' ) ) {
return;
}
$this->templates['email-general'] = array(
'title' => __( 'General Email', 'mailpoet' ),
'description' => __( 'A general template for emails.', 'mailpoet' ),
@@ -209,6 +206,19 @@ class Templates {
'title' => __( 'Simple Light', 'mailpoet' ),
'description' => __( 'A basic template with header and footer.', 'mailpoet' ),
);
foreach ( $this->templates as $template_slug => $template ) {
$template = $this->get_block_template_from_file( $template_slug . '.html' );
register_block_template(
$this->template_prefix . '//' . $template_slug,
array(
'title' => $template->title,
'description' => $template->description,
'content' => $template->content,
'post_types' => array( $this->post_type ),
)
);
}
}
/**
@@ -252,12 +262,12 @@ class Templates {
$template_slug = $this->utils->get_block_template_slug_from_path( $template );
$template_object = (object) array(
'slug' => $template_slug,
'id' => $this->plugin_slug . '//' . $template_slug,
'id' => $this->template_prefix . '//' . $template_slug,
'title' => $this->templates[ $template_slug ]['title'] ?? '',
'description' => $this->templates[ $template_slug ]['description'] ?? '',
'path' => $this->template_directory . $template,
'type' => 'wp_template',
'theme' => $this->plugin_slug,
'theme' => $this->template_prefix,
'source' => 'plugin',
'post_types' => array(
$this->post_type,
@@ -282,7 +292,7 @@ class Templates {
array(
'taxonomy' => 'wp_theme',
'field' => 'name',
'terms' => array( $this->plugin_slug, get_stylesheet() ),
'terms' => array( $this->template_prefix, get_stylesheet() ),
),
),
);

View File

@@ -73,6 +73,7 @@ class IntegrationTester extends \Codeception\Actor {
*/
public function cleanup(): void {
$this->delete_posts();
$this->unregister_block_templates();
}
/**
@@ -94,4 +95,17 @@ class IntegrationTester extends \Codeception\Actor {
}
$this->cleanup_user_theme_post();
}
/**
* Unregister block templates we may add during the tests.
*/
private function unregister_block_templates(): void {
$registry = WP_Block_Templates_Registry::get_instance();
$templates = $registry->get_all_registered();
foreach ( $templates as $name => $template ) {
if ( 'mailpoet' === $template->plugin && $registry->is_registered( $name ) ) {
$registry->unregister( $name );
}
}
}
}

View File

@@ -35,12 +35,12 @@ class Templates_Test extends \MailPoetTest {
* @return void
*/
public function testItCanFetchBlockTemplate(): void {
$template_id = 'mailpoet/mailpoet//email-general';
$template_id = get_stylesheet() . '//email-general'; // Templates id is prefixed with the theme name.
$template = $this->templates->get_block_template( $template_id );
self::assertInstanceOf( \WP_Block_Template::class, $template );
verify( $template->slug )->equals( 'email-general' );
verify( $template->id )->equals( 'mailpoet/mailpoet//email-general' );
verify( $template->id )->equals( $template_id );
verify( $template->title )->equals( 'General Email' );
verify( $template->description )->equals( 'A general template for emails.' );
}