?? GreyFile — Mystic File Browser

Current path: home/webdevt/www/wdp/wp-content/plugins/brizy/admin/



?? Go up: /home/webdevt/www/wdp/wp-content/plugins/brizy

?? Viewing: templates.php

<?php

class Brizy_Admin_Templates {

	const CP_TEMPLATE = 'editor-template';
	const TEMPLATE_TYPE_KEY = 'brizy_template_type';
	const CP_TEMPLATES = 'brizy_templates';
	const RULE_LIST_VEIW = 'brizy_rule_list_view';
	const RULE_TAXONOMY_LIST = 'brizy_taxonomy_list';
	const RULE_CREATE = 'brizy_create';

	const TYPE_SINGLE = 'single';
	const TYPE_ARCHIVE = 'archive';
	const TYPE_SINGLE_PRODUCT = 'single_product';
	const TYPE_PRODUCT_ARCHIVE = 'product_archive';

	private $isExcerpt;

	/**
	 * @var Brizy_Editor_Post
	 */
	private static $template;

	/**
	 * Brizy_Admin_Templates constructor.
	 */
	protected function __construct() {
		add_action( 'wp_loaded', array( $this, 'initializeActions' ) );
	}

	/**
	 * @return Brizy_Editor_Post
	 */
	public static function getTemplate() {
		return self::$template;
	}

	public function initializeActions() {
		// do other stuff here
		if ( is_admin() ) {
			add_filter( 'post_updated_messages', array( $this, 'filterTemplateMessages' ) );
			add_action( 'add_meta_boxes', array( $this, 'registerTemplateMetaBox' ), 9 );
			add_action( 'transition_post_status', array( $this, 'actionTransitionPostStatus' ), 10, 3 );
			add_action( 'wp_ajax_' . self::RULE_LIST_VEIW, array( $this, 'getTemplateRuleBox' ) );
			add_filter( 'post_row_actions', array( $this, 'removeRowActions' ), 10, 1 );
			add_action( 'admin_enqueue_scripts', array( $this, 'action_register_static' ) );
			add_filter( 'save_post', array( $this, 'saveTemplateRules' ), 10, 2 );
			add_filter( 'pre_post_update', array( $this, 'validate_template_rules' ), 10, 2 );
			add_action( 'admin_notices', array( $this, 'saveTemplateRulesNotices' ) );
		} elseif ( ! defined( 'DOING_AJAX' ) &&
		           ! is_admin() &&
		           ! isset( $_REQUEST[ Brizy_Editor::prefix( '_media' ) ] ) &&
		           ! Brizy_Public_Main::is_editing() &&
		           ! isset( $_REQUEST[ Brizy_Editor::prefix( '_file' ) ] ) &&
		           ! isset( $_REQUEST[ Brizy_Editor::prefix( '_attachment' ) ] ) &&
		           ! isset( $_REQUEST[ Brizy_Editor::prefix( '_block_screenshot' ) ] ) &&
		           ! isset( $_REQUEST[ Brizy_Editor::prefix( '' ) ] ) ) {
			add_action( 'wp', array( $this, 'templateFrontEnd' ) );
		}
	}

	/**
	 * @return Brizy_Admin_Templates
	 * @deprecated
	 */
	public static function _init() {
		return self::instance();
	}

	public static function instance() {
		static $instance;

		if ( ! $instance ) {
			$instance = new self();
		}

		return $instance;
	}

	function action_register_static() {

		if ( is_customize_preview() || get_post_type() !== Brizy_Admin_Templates::CP_TEMPLATE ) {
			return;
		}

		$urlBuilder = new Brizy_Editor_UrlBuilder();

		//  hyperapp.js is also used in PRO
		wp_enqueue_script(
			Brizy_Editor::get_slug() . '-hyperapp-js',
			$urlBuilder->plugin_url( 'admin/static/js/hyperapp.js' ),
			array( 'jquery', 'underscore' ),
			BRIZY_VERSION,
			true
		);

		wp_enqueue_style(
			Brizy_Editor::get_slug() . '-select2',
			$urlBuilder->plugin_url( 'vendor/select2/select2/dist/css/select2.min.css' ),
			array(),
			true
		);

		wp_enqueue_script(
			Brizy_Editor::get_slug() . '-select2',
			$urlBuilder->plugin_url( 'vendor/select2/select2/dist/js/select2.full.min.js' ),
			array( 'jquery' )
		);

		wp_enqueue_script(
			Brizy_Editor::get_slug() . '-rules',
			$urlBuilder->plugin_url( 'admin/static/js/rules.js' ),
			array( Brizy_Editor::get_slug() . '-hyperapp-js' ),
			BRIZY_VERSION,
			true
		);

		$templateGroups = [
			'single'  => __( 'Single', 'brizy' ),
			'archive' => __( 'Archive', 'brizy' ),

		];

		if ( class_exists( 'WooCommerce' ) ) {
			$templateGroups['single_product']  = __( 'Product', 'brizy' );
			$templateGroups['product_archive'] = __( 'Product Archive', 'brizy' );
		}
		$ruleManager = new Brizy_Admin_Rules_Manager();
		wp_localize_script(
			Brizy_Editor::get_slug() . '-rules',
			'Brizy_Admin_Rules',
			array(
				'url'          => set_url_scheme( admin_url( 'admin-ajax.php' ) ),
				'rules'        => $ruleManager->getRules( get_the_ID() ),
				'hash'         => wp_create_nonce( Brizy_Admin_Rules_Api::nonce ),
				'id'           => get_the_ID(),
				'templateType' => Brizy_Admin_Templates::getTemplateType( get_the_ID() ),
				'labels'       => $templateGroups,
				'prefix'       => Brizy_Editor::prefix(),
			)
		);
	}

	/**
	 * @param $messages
	 *
	 * @return mixed
	 */
	function filterTemplateMessages( $messages ) {
		$post             = get_post();
		$post_type        = get_post_type( $post );
		$post_type_object = get_post_type_object( $post_type );

		$messages[ self::CP_TEMPLATE ] = array(
			0  => '', // Unused. Messages start at index 1.
			1  => __( 'Template updated.' ),
			2  => __( 'Custom field updated.' ),
			3  => __( 'Custom field deleted.' ),
			4  => __( 'Template updated.' ),
			/* translators: %s: date and time of the revision */
			5  => isset( $_GET['revision'] ) ? sprintf(
				__( 'Template restored to revision from %s' ),
				wp_post_revision_title( (int) $_GET['revision'], false )
			) : false,
			6  => __( 'Template published.' ),
			7  => __( 'Template saved.' ),
			8  => __( 'Template submitted.' ),
			9  => sprintf(
				__( 'Template scheduled for: <strong>%1$s</strong>.' ),
				// translators: Publish box date format, see http://php.net/date
				date_i18n( __( 'M j, Y @ G:i' ), strtotime( $post->post_date ) )
			),
			10 => __( 'Template draft updated.' ),
		);

		if ( $post_type_object->publicly_queryable && 'Template' === $post_type ) {
			$permalink = get_permalink( $post->ID );

			$view_link                 = sprintf( ' <a href="%s">%s</a>', esc_url( $permalink ), __( 'View Template' ) );
			$messages[ $post_type ][1] .= $view_link;
			$messages[ $post_type ][6] .= $view_link;
			$messages[ $post_type ][9] .= $view_link;

			$preview_permalink          = add_query_arg( 'preview', 'true', $permalink );
			$preview_link               = sprintf(
				' <a target="_blank" href="%s">%s</a>',
				esc_url( $preview_permalink ),
				__( 'Preview Template' )
			);
			$messages[ $post_type ][8]  .= $preview_link;
			$messages[ $post_type ][10] .= $preview_link;
		}

		return $messages;
	}

	static public function registerCustomPostTemplate() {

		$labels = array(
			'name'               => _x( 'Templates', 'post type general name', 'brizy' ),
			'singular_name'      => _x( 'Template', 'post type singular name', 'brizy' ),
			'menu_name'          => _x( 'Templates', 'admin menu', 'brizy' ),
			'name_admin_bar'     => _x( 'Template', 'add new on admin bar', 'brizy' ),
			'add_new'            => _x( 'Add New', self::CP_TEMPLATE, 'brizy' ),
			'add_new_item'       => __( 'Add New Template', 'brizy' ),
			'new_item'           => __( 'New Template', 'brizy' ),
			'edit_item'          => __( 'Edit Template', 'brizy' ),
			'view_item'          => __( 'View Template', 'brizy' ),
			'all_items'          => __( 'Templates', 'brizy' ),
			'search_items'       => __( 'Search Templates', 'brizy' ),
			'parent_item_colon'  => __( 'Parent Templates:', 'brizy' ),
			'not_found'          => __( 'No Templates found.', 'brizy' ),
			'not_found_in_trash' => __( 'No Templates found in Trash.', 'brizy' ),
		);

		register_post_type(
			self::CP_TEMPLATE,
			array(
				'labels'              => $labels,
				'public'              => false,
				'has_archive'         => false,
				'description'         => __bt( 'brizy', 'Brizy' ) . ' ' . __( 'templates', 'brizy' ) . '.',
				'publicly_queryable'  => Brizy_Editor_User::is_user_allowed(),
				'show_ui'             => true,
				'show_in_menu'        => Brizy_Admin_Settings::menu_slug(),
				'query_var'           => false,
				'rewrite'             => array( 'slug' => 'editor-template' ),
				'capability_type'     => 'page',
				'hierarchical'        => false,
				'show_in_rest'        => false,
				'can_export'          => true,
				'exclude_from_search' => true,
				'supports'            => array( 'title', 'revisions', 'page-attributes' ),
			)
		);

		add_filter(
			'brizy_supported_post_types',
			function ( $posts ) {
				$posts[] = self::CP_TEMPLATE;

				return $posts;
			}
		);
	}

	public function registerTemplateMetaBox() {
		add_meta_box(
			'template-rules',
			__( 'Display Conditions', 'brizy' ),
			array(
				$this,
				'templateRulesBox',
			),
			self::CP_TEMPLATE,
			'normal',
			'high'
		);
	}

	public function removeRowActions( $actions ) {
		if ( get_post_type() === self::CP_TEMPLATE ) {
			unset( $actions['view'] );
		}

		return $actions;
	}

	public function templateRulesBox() {
		try {

			$templateId = isset( $_REQUEST['post'] ) ? (int) $_REQUEST['post'] : get_the_ID();

			if ( ! $templateId ) {
				throw new Exception();
			}

			echo '<div class="brizy-template-rules submitbox"><div id="rules"></div></div>';

		} catch ( Exception $e ) {
			Brizy_Logger::instance()->error( $e->getMessage(), array( 'exception' => $e ) );
			esc_html_e( 'Unable to show the rule box.', 'brizy' );
		}
	}

	public function getTemplateRuleBox() {
		$this->templateRulesBox();
		exit;
	}


	/**
	 * @return Brizy_Editor_Post|mixed|null
	 * @throws Exception
	 */
	public function getTemplateForCurrentPage() {
		$ruleMatches = Brizy_Admin_Rules_Manager::getCurrentPageGroupAndType();

		$is_preview = is_preview();

		$templates = get_posts(
			array(
				'post_type'   => self::CP_TEMPLATE,
				'numberposts' => - 1,
				'post_status' => $is_preview ? 'any' : 'publish',
			)
		);

		$ruleManager = new Brizy_Admin_Rules_Manager();
		$ruleSets = [];
		foreach ( $templates as $atemplate ) {
			$ruleSets[$atemplate->ID] = $ruleManager->getRuleSet( $atemplate->ID );
        }

		foreach ( (array)$ruleMatches as $rule_match ) {

            $applyFor     = $rule_match['applyFor'];
			$entityType   = $rule_match['entityType'];
			$entityValues = $rule_match['entityValues'];

            $templates    = Brizy_Admin_Rules_Manager::sortEntitiesByRuleWeight(
				$templates,
				[
					'type'         => $applyFor,
					'entityType'   => $entityType,
					'entityValues' => $entityValues,
				]
			);

			foreach ( $templates as $atemplate ) {
				try {
					if ( $ruleSets[$atemplate->ID]->isMatching( $applyFor, $entityType, $entityValues ) ) {
						return Brizy_Editor_Post::get( $atemplate->ID );
					}
				} catch ( \Exception $e ) {
					continue; // we catch here  the  exclusions
				}
			}
		}

		return null;
	}

	/**
	 * @param $template
	 *
	 * @return string
	 */
	public function templateInclude( $template ) {
		if ( ! self::getTemplate() ) {
			return $template;
		}

		$templateName = self::getTemplate()->get_template();
		$urlBuilder   = new Brizy_Editor_UrlBuilder();

		if ( ! $templateName || $templateName == 'default' ) {
			return $urlBuilder->plugin_path( 'public/views/templates/' . Brizy_Config::BRIZY_TEMPLATE_FILE_NAME );
		}

		if ( in_array(
			$templateName,
			array(
				Brizy_Config::BRIZY_BLANK_TEMPLATE_FILE_NAME,
				Brizy_Config::BRIZY_TEMPLATE_FILE_NAME,
			)
		) ) {

			return $urlBuilder->plugin_path( '/public/views/templates/' . $templateName );
		}

		return $template;
	}

	public function templateFrontEnd() {
		global $wp_query;
		$pid = Brizy_Editor::get()->currentPostId();

		$is_using_brizy = false;
		try {
			if ( in_array( get_post_type( $pid ), Brizy_Editor::get()->supported_post_types() ) ) {
				$is_using_brizy = Brizy_Editor_Entity::isBrizyEnabled( $pid );
			}
		} catch ( Exception $e ) {

		}
		try {

			if ( is_null( $pid ) || ! $is_using_brizy ) {
				self::$template = $this->getTemplateForCurrentPage();

				if ( ! self::getTemplate() ) {
					return;
				}

				add_filter( 'template_include', array( $this, 'templateInclude' ), 20000 );

				$is_preview    = is_preview() || isset( $_GET['preview'] );
				$needs_compile = $is_preview || ! self::getTemplate()->isCompiledWithCurrentVersion() || self::getTemplate()->get_needs_compile();

				if ( $needs_compile ) {
					try {
						self::getTemplate()->compile_page();
						if ( ! $is_preview && $needs_compile ) {
							self::getTemplate()->saveStorage();
							self::getTemplate()->savePost();
						}
					} catch ( Exception $e ) {
						//ignore
						Brizy_Logger::instance()->error( $e->getMessage(), [] );
					}
				}

				if ( $pid ) {
					$this->pid = $pid;
				}

				remove_filter( 'the_content', 'wpautop' );
				remove_filter('the_content', 'wptexturize');
				remove_filter('the_content', 'shortcode_unautop');

				add_filter( 'brizy_asset_manager_post', function ( $post ) use ( $pid ) {

					if ( $post->post_type !== self::CP_TEMPLATE ) {
						return $post;
					}

					return get_post( $pid );
				} );

				// insert the compiled head and content
				add_filter( 'body_class', array( $this, 'bodyClassFrontend' ) );
				add_action( 'wp_head', array( $this, 'insertTemplateHead' ) );
				add_action( 'brizy_template_content', array( $this, 'showTemplateContent' ), - 12000 );
				add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_preview_assets' ), 9999 );
				add_filter( 'the_content', [ $this, 'filterPageContent' ], - 12000 );
				add_filter( 'get_the_excerpt', [ $this, 'start_the_excerpt' ], 1 );
				add_filter( 'get_the_excerpt', [ $this, 'end_the_excerpt' ], 20 );
			}

		} catch ( Exception $e ) {
			//ignore
			Brizy_Logger::instance()->error( $e->getMessage(), [] );
		}
	}

	/**
	 * @internal
	 */
	public function enqueue_preview_assets() {
		if ( wp_script_is( 'jquery' ) === false ) {
			wp_register_script( 'jquery-core', "/wp-includes/js/jquery/jquery.js" );
			wp_register_script( 'jquery-migrate', "/wp-includes/js/jquery/jquery-migrate.min.js" );
			wp_register_script( 'jquery', false, array( 'jquery-core', 'jquery-migrate' ) );
		}

		Brizy_Public_AssetEnqueueManager::_init()->enqueuePost( self::getTemplate() );

		do_action( 'brizy_preview_enqueue_scripts', self::getTemplate() );
	}

	public function bodyClassFrontend( $classes ) {
		$classes[] = 'brz';

		return $classes;
	}

	/**
	 *  Show the compiled page head content
	 */
	public function insertTemplateHead() {
		if ( ! self::getTemplate() ) {
			return;
		}

		$pid      = Brizy_Editor::get()->currentPostId();
		$template = self::getTemplate();
		$post     = $template->getWpPost();

		if ( $pid ) {
			$post = get_post( $pid );
		}

		$compiled_page = self::getTemplate()->get_compiled_page();
		$templateHead  = $compiled_page->get_head();

		if ( empty( $templateHead ) ) {
			return;
		}

		$head = apply_filters( 'brizy_content', $templateHead, Brizy_Editor_Project::get(), $post, 'head' );
		?>
        <!-- BRIZY HEAD -->
		<?php echo $head; ?>
        <!-- END BRIZY HEAD -->
		<?php
	}

	/**
	 * @param $content
	 *
	 * @return null|string|string[]
	 * @throws Exception
	 */
	public function showTemplateContent() {
		$content = $this->getTemplateContent();
		echo apply_filters( 'the_content', $content );
	}


	private function getTemplateContent() {
		if ( ! self::getTemplate() ) {
			return;
		}

		$pid  = Brizy_Editor::get()->currentPostId();
		$post = self::getTemplate()->getWpPost();

		if ( $pid ) {
			$post = get_post( $pid );
		}

		$content = apply_filters(
			'brizy_content',
			self::getTemplate()->get_compiled_page()->getBody(),
			Brizy_Editor_Project::get(),
			$post,
			'body'
		);

		return apply_filters( 'brizy_template_content_compiled', $content );
	}

	/**
	 * @param $content
	 *
	 * @return null|string|string[]
	 * @throws Exception
	 */
	public function filterPageContent( $content ) {
		if ( ! self::getTemplate() || doing_filter( 'brizy_content' ) || $this->isExcerpt ) {
			return $content;
		}

		$pid       = Brizy_Editor::get()->currentPostId();
		$brizyPost = null;

		if ( $pid ) {
			$brizyPost = get_post( $pid );
		}

		$content = $this->getTemplateContent();

		return apply_filters(
			'brizy_content',
			$content,
			Brizy_Editor_Project::get(),
			$brizyPost,
			'body'
		);
	}

	/**
	 * Check for rules conflicts on transition post from trash to another post status.
	 * If we have some conflicts between the rules from the transition post rules and other rules from existing posts,
	 * then we remove conflicting rules from the restored post.
	 *
	 * @param string $new_status New post status.
	 * @param string $old_status Old post status.
	 * @param WP_Post $post Transition post.
	 */
	public function actionTransitionPostStatus( $new_status, $old_status, $post ) {

		if ( 'trash' !== $old_status || self::CP_TEMPLATE !== $post->post_type ) {
			return;
		}

		$post_id      = $post->ID;
		$rule_manager = new Brizy_Admin_Rules_Manager();
		$post_rules   = $rule_manager->getRules( $post_id );

		if ( ! $post_rules ) {
			return;
		}

		$all_rules     = $rule_manager->getAllRulesSet( array( 'post__not_in' => array( $post_id ) ) )->getRules();
		$has_conflicts = false;

		foreach ( $post_rules as $post_rule ) {

			foreach ( $all_rules as $arule ) {

				if ( $post_rule->isEqual( $arule ) ) {
					$rule_manager->deleteRule( $post_id, $post_rule->getId() );
					$has_conflicts = true;
				}
			}
		}

		if ( $has_conflicts ) {
			Brizy_Admin_Flash::instance()->add_error(
				'Conflict of rules: Some rules have been deleted for restored posts. Please check them.'
			);
		}
	}


	public static function getPostSample( $templateId ) {
		$wp_post = get_post( $templateId );
		if ( $wp_post->post_type !== Brizy_Admin_Templates::CP_TEMPLATE &&
		     $wp_post->post_type !== Brizy_Admin_Popups_Main::CP_POPUP ) {
			return $wp_post;
		}


		$ruleManager = new Brizy_Admin_Rules_Manager();
		$rules       = $ruleManager->getRules( $wp_post->ID );
		$rule        = null;

		// find first include rule
		foreach ( $rules as $rule ) {
			/**
			 * @var Brizy_Admin_Rule $rule ;
			 */
			if ( $rule->getType() == Brizy_Admin_Rule::TYPE_INCLUDE ) {
				break;
			}
		}

		if ( $rule ) {
			switch ( $rule->getAppliedFor() ) {
				case  Brizy_Admin_Rule::POSTS :
					$args = array(
						'post_type' => $rule->getEntityType(),
					);

					$entities = $rule->getEntityValues();

					// if this is an array with more that one items
					if ( count( $rule->getEntityValues() ) > 1 ) {
						$args['post__in'] = $rule->getEntityValues();
					}

					// check if there are complex rules like in category or child of category
					if ( count( $rule->getEntityValues() ) == 1 ) {

						if ( is_numeric( $entities[0] ) ) {
							$args['post__in'] = $rule->getEntityValues();
						} else {
							$parts = explode( '|', $entities[0] );

							if ( count( $parts ) > 1 ) {
								$args[ $parts[1] ] = [ $parts[2] ];
							}
						}
					}

					$args["meta_query"] = array(
						array(
							"key"     => "brizy",
							'compare' => 'NOT EXISTS',
						),
					);

					$array = get_posts( $args );

					return array_pop( $array );
					break;
				case Brizy_Admin_Rule::TAXONOMY :
					$args     = array(
						'taxonomy'   => $rule->getEntityType(),
						'hide_empty' => false,
					);
					$entities = $rule->getEntityValues();
					foreach ( $entities as $val ) {
						if ( is_numeric( $val ) ) {
							$args['term_taxonomy_id'][] = $val;
						} else {
							$parts = explode( '|', $entities[0] );

							if ( count( $parts ) > 1 ) {
								$args['term_taxonomy_id'][] = $parts[2];
							}
						}
					}

					$array = get_terms( $args );

					$term = array_pop( $array );

					$array = get_posts(
						[
							'post_status' => 'publish',
							'tax_query'   => array(
								array(
									'taxonomy' => $term->taxonomy,
									'field'    => 'term_id',
									'terms'    => $term->term_id,
								),
							),
						]
					);

					return array_pop( $array );
					break;
				case  Brizy_Admin_Rule::ARCHIVE :
					return null;
					break;
				case  Brizy_Admin_Rule::TEMPLATE :

					switch ( $rule->getEntityType() ) {
						case 'author':
							$authors = get_users();

							return array_pop( $authors );
							break;
						case '404':
						case 'search':
							return null;
							break;
						case 'home_page':
							$get_option = get_option( 'page_for_posts' );

							if ( $get_option ) {
								return Brizy_Editor_Entity::isBrizyEnabled( $get_option ) ? null : get_post( $get_option );
							}
							break;
						case 'front_page':
							$get_option = get_option( 'page_on_front' );

							if ( $get_option ) {
								return Brizy_Editor_Entity::isBrizyEnabled( $get_option ) ? null : get_post( $get_option );
							}
							break;
					}
					break;
			}
		}
	}

	public function saveTemplateRulesNotices() {

		global $pagenow;

		if ( $pagenow !== 'post.php' || get_post_type() !== Brizy_Admin_Templates::CP_TEMPLATE ) {
			return;
		}

		$post_id = get_the_ID();

		if ( $error = get_transient( "editor_tpl_rule_errors_{$post_id}" ) ) {

			$prefix = ucfirst( Brizy_Editor::prefix() );

			echo '<div class="error"><p>' . $prefix . ': ' . $error . '</p></div>';

			delete_transient( "editor_tpl_rule_errors_{$post_id}" );
		}
	}

	private function obtainRulesFromPostSubmit( $post_id ) {
		if ( $parent_id = wp_is_post_revision( $post_id ) ) {
			$post_id = $parent_id;
		}

		// set template type from $_POST
		$type = null;
		if ( isset( $_POST['brizy-template-type'] ) ) {
			$type = strtolower( $_POST['brizy-template-type'] );
			if ( in_array(
				$type,
				[
					self::TYPE_SINGLE,
					self::TYPE_ARCHIVE,
					self::TYPE_PRODUCT_ARCHIVE,
					self::TYPE_SINGLE_PRODUCT,
				]
			) ) {
				self::setTemplateType( $post_id, $type );
			}
		} else {
			return [];
		}

		// get rules from $_POST
		$rules = [];
		if ( $type && isset( $_POST[ 'brizy-' . $type . '-rule-type' ] ) && is_array( $_POST[ 'brizy-' . $type . '-rule-type' ] ) ) {
			foreach ( $_POST[ 'brizy-' . $type . '-rule-type' ] as $i => $ruleType ) {

				// ignore this rule if type is invalid
				if ( ! in_array(
					(int) $ruleType,
					[
						Brizy_Admin_Rule::TYPE_EXCLUDE,
						Brizy_Admin_Rule::TYPE_INCLUDE,
					]
				) ) {
					continue;
				}

				$values = explode( "|", $_POST[ 'brizy-' . $type . '-rule-group' ][ $i ] );
				list( $appliedFor, $entityType ) = $values;

				// ingnore invalid group value
				if ( ! $appliedFor ) {
					continue;
				}

				$entityValues = [];
				if ( isset( $_POST[ 'brizy-' . $type . '-rule-entity-values' ][ $i ] ) ) {
					$entityValues = (array) $_POST[ 'brizy-' . $type . '-rule-entity-values' ][ $i ];
				}

				$rules[] = new Brizy_Admin_Rule( null, $ruleType, $appliedFor, $entityType, $entityValues );
			}
		}

		return $rules;
	}


	public function validate_template_rules( $post_id, $data ) {
		if ( ! isset( $_REQUEST['brizy-template-type'] ) ) {
			return;
		}

		$rules = $this->obtainRulesFromPostSubmit( $post_id );

		if ( count( $rules ) == 0 ) {
			return;
		}

		try {
			// validate rule
			$ruleValidator = Brizy_Admin_Rules_ValidatorFactory::getValidator( $post_id );

			if ( ! $ruleValidator ) {
				$this->addError( $post_id, esc_html__( 'Unable to get the rule validator for this post type.', 'brizy' ) );
				header( 'Location: ' . get_edit_post_link( $post_id, 'redirect' ) );
				exit;
			}

			$ruleValidator->validateRulesForPostId( $rules, $post_id );
		} catch ( Brizy_Editor_Exceptions_DataVersionMismatch $e ) {
			$this->addError( $post_id, esc_html__( 'Invalid data version.', 'brizy' ) );
			header( 'Location: ' . get_edit_post_link( $post_id, 'redirect' ) );
			exit;
		} catch ( Exception $e ) {
			$this->addError( $post_id, $e->getMessage() );
			header( 'Location: ' . get_edit_post_link( $post_id, 'redirect' ) );
			exit;
		}
	}

	public function saveTemplateRules( $post_id ) {
		try {
			if ( ! isset( $_REQUEST['brizy-template-type'] ) ) {
				return;
			}

			$rules       = $this->obtainRulesFromPostSubmit( $post_id );
			$ruleManager = new Brizy_Admin_Rules_Manager();
			$ruleManager->setRules( $post_id, $rules );
		} catch ( Brizy_Editor_Exceptions_DataVersionMismatch $e ) {
			$this->addError( $post_id, esc_html__( 'Invalid data version.', 'brizy' ) );
		} catch ( Exception $e ) {
			$this->addError( $post_id, $e->getMessage() );
		}
	}

	public function addError( $post_id, $message ) {
		set_transient( "editor_tpl_rule_errors_{$post_id}", $message, 45 );
	}

	/**
	 * @param $id
	 *
	 * @return mixed
	 */
	public static function getTemplateType( $id ) {
		return get_post_meta( $id, self::TEMPLATE_TYPE_KEY, true );
	}

	/**
	 * @param $id
	 * @param $type
	 */
	public static function setTemplateType( $id, $type ) {
		update_post_meta( $id, self::TEMPLATE_TYPE_KEY, $type );
	}

	public function start_the_excerpt( $excerpt ) {
		$this->isExcerpt = true;

		return $excerpt;
	}

	public function end_the_excerpt( $excerpt ) {
		$this->isExcerpt = false;

		return $excerpt;
	}

}




??

??