/home/crealab/pueblito.brainware.com.co/wp-content/plugins/jetgridbuilder/includes/plugin.php
<?php
namespace Posts_Grid_Builder;

use Jet_Engine_CX_Loader;

/**
 * Main file
 */
class Plugin {

	/**
	 * Instance.
	 *
	 * Holds the plugin instance.
	 *
	 * @since 1.0.0
	 * @access public
	 * @static
	 *
	 * @var Plugin
	 */
	public static $instance = null;

	/**
	 * Plugin components
	 */
	public $api;
	public $assets;
	public $elementor;
	public $gutenberg;

	/**
	 * Plugin constructor.
	 */
	private function __construct() {

		// Initialize plugin components
		add_action( 'after_setup_theme', array( $this, 'init_components' ), 0 );
		// Internationalize the text strings used.
		add_action( 'init', array( $this, 'lang' ), -999 );

	}

	/**
	 * Instance.
	 *
	 * Ensures only one instance of the plugin class is loaded or can be loaded.
	 *
	 * @since 1.0.0
	 * @access public
	 * @static
	 *
	 * @return Plugin An instance of the class.
	 */
	public static function instance() {

		if ( is_null( self::$instance ) ) {

			self::$instance = new self();

			/**
			 * Plugin loaded
			 *
			 * @since 1.0.0
			 */
			do_action( 'posts-grid-builder/loaded' );

		}

		return self::$instance;

	}

	/**
	 * Initialize plugin parts
	 *
	 * @return void
	 */
	public function init_components() {

		spl_autoload_register( array( $this, 'autoloader' ) );

		do_action( 'posts-grid-builder/before-init' );

		$this->api       = new Api();
		$this->assets    = new Assets();
		$this->elementor = new Elementor_Manager();
		$this->gutenberg = new Gutenberg_Manager();

		do_action( 'posts-grid-builder/init' );

	}

	/**
	 * Loads the translation files.
	 *
	 * @since 1.0.0
	 * @access public
	 * @return void
	 */
	public function lang() {

		load_plugin_textdomain( 'jet-grid-builder', false, JET_GRID_BUILDER_PATH . 'languages' );

	}

	/**
	 * Assets file
	 *
	 * @param  [type] $file [description]
	 * @return [type]       [description]
	 */
	public function assets_url( $file = '' ) {

		return JET_GRID_BUILDER_URL . 'assets/' . $file;

	}

	/**
	 * Return template path
	 *
	 * @param  [type] $file [description]
	 * @return [type]       [description]
	 */
	public function plugin_path( $file = '' ) {

		return JET_GRID_BUILDER_PATH . $file;

	}

	/**
	 * Get the template path.
	 *
	 * @return string
	 */
	public function template_path() {

		return apply_filters( 'posts-grid-builder/template-path', 'posts-grid-builder/' );

	}

	/**
	 * Check if theme has elementor
	 *
	 * @return boolean
	 */
	public function has_elementor() {

		return defined( 'ELEMENTOR_VERSION' );

	}

	/**
	 * Returns path to widgets common controls.
	 *
	 * @return string|bool
	 */
	public function get_controls( $name = null ) {

		$controls = $this->plugin_path( 'includes/widgets/controls/' . $name );

		if ( file_exists( $controls ) ) {
			return $controls;
		} else {
			return false;
		}

	}

	/**
	 * Returns path to template file.
	 *
	 * @return string|bool
	 */
	public function get_template( $name = null ) {

		$template = locate_template( $this->template_path() . $name );

		if ( ! $template ) {
			$template = $this->plugin_path( 'templates/' . $name );
		}

		if ( file_exists( $template ) ) {
			return $template;
		} else {
			return false;
		}

	}

	/**
	 * Get post types options list
	 *
	 * @return array
	 */
	public function get_post_types() {

		$post_types = get_post_types( array( 'public' => true ), 'objects' );

		$exclude = apply_filters( 'posts-grid-builder/post-types/exclude', array(
			'attachment',
			'elementor_library'
		) );

		$result = array();

		if ( empty( $post_types ) ) {
			return $result;
		}

		foreach ( $post_types as $slug => $post_type ) {
			if ( in_array( $slug, $exclude ) ) {
				continue;
			}
			$result[ $slug ] = $post_type->label;
		}

		return $result;

	}

	/**
	 * Get all terms options list
	 *
	 * @return array
	 */
	public function get_all_terms() {

		$terms = get_terms();

		$exclude = apply_filters( 'posts-grid-builder/all-terms/exclude', array(
			'main-menu'
		) );

		$result = array();

		if ( empty( $terms ) ) {
			return $result;
		}
		
		foreach ( $terms as $term ) {
			if ( in_array( $term->slug, $exclude ) ) {
				continue;
			}
			$result[ $term->slug ] = $term->name;
		}

		$result = array( 'all' => esc_html__( 'All', 'jet-grid-builder' ) ) + $result;

		return $result;

	}

	/**
	 * Return registered image sizes list
	 *
	 * @return [type] [description]
	 */
	public function get_img_sizes() {

		global $_wp_additional_image_sizes;

		$sizes  = get_intermediate_image_sizes();
		$result = array();

		foreach ( $sizes as $size ) {
			if ( in_array( $size, array( 'thumbnail', 'medium', 'medium_large', 'large' ) ) ) {
				$result[ $size ] = ucwords( trim( str_replace( array( '-', '_' ), array( ' ', ' ' ), $size ) ) );
			} else {
				$result[ $size ] = sprintf(
					'%1$s (%2$sx%3$s)',
					ucwords( trim( str_replace( array( '-', '_' ), array( ' ', ' ' ), $size ) ) ),
					$_wp_additional_image_sizes[ $size ]['width'],
					$_wp_additional_image_sizes[ $size ]['height']
				);
			}
		}

		return array_merge( array( 'full' => esc_html__( 'Full', 'jet-grid-builder' ), ), $result );

	}

	/**
	 * Return Thumbnail Data
	 */
	public function get_thumbnail_data( $thumb_id, $thumbnail_size = false ) {

		if ( ! $thumb_id )
			return array();

		$img_meta = wp_get_attachment_metadata( $thumb_id );
		if ( empty( $img_meta['sizes'] ) )
			return array();

		$result = array();
		$upload_dir = trailingslashit( UPLOAD_BASE_URL );
		$upload_folder = dirname($img_meta['file']);
		$upload_folder = $upload_folder !== '.' ? trailingslashit( $upload_folder ) : '';

		$result[ 'full' ] = array(
			'file'   => $upload_dir . $img_meta['file'],
			'width'  => $img_meta['width'],
			'height' => $img_meta['height']
		);

		foreach ( $img_meta['sizes'] as $size => $data ) {
			$result[ $size ] = array(
				'file'   => $upload_dir . $upload_folder . $data['file'],
				'width'  => $data['width'],
				'height' => $data['height']
			);
		}

		if ( $thumbnail_size ) 
			return isset( $result[$thumbnail_size] ) ? $result[$thumbnail_size] : $result['full'];

		return $result;

	}

	public function get_items_type_options() {

		$items_type_options = [
			'default'      => esc_html__( 'Default', 'jet-grid-builder' ),
			'post_content' => esc_html__( 'Post Content', 'jet-grid-builder' ),
		];

		if ( class_exists( 'Jet_Engine' ) ) {
			$items_type_options['jetengine_listing'] = esc_html__( 'JetEngine Listing', 'jet-grid-builder' );
		}

		return $items_type_options;

	}

	public function get_woo_items_type_options() {

		$woo_items_type_options = [
			'default'      => esc_html__( 'Default', 'jet-grid-builder' )
		];

		if ( class_exists( 'Jet_Woo_Builder' ) ) {
			$woo_items_type_options['jet_woo_builder_archive'] = esc_html__( 'JetWooBuilder Archive', 'jet-grid-builder' );
		}

		return $woo_items_type_options;

	}

	public function get_jet_engine_listings_options() {

		$listings = jet_engine()->listings->get_listings();
		$list = wp_list_pluck( $listings, 'post_title', 'ID' );

		return $list;

	}

	public function get_jet_woo_builder_archive_options() {

		$listings = jet_woo_builder_post_type()->get_templates_list( 'archive' );
		$list = wp_list_pluck( $listings, 'post_title', 'ID' );

		return $list;

	}

	public function include_item_template_by_type( $type = 'default', $style = 'default' ) {

		switch ( $type ) {
			case 'post_content':
				// post content item template
				include $this->get_template( 'items/post-content-item.php' );

				break;

			case 'jetengine_listing':
				// jetengine listing item template
				include $this->get_template( 'items/jetengine-listing-item.php' );

				break;

			case 'jet_woo_builder_archive':
				// jetengine listing item template
				include $this->get_template( 'items/jet_woo_builder-item.php' );

				break;
			
			default:

				if ( in_array( $style, [ 'content-overlay', 'default', 'term' ] ) ) {
					// default item template
					include $this->get_template( 'items/item-' . $style . '.php' );
				}

				break;

		}

	}

	public function include_woo_item_template_by_type( $woo_type = 'default', $woo_style = 'default' ) {

		if ( ! class_exists( 'WooCommerce' ) ) {
			return;
		}

		switch ( $woo_type ) {
			case 'jet_woo_builder_archive':
				// jet woo builder item template
				include $this->get_template( 'items/woocommerce-item-jet-woo-builder.php' );

				break;

			default:
				if ( in_array( $woo_style, [ 'content-overlay', 'default', 'jet-woo-builder' ] ) ) {
					// default woo item template
					include $this->get_template( 'items/woocommerce-item-' . $woo_style . '.php' );
				}

				break;
		}

	}

	/**
	 * Print inline CSS for a post built with elementor
	 */
	public function print_elementor_post_inline_css( $post_id ) {

		$css_file = \Elementor\Core\Files\CSS\Post::create( $post_id );
		$css      = $css_file->get_content();

		if ( ! empty( $css ) ) {
			$css_file->print_css();
		}

	}

	public function get_grid_builder_settings( $settings ) {

		$result   = array();

		// grid settings
		$result['posts']                               = isset( $settings['posts'] ) ? $settings['posts'] : '';
		$result['layout_data']                         = isset( $settings['layout_data'] ) ? $settings['layout_data'] : '';
		$result['layout_data_tablet']                  = isset( $settings['layout_data_tablet'] ) ? $settings['layout_data_tablet'] : '';
		$result['layout_data_mobile']                  = isset( $settings['layout_data_mobile'] ) ? $settings['layout_data_mobile'] : '';
		$result['colNum']                              = isset( $settings['colNum'] ) ? $settings['colNum'] : 24;
		$result['gutter']                              = isset( $settings['gutter'] ) ? $settings['gutter'] : 10;
		$result['gutter_tablet']                       = isset( $settings['gutter_tablet'] ) ? $settings['gutter_tablet'] : '';
		$result['gutter_mobile']                       = isset( $settings['gutter_mobile'] ) ? $settings['gutter_mobile'] : '';
		$result['vertical_compact']                    = isset( $settings['vertical_compact'] ) ? $settings['vertical_compact'] : false;
		$result['items_type']                          = isset( $settings['items_type'] ) ? $settings['items_type'] : 'default';
		$result['woo_items_type']                      = isset( $settings['woo_items_type'] ) ? $settings['woo_items_type'] : 'default';
		$result['jetengine_listing_id']                = isset( $settings['jetengine_listing_id'] ) && 'jetengine_listing' === $settings['items_type'] ? absint( $settings['jetengine_listing_id'] ) : false;
		$result['jet_woo_builder_archive_id']          = isset( $settings['jet_woo_builder_archive_id'] ) && 'jet_woo_builder_archive' === $settings['woo_items_type'] ? absint( $settings['jet_woo_builder_archive_id'] ) : false;
		$result['loading_spinner']                     = isset( $settings['loading_spinner'] ) ? $settings['loading_spinner'] : true;
		$result['loading_spinner_media']               = isset( $settings['loading_spinner_media'] ) ? $settings['loading_spinner_media'] : '';

		// item settings
		$result['item_style']                          = isset( $settings['item_style'] ) ? $settings['item_style'] : 'default';
		$result['item_thumbnail']                      = isset( $settings['item_thumbnail'] ) ? $settings['item_thumbnail'] : true;
		$result['item_thumbnail_size']                 = isset( $settings['item_thumbnail_size'] ) ? $settings['item_thumbnail_size'] : 'large';
		$result['item_post_type']                      = isset( $settings['item_post_type'] ) ? $settings['item_post_type'] : true;
		$result['item_title']                          = isset( $settings['item_title'] ) ? $settings['item_title'] : true;
		$result['item_description']                    = isset( $settings['item_description'] ) ? $settings['item_description'] : true;
		$result['item_description_words_count']        = isset( $settings['item_description_words_count'] ) ? $settings['item_description_words_count'] : 15;
		$result['item_description_words_count_tablet'] = isset( $settings['item_description_words_count_tablet'] ) ? $settings['item_description_words_count_tablet'] : 15;
		$result['item_description_words_count_mobile'] = isset( $settings['item_description_words_count_mobile'] ) ? $settings['item_description_words_count_mobile'] : 15;
		$result['item_post_author']                    = isset( $settings['item_post_author'] ) ? $settings['item_post_author'] : true;
		$result['item_post_author_prefix']             = isset( $settings['item_post_author_prefix'] ) ? $settings['item_post_author_prefix'] : '';
		$result['item_post_date']                      = isset( $settings['item_post_date'] ) ? $settings['item_post_date'] : true;
		$result['item_post_date_prefix']               = isset( $settings['item_post_date_prefix'] ) ? $settings['item_post_date_prefix'] : '';
		$result['item_post_date_format']               = isset( $settings['item_post_date_format'] ) ? $settings['item_post_date_format'] : 'F, j';
		$result['item_divider']                        = isset( $settings['item_divider'] ) ? $settings['item_divider'] : true;

		// Woocommerce product settings
		$result['woocommerce_item_clickable']          = isset( $settings['woocommerce_item_clickable'] ) ? $settings['woocommerce_item_clickable'] : false;
		$result['woocommerce_item_stars_rating']       = isset( $settings['woocommerce_item_stars_rating'] ) ? $settings['woocommerce_item_stars_rating'] : true;
		$result['woocommerce_item_categories']         = isset( $settings['woocommerce_item_categories'] ) ? $settings['woocommerce_item_categories'] : true;
		$result['woocommerce_item_price']              = isset( $settings['woocommerce_item_price'] ) ? $settings['woocommerce_item_price'] : true;
		$result['woocommerce_item_add_to_cart']        = isset( $settings['woocommerce_item_add_to_cart'] ) ? $settings['woocommerce_item_add_to_cart'] : true;
		$result['woocommerce_item_add_to_cart_text']   = isset( $settings['woocommerce_item_add_to_cart_text'] ) ? wp_kses_post( $settings['woocommerce_item_add_to_cart_text'] ) : 'Add to cart';

		$result = apply_filters( 'posts-grid-builder/data-settings', $result );

		return json_encode( $result );

	}

	public function get_grid_builder_terms_settings( $settings ) {

		$result   = array();

		// grid settings
		$result['terms']                               = isset( $settings['terms'] ) ? $settings['terms'] : '';
		$result['layout_data']                         = isset( $settings['layout_data'] ) ? $settings['layout_data'] : '';
		$result['layout_data_tablet']                  = isset( $settings['layout_data_tablet'] ) ? $settings['layout_data_tablet'] : '';
		$result['layout_data_mobile']                  = isset( $settings['layout_data_mobile'] ) ? $settings['layout_data_mobile'] : '';
		$result['colNum']                              = isset( $settings['colNum'] ) ? $settings['colNum'] : 24;
		$result['gutter']                              = isset( $settings['gutter'] ) ? $settings['gutter'] : 10;
		$result['gutter_tablet']                       = isset( $settings['gutter_tablet'] ) ? $settings['gutter_tablet'] : '';
		$result['gutter_mobile']                       = isset( $settings['gutter_mobile'] ) ? $settings['gutter_mobile'] : '';
		$result['vertical_compact']                    = isset( $settings['vertical_compact'] ) ? $settings['vertical_compact'] : false;
		$result['items_type']                          = isset( $settings['items_type'] ) ? $settings['items_type'] : 'default';
		$result['jetengine_listing_id']                = isset( $settings['jetengine_listing_id'] ) && 'jetengine_listing' === $settings['items_type'] ? esc_attr( $settings['jetengine_listing_id'] ) : false;
		$result['loading_spinner']                     = isset( $settings['loading_spinner'] ) ? $settings['loading_spinner'] : true;
		$result['loading_spinner_media']               = isset( $settings['loading_spinner_media'] ) ? $settings['loading_spinner_media'] : '';

		// item settings
		$result['item_thumbnail']                      = isset( $settings['item_thumbnail'] ) ? $settings['item_thumbnail'] : true;
		$result['item_thumbnail_size']                 = isset( $settings['item_thumbnail_size'] ) ? $settings['item_thumbnail_size'] : 'large';
		$result['item_term_taxonomy']                  = isset( $settings['item_term_taxonomy'] ) ? $settings['item_term_taxonomy'] : true;
		$result['item_title']                          = isset( $settings['item_title'] ) ? $settings['item_title'] : true;
		$result['item_description']                    = isset( $settings['item_description'] ) ? $settings['item_description'] : true;
		$result['item_description_words_count']        = isset( $settings['item_description_words_count'] ) ? $settings['item_description_words_count'] : 15;
		$result['item_description_words_count_tablet'] = isset( $settings['item_description_words_count_tablet'] ) ? $settings['item_description_words_count_tablet'] : 15;
		$result['item_description_words_count_mobile'] = isset( $settings['item_description_words_count_mobile'] ) ? $settings['item_description_words_count_mobile'] : 15;
		$result['item_post_count']                     = isset( $settings['item_post_count'] ) ? $settings['item_post_count'] : true;
		$result['item_posts_count_prefix']             = isset( $settings['item_posts_count_prefix'] ) ? $settings['item_posts_count_prefix'] : '';
		$result['item_divider']                        = isset( $settings['item_divider'] ) ? $settings['item_divider'] : true;

		$result = apply_filters( 'terms-grid-builder/data-settings', $result );

		return json_encode( $result );

	}

	/**
	 * Register autoloader.
	 */
	private function autoloader( $class ) {

		if ( false === strpos( $class, 'Posts_Grid_Builder' ) ) {
			return;
		}

		$class = str_replace( '\\', DIRECTORY_SEPARATOR, $class );
		$class = str_replace( 'Posts_Grid_Builder', 'includes', $class );
		$class = str_replace( '_', '-', $class );
		$class = strtolower( $class );

		$file = JET_GRID_BUILDER_PATH . DIRECTORY_SEPARATOR . $class . '.php';

		if ( file_exists( $file ) ) {
			require $file;
		}

	}

}

Plugin::instance();