File "Powerfolio_Portfolio.php"

Full Path: /home/amervokv/ecomlive.net/wp-content/plugins/portfolio-elementor/classes/Powerfolio_Portfolio.php
File size: 24.7 KB
MIME-type: text/x-php
Charset: utf-8

<?php
// Exit if accessed directly
if ( ! defined( 'ABSPATH' ) ) {
	exit;
}

class Powerfolio_Portfolio {
	
	public function __construct() {

		add_action( 'init', array( $this, 'register_portfolio_post_type') , 20 );
		add_action( 'init', array( $this, 'create_portfolio_taxonomies') , 20 );
		add_action( 'init', array( $this, 'register_portfolio_shortcodes') , 20 );
		add_action( 'enqueue_block_editor_assets', array( $this, 'enqueue_scripts') , 20 );		
		
		//Flush rewrite rules
		add_action( 'init', array( __CLASS__, 'flush_rewrite_rules_maybe') , 20 );
	}

	/*
	* Register Elemenfolio/Portfolio Post Type
	*/
	public function register_portfolio_post_type()	{
		$args = array();	

		// Filters
		$portfolio_cpt_slug_rewrite = apply_filters( 'elpt_portfolio_cpt_slug_rewrite', 'portfolio' ); 
		$portfolio_cpt_has_archive = apply_filters( 'elpt_portfolio_cpt_has_archive', false ); 
		$portfolio_cpt_name = apply_filters( 'elpt_portfolio_cpt_name', __( 'Portfolio', 'elemenfolio' ) ); 


		// Portfolio Post Type
		$args['post-type-portfolio'] = array(
			'labels' => array(
				'name' => $portfolio_cpt_name,
				'singular_name' => __( 'Item', 'elemenfolio' ),
				'add_new' => __( 'Add New Item', 'elemenfolio' ),
				'add_new_item' => __( 'Add New Item', 'elemenfolio' ),
				'edit_item' => __( 'Edit Item', 'elemenfolio' ),
				'new_item' => __( 'New Item', 'elemenfolio' ),
				'view_item' => __( 'View Item', 'elemenfolio' ),
				'search_items' => __( 'Search Through portfolio', 'elemenfolio' ),
				'not_found' => __( 'No items found', 'elemenfolio' ),
				'not_found_in_trash' => __( 'No items found in Trash', 'elemenfolio' ),
				'parent_item_colon' => __( 'Parent Item:', 'elemenfolio' ),
				'menu_name' => $portfolio_cpt_name,				
			),		  
			'hierarchical' => false,
	        'description' => __( 'Add a New Item', 'elemenfolio' ),
	        'menu_icon' =>  'dashicons-images-alt',
	        'public' => true,
	        'publicly_queryable' => true,
			'exclude_from_search' => false,
			'has_archive' => $portfolio_cpt_has_archive,
	        'query_var' => true,
			'rewrite' => array( 'slug' => $portfolio_cpt_slug_rewrite ),
			'show_in_rest' => true,
            'supports' => array('title','editor', 'thumbnail')
	        // This is where we add taxonomies to our CPT
        	//'taxonomies'          => array( 'category' ),
		);	

		// Register post type: name, arguments
		register_post_type('elemenfolio', $args['post-type-portfolio']);
	}	

	/*
	* Register Taxonomies
	*/
	public function create_portfolio_taxonomies() {
		// Config
		$elemenfoliocategory_slug_rewrite = apply_filters( 'elpt_elemenfoliocategory_slug_rewrite', 'portfoliocategory' );

		// Add new taxonomy, make it hierarchical (like categories)
		$labels = array(
			'name'              => _x( 'Portfolio Categories', 'taxonomy general name', 'elemenfolio' ),
			'singular_name'     => _x( 'Portfolio Category', 'taxonomy singular name', 'elemenfolio' ),
			'search_items'      => __( 'Search Portfolio Categories', 'elemenfolio' ),
			'all_items'         => __( 'All Portfolio Categories', 'elemenfolio' ),
			'parent_item'       => __( 'Parent Portfolio Category', 'elemenfolio' ),
			'parent_item_colon' => __( 'Parent Portfolio Category:', 'elemenfolio' ),
			'edit_item'         => __( 'Edit Portfolio Category', 'elemenfolio' ),
			'update_item'       => __( 'Update Portfolio Category', 'elemenfolio' ),
			'add_new_item'      => __( 'Add New Portfolio Category', 'elemenfolio' ),
			'new_item_name'     => __( 'New Portfolio Category', 'elemenfolio' ),
			'menu_name'         => __( 'Portfolio Categories', 'elemenfolio' ),
		);
	
		$args = array(
			'hierarchical'      => true,
			'labels'            => $labels,
			'show_ui'           => true,
			'show_admin_column' => true,
			'query_var'         => true,
			'rewrite'           => array( 'slug' => $elemenfoliocategory_slug_rewrite ),
			'show_in_rest' =>true,
		);
	
		register_taxonomy( 'elemenfoliocategory', array( 'elemenfolio' ), $args );
	}	

	/*
	* flush_rewrite_rules_maybe()
	*/
	public static function flush_rewrite_rules_maybe() {
		if ( get_option( 'elpt_flush_rewrite_rules_flag' ) ) {
			flush_rewrite_rules();
			delete_option( 'elpt_flush_rewrite_rules_flag' );
		}
	}

	//Enable Elementor on portfolio post type
	//From https://wordpress.org/support/topic/option-to-enable-by-default-elementor-for-custom-post-type/
	public static function add_cpt_support_for_elementor() {
		
		$cpt_support = get_option( 'elementor_cpt_support' );
		
		//check if option DOESN'T exist in db
		if( ! $cpt_support ) {
			$cpt_support = [ 'page', 'post', 'elemenfolio' ]; //create array of our default supported post types
			update_option( 'elementor_cpt_support', $cpt_support ); //write it to the database
		}
		
		//if it DOES exist, but portfolio is NOT defined
		else if( ! in_array( 'elemenfolio', $cpt_support ) ) {
			$cpt_support[] = 'elemenfolio'; //append to array
			update_option( 'elementor_cpt_support', $cpt_support ); //update database
		}
	}

	/*
	*  Enqueue scripts for shortcode
	*/
	public static function enqueue_scripts() {
		$assets_dir =  plugin_dir_url( __DIR__ );	

		////Isotope			
		wp_enqueue_script( 'jquery-isotope',  $assets_dir. 'vendor/isotope/js/isotope.pkgd.js', array('jquery', 'imagesloaded'), '20151215', true );
		wp_enqueue_script( 'jquery-packery', $assets_dir. 'vendor/isotope/js/packery-mode.pkgd.min.js', array('jquery', 'imagesloaded', 'jquery-isotope'), '20151215', true );

		//Image Lightbox
		if ( apply_filters( 'elpt-enable-simple-lightbox', true ) == true ) {
			wp_enqueue_script( 'simple-lightbox-js',  $assets_dir.  'vendor/simplelightbox/dist/simple-lightbox.min.js', array('jquery'), '20151218', true );
			wp_enqueue_style( 'simple-lightbox-css', $assets_dir .  'vendor/simplelightbox/dist/simplelightbox.min.css' );
			wp_enqueue_script( 'elpt-portfoliojs-lightbox', $assets_dir . 'assets/js/custom-portfolio-lightbox.js', array('jquery'), '20151215', true );
		}
		
		//Custom JS
		wp_enqueue_script( 'elpt-portfoliojs', $assets_dir . 'assets/js/custom-portfolio.js', array('jquery'), '20151215', true );

		//Custom CSS
		wp_enqueue_style( 'elpt-portfolio-css', $assets_dir .  'assets/css/powerfolio_css.css' );
	}

	/*
	* get_widget_settings()
	*/
	public static function get_widget_settings($settings, $widget = 'portfolio') {

		switch ($widget) {
			case 'portfolio':
				
				extract(shortcode_atts(array(
					//"id" => '',
					"postsperpage" => '',
					"pagination" => '',
					"pagination_postsperpage" => '',
					"showfilter" => '',
					"taxonomy" => '',
					"type" => '',
					"style" => '',
					"columns" => '',
					"columns_mobile" => '',			
					"margin" => '',
					"linkto" => '',
					"hover" => '',
					"zoom_effect" => '',
					"post_type" => '',
					"tax_text" => '',
					"showallbtn" => '',		
					"hide_item_title" => '',
					"hide_item_category" => '',	
					"taxonomy" => '',			
					'element_id' => '',
				), $settings));


				// Set Default Values
				if ( $type == "yes"  ) {
					$type = true;
				}

				if ( $post_type == '' ) {
					$post_type = 'elemenfolio';
				}
		
				// Escape and validate the attributes
				$settings = array(
					'postsperpage'       => esc_attr($postsperpage),
					'pagination'       => esc_attr($pagination),
					'pagination_postsperpage' => esc_attr($pagination_postsperpage),
					'showfilter'         => esc_attr($showfilter),
					'taxonomy'           => esc_attr($taxonomy),
					'type'               => esc_attr($type),
					'style'              => esc_attr($style),
					'columns'            => esc_attr($columns),
					'columns_mobile'     => esc_attr($columns_mobile),
					'margin'             => esc_attr($margin),
					'linkto'             => esc_attr($linkto),
					'hover'              => esc_attr($hover),
					'zoom_effect'        => esc_attr($zoom_effect),
					'post_type'          => esc_attr($post_type),
					'tax_text'           => esc_attr($tax_text),
					'showallbtn'         => esc_attr($showallbtn),
					'hide_item_title'    => esc_attr($hide_item_title),
					'hide_item_category' => esc_attr($hide_item_category),
					'element_id' => esc_attr($element_id),
				);
			
				break;

			case 'image_gallery':
				
				$settings = $settings;
				$settings['taxonomy'] = '';
				$settings['post_type'] = '';
				$settings['type'] = '';
				$settings['hide_item_category'] = '';
				$settings['hide_item_title'] = '';				
				$settings['postsperpage'] = 99;
				$settings['linkto'] = 'image';
				$settings['zoom_effect'] = '';
				$settings['columns_mobile'] = '';

			break;			
		}		

		//Element ID		
		if (! array_key_exists('element_id', $settings) || $settings['element_id'] == '') {
			$settings['element_id'] = Powerfolio_Common_Settings::generate_element_id();
		}	

		return $settings;			
	}

	/*
	* Get Items for grid/portfolio
	*/
	public static function get_items_for_grid($settings, $widget) {

		$items = array();

		switch ($widget) {
			case 'portfolio':
				if(! $settings['post_type'] || $settings['post_type'] == '') {
					$settings['post_type'] = 'elemenfolio';
				}	
		
				if ( $settings['type'] == true) {
					$args = array(
						'post_type' => $settings['post_type'],
						'posts_per_page' => $settings['postsperpage'],		
						'suppress_filters' => false,  
						'tax_query' => array(
							array(
								'taxonomy' => 'elemenfoliocategory',
								'field'    => 'id',
								'terms'    => $settings['taxonomy'],
							),
						),		
						//'p' => $id
					); 	
				} else { 
					$args = array(
						'post_type' => $settings['post_type'],
						'posts_per_page' => $settings['postsperpage'],	
						'suppress_filters' => false,  
					);			
				}

				$items = (array)get_posts($args);
			break;

			case 'image_gallery':

				$items = $settings['list'];

			break;		
		}
		
		return (array)$items;
	}

	/*
	* Get Terms filter output
	*/
	public static function get_grid_filter($settings, $widget) {		
		if ($settings['showfilter'] === 'no' || $settings['showfilter'] === false) {
			return ''; 
		}

		$output = '';

		$output .='<div class="elpt-portfolio-filter">';						
		
			//All text filters and variables
			$settings['tax_text'] = apply_filters( 'elpt_tax_text', $settings['tax_text'] );
			$tax_text_filter = apply_filters( 'elpt_tax_text_filter', '*' );
			
			if ($settings['tax_text'] =='') {
				$settings['tax_text'] = __('All', 'elemenfolio');
			}
			
			if ($settings['showallbtn'] !== 'no') {
				if ($settings['type'] == true && is_array($settings['taxonomy']) && count($settings['taxonomy']) > 1 ) {
					$output .='<button class="portfolio-filter-item item-active" data-filter="'.$tax_text_filter.'" style="background-color:' .';">'.$settings['tax_text'].'</button>';
				}
				else if ($settings['type'] !== true) {
					$output .='<button class="portfolio-filter-item item-active" data-filter="'.$tax_text_filter.'" style="background-color:' .';">'.$settings['tax_text'].'</button>';
				} 
			}
			
			switch ($widget) {
				case 'portfolio':

					if ( $settings['post_type'] === 'elemenfolio' || $settings['post_type'] === '' ) {							
						$terms = get_terms( array(
							'taxonomy' => 'elemenfoliocategory',
							'hide_empty' => false,
						) );
			
						$terms = apply_filters( 'elpt_tax_terms_list', $terms );
						
			
						foreach ( $terms as $term ) {
							$thisterm = $term->name;
							$thistermslug = $term->slug;
			
							if ($settings['type'] == true && is_array($settings['taxonomy']) && in_array($term->term_id, $settings['taxonomy']) && count($settings['taxonomy']) > 1 ) {
								$output .='<button class="portfolio-filter-item" style="background-color:' .';" data-filter=".elemenfoliocategory-'.esc_attr($thistermslug).'">'.esc_html($thisterm).'</button>';
							}
							else if ($settings['type'] != true) {
								$output .='<button class="portfolio-filter-item" style="background-color:' .';" data-filter=".elemenfoliocategory-'.esc_attr($thistermslug).'">'.esc_html($thisterm).'</button>';
							}
						}				
					} else {
						return ;
					}

				break;

				// Image Gallery Widget	
				case 'image_gallery':

					//Get all Tags
					$tag_list = array();
					foreach($settings['list'] as $item) {
						$tag_array = $str_arr = explode (",", $item['list_filter_tag']);
						foreach ($tag_array as $tag) {
							if ( ! in_array ($tag, $tag_list ) ){
								$tag_list[] = $tag;
							} 
						}						
					}
					
					//Sort tags in alphabetical order
					sort($tag_list);

					//Filter tag list
					$tag_list = apply_filters( 'elpt_gallery_terms_list', $tag_list );
					
					//List Tags
					foreach($tag_list as $item) {
						$item_slug = elpt_get_text_slug($item);
						$output .='<button class="portfolio-filter-item" style="background-color:' .';" data-filter=".elemenfoliocategory-'.esc_attr($item_slug).'">'.$item.'</button>';
					}
					
				break;
						
			}

			$output .='</div>';	
		
		return (string)$output;
	}
	

	/*
	* get_columns_css_classes()
	*/
	static function get_columns_css_classes($settings) {

		$portfoliocolumns = 'elpt-portfolio-columns-4';
		
		if ($settings['columns'] == '2') {
			$portfoliocolumns = 'elpt-portfolio-columns-2';
		}
		else if ($settings['columns'] == '3') {
			$portfoliocolumns = 'elpt-portfolio-columns-3';
		}
		else if ($settings['columns'] == '5') {
			$portfoliocolumns = 'elpt-portfolio-columns-5';
		}
		else if ($settings['columns'] == '6') {
			$portfoliocolumns = 'elpt-portfolio-columns-6';
		}

		return $portfoliocolumns;
	}

	/*
	* get_columns_class_for_mobile()
	*/
	static function get_columns_class_for_mobile($settings) {

		$portfoliocolumns_mobile = '';

		if ( array_key_exists('columns_mobile', $settings) ) {

			if ( $settings['columns_mobile'] == '2') {
				$portfoliocolumns_mobile = 'elpt-portfolio-columns-mobile-2';
			}
			else if ( $settings['columns_mobile'] == '3') {
				$portfoliocolumns_mobile = 'elpt-portfolio-columns-mobile-3';
			}
		}

		return $portfoliocolumns_mobile;
	}

	/*
	* get_margin_css_class()
	*/
	static function get_margin_css_class($settings) {
		$portfolio_margin_css_class = '';

		if ( $settings['margin'] === 'yes' || $settings['margin'] === true || $settings['margin'] === 'true' ) {
			$portfolio_margin_css_class = 'elpt-portfolio-margin';
		}

		return $portfolio_margin_css_class;
	}


	/*
	* get_portfolio_styles()
	*/
	static function get_portfolio_styles($settings) {
		$styles = array();

		$styles['portfoliostyle'] = '';
		$styles['portfolio_isotope'] = 'elpt-portfolio-content-isotope';

		if ( isset($settings['pagination'] ) && $settings['pagination'] == 'true' ) {
			$styles['portfolio_isotope'] = 'elpt-portfolio-content-isotope-pro';
		}
		
		if ($settings['style'] == 'masonry' ) {
			$styles['portfoliostyle'] = 'elpt-portfolio-style-masonry';
		}
		else if ($settings['style'] == 'specialgrid1' ) {
			$styles['portfoliostyle'] = 'elpt-portfolio-special-grid-1';
		}
		else if ($settings['style'] == 'specialgrid2' ) {
			$styles['portfoliostyle'] = 'elpt-portfolio-special-grid-2';
		}
		else if ($settings['style'] == 'specialgrid3' ) {
			$styles['portfoliostyle'] = 'elpt-portfolio-special-grid-3';
		}
		else if ($settings['style'] == 'specialgrid4' ) {
			$styles['portfoliostyle'] = 'elpt-portfolio-special-grid-4';
		}
		else if ($settings['style'] == 'specialgrid5' ) {
			$styles['portfoliostyle'] = 'elpt-portfolio-special-grid-5';
		}	
		else if ($settings['style'] == 'specialgrid6' ) {
			$styles['portfoliostyle'] = 'elpt-portfolio-special-grid-6';
		}	
		else if ($settings['style'] == 'purchasedgrid' ) {
			$styles['portfoliostyle'] = apply_filters( 'powerfolio_custom_style_class_filter', 'elpt-portfolio-purchased-grid');
			$styles['portfolio_isotope'] = apply_filters( 'powerfolio_custom_isotope_class_filter', 'elpt-portfolio-content-isotope');
			$styles['portfoliocolumns'] = apply_filters( 'powerfolio_custom_cols_class_filter', 'elpt-portfolio-columns-3');
		}	
		else if ($settings['style'] == 'grid_builder' ) {
			$styles['portfoliostyle'] = 'elpt-portfolio-grid-builder';
			$styles['portfolio_isotope'] = 'elpt-portfolio-content-packery';
		}					
		else {
			$styles['portfoliostyle'] = 'elpt-portfolio-style-box';
		}
	
		return $styles;
	}

	/*
	* get_portfolio_link_data()
	*/
	public static function get_portfolio_link_data($post, $settings, $widget, $portfolio_image) {
        		
        $portfolio_link_target = '';
        $portfolio_link_rel = '';
        $portfolio_link_class = '';
        $portfolio_link_follow = '';
		$portfolio_link = '';

		$rel_id = Powerfolio_Common_Settings::generate_element_id(); 
		
		if ( array_key_exists('element_id', $settings) ) {
			$rel_id = $settings['element_id'];
		}		
		
		if ( $widget == 'portfolio' ) {
			$portfolio_link = get_the_permalink($post['ID']);
		}

        if ($settings['linkto'] == 'image') {
            $portfolio_link = $portfolio_image;
            $portfolio_link_class = 'elpt-portfolio-lightbox';
            $portfolio_link_rel = 'rel=elpt-portfolio_' . $rel_id;
        } 
		else if ($settings['linkto'] == 'image_elementor') {
            $portfolio_link = $portfolio_image;
            $portfolio_link_class = 'elpt-portfolio-elementor-lightbox';
            $portfolio_link_rel = 'rel="elpt-portfolio_' . $rel_id . '"';
        } 
		else if ($settings['linkto'] == 'link' && array_key_exists('list_external_link', $post)) {
            $portfolio_link = $post['list_external_link']['url'];
            if ($post['list_external_link']['is_external'] == true) {
                $portfolio_link_target = 'target="_blank"';
            }
            if ($post['list_external_link']['nofollow'] == true) {
                $portfolio_link_follow = 'rel="nofollow"';
            }
        }

        return [
            'link' => $portfolio_link,
            'target' => $portfolio_link_target,
            'rel' => $portfolio_link_rel,
            'class' => $portfolio_link_class,
            'follow' => $portfolio_link_follow,
        ];
    }

	/*
	* get_portfolio_terms()
	*/
	public static function get_portfolio_terms($post, $widget) {
        $term_names = [];

        if ($widget == 'portfolio') {
            $terms = get_the_terms($post['ID'], 'elemenfoliocategory');
            if (is_array($terms) || is_object($terms)) {
                foreach ($terms as $term) {
                    $term_names[] = $term->name;
                }
            }
        } else if ($widget == 'image_gallery') {
            $tag_array = explode(",", $post['list_filter_tag']);
            foreach ($tag_array as $tag) {
                $term_names[] = $tag;
            }
        }

        return $term_names;
    }

	/*
	* get_single_item_data()
	*/
	static function get_single_item_data($post, $settings, $widget) {
		$data = array();			
	
		switch ($widget) {
			case 'portfolio':
				$data['post_id'] = $post['ID'];
				$data['post_title'] = get_the_title($data['post_id'] );
				$data['portfolio_image'] = Powerfolio_Common_Settings::get_image_url( get_post_thumbnail_id($data['post_id'] ) );
		
				if (is_array($data['portfolio_image'])) {
					$data['portfolio_image'] = $data['portfolio_image'][0];
				}
		
				$data['classes'] = get_post_class($data['post_id']);

				if ( $settings['post_type'] == 'elemenfolio' ) {
					$terms = get_the_terms($data['post_id'], 'elemenfoliocategory');
					if ( is_array( $terms ) ) {
						foreach ($terms as $term) {
							if (!in_array('elemenfoliocategory-' . $term->slug, $data['classes'])) {
								$data['classes'][] = 'elemenfoliocategory-' . $term->slug;
							}
						}	
					}									
				}
				
				$data['classes'] = join(' ', $data['classes']);

			break;

			case 'image_gallery':
				if ( array_key_exists('list_description', $post) ) {
					$data['list_description'] = $post['list_description'];
				}			

				$data['post_title'] = $post['list_title'];

				$data['portfolio_image'] = $post['list_image']['url'];

				$tag_array = explode(",", $post['list_filter_tag']);

				$data['classes'] = '';

				foreach ($tag_array as $tag) {
					$data['classes'] .= ' elemenfoliocategory-' . elpt_get_text_slug($tag);
				}
			
			break;
		}

		// Terms
		$data['term_names'] = self::get_portfolio_terms($post, $widget);
		// Link Data
		$data['link_data'] = self::get_portfolio_link_data($post, $settings, $widget, $data['portfolio_image']);
	
		return $data;
	}
	

	/*
	* Get settings for shortcode
	*/
	public static function get_shortcode_settings($settings, $widget) {
		// Get widget settings
		$settings = self::get_widget_settings($settings, $widget);
		$settings['taxonomy'] = explode(",", $settings['taxonomy']);
	
		// Columns
		$settings['portfoliocolumns'] = self::get_columns_css_classes($settings);
	
		// Columns Mobile
		$settings['portfoliocolumns_mobile'] = self::get_columns_class_for_mobile($settings);
	
		// Margin
		$settings['portfoliomargin'] = self::get_margin_css_class($settings);
	
		// Styles
		$styles = self::get_portfolio_styles($settings);
		$settings['portfoliostyle'] = $styles['portfoliostyle'];
	
		if (!empty($styles['portfolio_isotope'])) {
			$settings['portfolio_isotope'] = $styles['portfolio_isotope'];
		}
		if (!empty($styles['portfoliocolumns'])) {
			$settings['portfoliocolumns'] = $styles['portfoliocolumns'];
		}
	
		return $settings;
	}


	/*
	* Get single item Output
	*/
	static function get_single_item_output($post, $settings, $widget) {

		// Get data for single item
		$data = self::get_single_item_data($post, $settings, $widget);

		$output = '';
	
		$output .= '<div class="portfolio-item-wrapper ' . $data['classes'] . '">';
			$output .= '<a href="' . esc_url($data['link_data']['link']) . '" class="portfolio-item ' . esc_attr($data['link_data']['class']) . '" ' . esc_attr($data['link_data']['rel']) . ' style="background-image: url(' . esc_url($data['portfolio_image']) . ')" title="' . $data['post_title'] . '" ' . $data['link_data']['target'] . ' ' . $data['link_data']['follow'] . '">';
		
				$output .= '<img src="' . esc_url($data['portfolio_image']) . '" title="' . $data['post_title'] . '" alt="' . $data['post_title'] . '"/>';
				$output .= '<div class="portfolio-item-infos-wrapper" style="background-color:' . ';"><div class="portfolio-item-infos">';
			
					// Title
					if ($settings['hide_item_title'] != 'yes') {
						$output .= '<div class="portfolio-item-title"><span class="portfolio-item-title-span">' . $data['post_title'] . '</span></div>';
					}
				
					// Description
					if (array_key_exists('list_description', $data) && $data['list_description'] != '') {
						$output .= '<div class="portfolio-item-desc">' . $data['list_description'] . '</div>';
					}
				
					// Categories / Tags
					if ($settings['hide_item_category'] != 'yes') {
						$output .= '<div class="portfolio-item-category">';

						foreach ($data['term_names'] as $term_name) {
							$output .= '<span class="elpt-portfolio-cat">' . esc_html($term_name) . '</span>';
						}

						$output .= '</div>';
					}
			
				$output .= '</div></div>';
			$output .= '</a>';
		$output .= '</div>';
	
		return $output;
	}	


	/*
	* Create shortcode and returns the output
	*/
	public static function get_portfolio_shortcode_output($settings, $content = null, $shortcode = null, $widget="portfolio") {
		
		// enqueue scripts for shortcode
		if (! is_null($shortcode) ) {
			self::enqueue_scripts();
		}		
	
		// Get settings
		$settings = self::get_shortcode_settings($settings, $widget);

		if ( isset($settings['pagination'] ) && $settings['pagination'] == 'true' )  {

			$data_to_send = array(
				'itemsPerPageDefault' => $settings['pagination_postsperpage'],
			);
			$data_to_send = json_encode($data_to_send);
			wp_add_inline_script( 'elpt-portfoliojs', 'const gridSettings = ' . $data_to_send, 'before' );
		}
	
		// Get widget items
		$portfolio_items = self::get_items_for_grid($settings, $widget);

		// Workarounds
		// To-do: Fix missing array keys error
		if (! array_key_exists('zoom_effect', $settings) ) {
			$settings['zoom_effect'] = '';
		}
		if (! array_key_exists('portfolio_isotope', $settings) ) {
			$settings['portfolio_isotope'] = '';
		}
	
		if (count($portfolio_items)) {
			$output = '';
	
			$output .= '<div class="elpt-portfolio '.$settings['element_id'].'">';
	
				//Filter
				$output .= self::get_grid_filter($settings, $widget);
		
				$output .= '<div class="elpt-portfolio-content ' . $settings['portfolio_isotope'] . ' ' . $settings['portfoliostyle'] . ' ' . $settings['zoom_effect'] . ' ' . $settings['hover'] . ' ' . $settings['portfoliocolumns'] . ' ' . $settings['portfoliocolumns_mobile'] . ' ' . $settings['portfoliomargin'] . '">';
		
				foreach ($portfolio_items as $post) {
					$output .= self::get_single_item_output((array)$post, $settings, $widget);
				}
		
				$output .= '</div>';
	
			$output .= '</div>';
	
			return wp_kses_post($output);			
		}
	}

	//Register the shortcode shortcode
	public function register_portfolio_shortcodes() {	
	  add_shortcode("powerfolio", array( __CLASS__, 'get_portfolio_shortcode_output') );
      add_shortcode("elemenfolio", array( __CLASS__, 'get_portfolio_shortcode_output') );
	}	
}

// Start Powerfolio_Portfolio
add_action( 'init', function(){
	new Powerfolio_Portfolio(); 
});