File "class-render.php"

Full path: /home/dora/public_html/wp-content/plugins/wp-grid-builder-bricks/includes/class-render.php
File size: 4.36 KB
MIME-type: --
Charset: utf-8

<?php
/**
 * Render elements
 *
 * @package   WP Grid Builder - Bricks
 * @author    Loïc Blascos
 * @copyright 2019-2022 Loïc Blascos
 */

namespace WP_Grid_Builder_Bricks\Includes;

// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

/**
 * Render
 *
 * @class WP_Grid_Builder_Bricks\Includes\Render
 * @since 1.0.0
 */
final class Render {

	use Helpers;

	/**
	 * Holds Bricks elements to handle
	 *
	 * @since 1.0.0
	 * @access protected
	 * @var array
	 */
	protected $elements = [];

	/**
	 * Constructor
	 *
	 * @since 1.0.0
	 * @access public
	 */
	public function __construct() {

		add_filter( 'wp_grid_builder_bricks/handle_element', [ $this, 'handle_element' ], 10, 2 );
		add_filter( 'wp_grid_builder_bricks/setup_element', [ $this, 'setup_element' ] );
		add_filter( 'wp_grid_builder/frontend/register_scripts', [ $this, 'register_script' ] );
		add_filter( 'wp_grid_builder/frontend/add_inline_script', [ $this, 'inline_script' ] );
		add_filter( 'wp_grid_builder/frontend/localize_script', [ $this, 'unset_elements' ] );
		add_filter( 'bricks/builder/data_post_id', [ $this, 'get_elements' ] );

	}

	/**
	 * Whether to handle element
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @param boolean $handle Whether to handle element.
	 * @param string  $element Element id.
	 * @return boolean
	 */
	public function handle_element( $handle, $element ) {

		if ( ! isset( $this->elements[ $element ] ) ) {
			return false;
		}

		// Prevent rendering duplicate elements.
		unset( $this->elements[ $element ] );

		return true;

	}

	/**
	 * Setup element ID to handle
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @param interger $element_id Element ID to handle.
	 */
	public function setup_element( $element_id ) {

		if ( empty( $element_id ) || isset( $this->elements[ $element_id ] ) ) {
			return false;
		}

		$this->elements[ $element_id ] = true;

	}

	/**
	 * Loop through elements to render
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @param integer $post_id Holds current post ID.
	 * @return integer
	 */
	public function get_elements( $post_id ) {

		if ( bricks_is_builder() || wpgb_doing_ajax() ) {
			return $post_id;
		}

		$elements = $this->get_bricks_data( $post_id );

		if ( false === $elements ) {
			return $post_id;
		}

		foreach ( $elements as $element ) {

			if ( empty( $element['id'] ) || empty( $element['name'] ) ) {
				continue;
			}

			$this->get_template( $element );

			if ( empty( $element['settings']['grid'] ) || 'wpgb-facet' !== $element['name'] ) {
				continue;
			}

			$this->setup_element( $element['settings']['grid'] );

		}

		return $post_id;

	}

	/**
	 * Retrieve template elements to render
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @param array $element Holds element.
	 */
	public function get_template( $element ) {

		if ( 'template' !== $element['name'] || empty( $element['settings']['template'] ) ) {
			return;
		}

		apply_filters( 'wp_grid_builder_bricks/data_post_id', (int) $element['settings']['template'] );
		$this->get_elements( $element['settings']['template'] );

	}

	/**
	 * Unset shadow elements generated by Bricks facets
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @param array $data Holds data to localize.
	 * @return array
	 */
	public function unset_elements( $data ) {

		if ( empty( $data['shadowGrids'] ) ) {
			return $data;
		}

		$data['shadowGrids'] = array_values(
			array_filter(
				$data['shadowGrids'],
				function( $id ) {
					return strpos( $id, 'bricks-element-' ) === false;
				}
			)
		);

		return $data;

	}

	/**
	 * Register script
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @param array $scripts Holds script to register.
	 * @return array
	 */
	public function register_script( $scripts ) {

		$scripts[] = [
			'handle'  => 'wpgb-bricks',
			'source'  => WPGB_BRICKS_URL . 'assets/js/frontend.js',
			'version' => WPGB_BRICKS_VERSION,
		];

		return $scripts;

	}

	/**
	 * Add inline javascript code to instantiate Bricks elements
	 *
	 * @since 1.0.0
	 * @access public
	 *
	 * @param string $script Inline script.
	 * @return string
	 */
	public function inline_script( $script ) {

		$rendered = [];

		foreach ( Container::all() as $id => $instance ) {
			$rendered[] = $instance->inline_script( $script );
		}

		if ( ! empty( $rendered ) ) {
			$script .= implode( '', array_unique( $rendered ) );
		}

		return apply_filters( 'wp_grid_builder/template/inline_script', $script );

	}
}