163 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			163 lines
		
	
	
		
			4.2 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
/**
 | 
						|
 * Block Templates Compatibility.
 | 
						|
 *
 | 
						|
 * @package Builder
 | 
						|
 */
 | 
						|
 | 
						|
if ( ! defined( 'ABSPATH' ) ) {
 | 
						|
	exit; // Exit if accessed directly.
 | 
						|
}
 | 
						|
 | 
						|
/**
 | 
						|
 * Block Templates Compatibility Class.
 | 
						|
 *
 | 
						|
 * @since 4.9.8
 | 
						|
 */
 | 
						|
class ET_Builder_Block_Templates {
 | 
						|
	/**
 | 
						|
	 * Instance of `ET_Builder_Block_Templates`.
 | 
						|
	 *
 | 
						|
	 * @var ET_Builder_Block_Templates
 | 
						|
	 */
 | 
						|
	private static $_instance;
 | 
						|
 | 
						|
	/**
 | 
						|
	 * ET_Builder_Block_Templates constructor.
 | 
						|
	 */
 | 
						|
	public function __construct() {
 | 
						|
		$this->set_query_templates_filters();
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Get the class instance.
 | 
						|
	 *
 | 
						|
	 * @since 4.9.8
 | 
						|
	 *
 | 
						|
	 * @return ET_Builder_Block_Templates
 | 
						|
	 */
 | 
						|
	public static function instance() {
 | 
						|
		if ( ! self::$_instance ) {
 | 
						|
			self::$_instance = new self();
 | 
						|
		}
 | 
						|
 | 
						|
		return self::$_instance;
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Set query templates filters to override block templates.
 | 
						|
	 *
 | 
						|
	 * @since 4.9.8
 | 
						|
	 */
 | 
						|
	public function set_query_templates_filters() {
 | 
						|
		// Bail early if current active builder is not DBP.
 | 
						|
		if ( ! et_is_builder_plugin_active() ) {
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		// Bail early if `locate_block_template` function doesn't exists (WP 5.8).
 | 
						|
		if ( ! function_exists( 'locate_block_template' ) ) {
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		// Add those filters only when current active theme supports `block-templates` or
 | 
						|
		// has block templates index HTML.
 | 
						|
		if ( ! current_theme_supports( 'block-templates' ) && ! is_readable( get_stylesheet_directory() . '/block-templates/index.html' ) ) {
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		/**
 | 
						|
		 * List of possible hook names:
 | 
						|
		 *  - `404_template`
 | 
						|
		 *  - `archive_template`
 | 
						|
		 *  - `attachment_template` (Not Included)
 | 
						|
		 *  - `author_template`
 | 
						|
		 *  - `category_template`
 | 
						|
		 *  - `date_template`
 | 
						|
		 *  - `embed_template` (Not Included)
 | 
						|
		 *  - `frontpage_template`
 | 
						|
		 *  - `home_template`
 | 
						|
		 *  - `index_template`
 | 
						|
		 *  - `page_template`
 | 
						|
		 *  - `paged_template`
 | 
						|
		 *  - `privacypolicy_template`
 | 
						|
		 *  - `search_template`
 | 
						|
		 *  - `single_template`
 | 
						|
		 *  - `singular_template`
 | 
						|
		 *  - `tag_template`
 | 
						|
		 *  - `taxonomy_template`
 | 
						|
		 *
 | 
						|
		 * However we don't include `attachment`, `paged`, and `embed` because they are not
 | 
						|
		 * modified or attached to TB tempates.
 | 
						|
		 */
 | 
						|
		$template_types = array(
 | 
						|
			'404_template',
 | 
						|
			'archive_template',
 | 
						|
			'author_template',
 | 
						|
			'category_template',
 | 
						|
			'date_template',
 | 
						|
			'frontpage_template',
 | 
						|
			'home_template',
 | 
						|
			'index_template',
 | 
						|
			'page_template',
 | 
						|
			'privacypolicy_template',
 | 
						|
			'search_template',
 | 
						|
			'single_template',
 | 
						|
			'singular_template',
 | 
						|
			'tag_template',
 | 
						|
			'taxonomy_template',
 | 
						|
		);
 | 
						|
 | 
						|
		foreach ( $template_types as $template ) {
 | 
						|
			add_filter( $template, array( $this, 'get_custom_query_template' ), 30, 3 );
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/**
 | 
						|
	 * Get pre-defined query template to override block template (modified default template
 | 
						|
	 * or custom template).
 | 
						|
	 *
 | 
						|
	 * @since 4.9.8
 | 
						|
	 *
 | 
						|
	 * @param string $template  Path to the template. See locate_template().
 | 
						|
	 * @param string $type      Sanitized filename without extension.
 | 
						|
	 * @param array  $templates A list of template candidates, in descending order of priority.
 | 
						|
	 *
 | 
						|
	 * @return string Modified path to the template.
 | 
						|
	 */
 | 
						|
	public function get_custom_query_template( $template, $type, $templates ) {
 | 
						|
		// Bail early if there is no TB templates for current page request.
 | 
						|
		if ( empty( et_theme_builder_get_template_layouts() ) ) {
 | 
						|
			return $template;
 | 
						|
		}
 | 
						|
 | 
						|
		// 1. Restore - Get pre-defined query template.
 | 
						|
		$original_template = $template;
 | 
						|
		$template          = locate_template( $templates );
 | 
						|
 | 
						|
		// If the `locate_template` return empty path because there is no template or theme
 | 
						|
		// theme compat found, use builder block template canvas.
 | 
						|
		if ( empty( $template ) && 'template-canvas.php' === basename( $original_template ) ) {
 | 
						|
			$template = ET_BUILDER_DIR . 'templates/block-template-canvas.php';
 | 
						|
		}
 | 
						|
 | 
						|
		// 2. Remove hooks added for template canvas (block template).
 | 
						|
		// Remove viewport meta tag.
 | 
						|
		if ( function_exists( '_block_template_viewport_meta_tag' ) ) {
 | 
						|
			remove_action( 'wp_head', '_block_template_viewport_meta_tag', 0 );
 | 
						|
		}
 | 
						|
 | 
						|
		// Render conditional title tag for `title-tag` support.
 | 
						|
		add_action( 'wp_head', '_wp_render_title_tag', 1 );
 | 
						|
 | 
						|
		// Remove unconditional title tag.
 | 
						|
		if ( function_exists( '_block_template_render_title_tag' ) ) {
 | 
						|
			remove_action( 'wp_head', '_block_template_render_title_tag', 1 );
 | 
						|
		}
 | 
						|
 | 
						|
		return $template;
 | 
						|
	}
 | 
						|
}
 | 
						|
 | 
						|
ET_Builder_Block_Templates::instance();
 |