declare( strict_types=1 );
namespace Automattic\WooCommerce\Blocks\Templates;
use Automattic\WooCommerce\Blocks\Utils\BlockTemplateUtils;
* AbstractTemplateWithFallback class.
* Shared logic for templates with fallbacks.
abstract class AbstractTemplateWithFallback extends AbstractTemplate {
* The fallback template to render if the existing template is not available.
public string $fallback_template;
add_filter( 'taxonomy_template_hierarchy', array( $this, 'template_hierarchy' ), 1 );
add_action( 'template_redirect', array( $this, 'render_block_template' ) );
* Add the fallback template to the hierarchy, right after the current template.
* @param array $templates Templates that match the taxonomy_template_hierarchy.
public function template_hierarchy( $templates ) {
$index = array_search( static::SLUG, $templates, true );
if ( false === $index ) {
$index = array_search( static::SLUG . '.php', $templates, true );
! array_key_exists( $index + 1, $templates ) || $templates[ $index + 1 ] !== $this->fallback_template
array_splice( $templates, $index + 1, 0, $this->fallback_template );
* This method is hooked to WordPress' 'template_redirect' action and allows
* 1. Decide when block templates should be rendered based on the context.
* 2. Execute specific logic, such as managing the compatibility layer for
* legacy template support.
* Child classes must implement this method to define their template
* rendering conditions and any additional template-specific behavior.
abstract public function render_block_template();