File: /home/gerold/public_html/wp-content/plugins/essential-grid/includes/navigation.class.php
<?php
/**
* @package Essential_Grid
* @author ThemePunch <info@themepunch.com>
* @link http://www.themepunch.com/essential/
* @copyright 2020 ThemePunch
*/
if( !defined( 'ABSPATH') ) exit();
class Essential_Grid_Navigation {
private $grid_id = 0;
private $filter = array();
private $filter_show = true;
private $filter_type = 'singlefilters';
private $filter_start_select = array();
private $sorting = array();
private $sorting_start = 'none';
private $layout = array('top-1' => array(), 'top-2' => array(), 'left' => array(), 'right' => array(), 'bottom-1' => array(), 'bottom-2' => array());
private $specific_styles = array(
'top-1' => array('margin-bottom' => 0, 'text-align' => 'center'),
'top-2' => array('margin-bottom' => 0, 'text-align' => 'center'),
'left' => array('margin-left' => 0),
'right' => array('margin-right' => 0),
'bottom-1' => array('margin-top' => 0, 'text-align' => 'center'),
'bottom-2' => array('margin-top' => 0, 'text-align' => 'center'));
private $filter_settings = array('filter' => array('filter-grouping' => 'false', 'filter-listing' => 'list', 'filter-selected' => array()));
private $styles = array();
private $filter_all_text = array();
private $filterall_visible = array();
private $filter_dropdown_text = array();
private $filter_show_count = array();
private $spacing = false;
private $sort_by_text;
private $search_text;
private $special_class = '';
private $search_found = false;
private $filter_added = false;
public function __construct($grid_id = 0) {
$this->grid_id = $grid_id;
$this->filter_all_text['filter'] = __('Filter - All', EG_TEXTDOMAIN);
$this->filterall_visible['filter'] = 'on';
$this->filter_dropdown_text['filter'] = __('Filter Categories', EG_TEXTDOMAIN);
$this->filter_show_count['filter'] = 'off';
$this->sort_by_text = __('Sort By ', EG_TEXTDOMAIN);
$this->search_text = __('Search...', EG_TEXTDOMAIN);
self::get_essential_navigation_skins();
}
/**
* Return all Navigation skins
*/
public static function get_essential_navigation_skins(){
global $wpdb;
$table_name = $wpdb->prefix . Essential_Grid::TABLE_NAVIGATION_SKINS;
$navigation_skins = $wpdb->get_results("SELECT * FROM $table_name", ARRAY_A);
if($navigation_skins == false){ //empty, insert defaults again
self::propagate_default_navigation_skins();
$navigation_skins = $wpdb->get_results("SELECT * FROM $table_name", ARRAY_A);
}
return apply_filters('essgrid_get_navigation_skins', $navigation_skins);
}
/**
* Get Navigation Skin by ID from Database
*/
public static function get_essential_navigation_skin_by_id($id = 0){
global $wpdb;
$id = intval($id);
if($id == 0) return false;
$table_name = $wpdb->prefix . Essential_Grid::TABLE_NAVIGATION_SKINS;
$skin = $wpdb->get_row($wpdb->prepare("SELECT * FROM $table_name WHERE id = %d", $id), ARRAY_A);
if(!empty($skin)){
$skin['css'] = Essential_Grid_Base::stripslashes_deep($skin['css']);
}
return apply_filters('essgrid_get_navigation_skin_by_id', $skin, $id);
}
/**
* Get Navigation Skin by ID from Database
*/
public static function get_essential_navigation_skin_by_handle($handle = ''){
global $wpdb;
if($handle == '') return false;
$table_name = $wpdb->prefix . Essential_Grid::TABLE_NAVIGATION_SKINS;
$skin = $wpdb->get_row($wpdb->prepare("SELECT * FROM $table_name WHERE handle = %s", $handle), ARRAY_A);
if(!empty($skin)){
$skin['css'] = Essential_Grid_Base::stripslashes_deep($skin['css']);
}
return apply_filters('essgrid_get_navigation_skin_by_handle', $skin, $handle);
}
/**
* All default Item Skins
*/
public static function get_default_navigation_skins(){
$default = array();
include('assets/default-navigation-skins.php');
$default = apply_filters('essgrid_add_default_nav_skins', $default);
return $default;
}
public static function propagate_default_navigation_skins($networkwide = false){
$skins = self::get_default_navigation_skins();
if(function_exists('is_multisite') && is_multisite() && $networkwide){ //do for each existing site
global $wpdb;
// 2.2.5
// $old_blog = $wpdb->blogid;
// Get all blog ids and create tables
$blogids = $wpdb->get_col("SELECT blog_id FROM ".$wpdb->blogs);
foreach($blogids as $blog_id){
switch_to_blog($blog_id);
self::insert_default_navigation_skins($skins);
restore_current_blog();
}
// 2.2.5
// switch_to_blog($old_blog); //go back to correct blog
}else{
self::insert_default_navigation_skins($skins);
}
}
/**
* Insert Default Skin if they are not already installed
*/
public static function insert_default_navigation_skins($data){
global $wpdb;
$table_name = $wpdb->prefix . Essential_Grid::TABLE_NAVIGATION_SKINS;
$data = apply_filters('essgrid_insert_detault_navigation_skins', $data);
if(!empty($data)){
foreach($data as $skin){
//create
$check = $wpdb->get_row($wpdb->prepare("SELECT * FROM $table_name WHERE handle = %s ", $skin['handle']), ARRAY_A);
//check if exists, if no, create
if(!empty($check)) continue;
//insert if function did not return yet
$response = $wpdb->insert($table_name, array('name' => $skin['name'], 'handle' => $skin['handle'], 'css' => $skin['css']));
}
}
}
/**
* Update / Save Navigation Skins
*/
public static function update_create_navigation_skin_css($data){
global $wpdb;
$data = apply_filters('essgrid_update_create_navigation_skin_css', $data);
$table_name = $wpdb->prefix . Essential_Grid::TABLE_NAVIGATION_SKINS;
if(isset($data['name'])){ //create new skin
if(strlen($data['name']) < 2) return __('Invalid name. Name has to be at least 2 characters long.', EG_TEXTDOMAIN);
if(strlen(sanitize_title($data['name'])) < 2) return __('Invalid name. Name has to be at least 2 characters long.', EG_TEXTDOMAIN);
}else{
if(isset($data['sid'])){
if(intval($data['sid']) == 0) return __('Invalid Navigation Skin. Wrong ID given.', EG_TEXTDOMAIN);
}else{
return __('Invalid Navigation Skin. Wrong ID given.', EG_TEXTDOMAIN);
}
}
if(!isset($data['skin_css']) || empty($data['skin_css'])) return __('No CSS found.', EG_TEXTDOMAIN);
if(isset($data['sid']) && intval($data['sid']) > 0){ //update
//check if entry with id exists, because this is unique
$skin = $wpdb->get_row($wpdb->prepare("SELECT * FROM $table_name WHERE id != %s ", $data['sid']), ARRAY_A);
//check if exists, if yes, update
if(!empty($skin)){
$response = $wpdb->update($table_name,
array(
'css' => stripslashes($data['skin_css'])
), array('id' => $data['sid']));
if($response === false) return __('Navigation skin could not be changed.', EG_TEXTDOMAIN);
return true;
}
}else{
//create
$skin = $wpdb->get_row($wpdb->prepare("SELECT * FROM $table_name WHERE handle = %s ", sanitize_title($data['name'])), ARRAY_A);
//check if exists, if no, create
if(!empty($skin)){
return __('Navigation skin with chosen name already exist. Please use a different name.', EG_TEXTDOMAIN);
}
//insert if function did not return yet
$response = $wpdb->insert($table_name, array('name' => $data['name'], 'handle' => sanitize_title($data['name']), 'css' => stripslashes($data['skin_css'])));
if($response === false) return false;
return true;
}
}
/**
* Update / Save Navigation Skins
*/
public static function delete_navigation_skin_css($data){
global $wpdb;
$data = apply_filters('essgrid_delete_navigation_skin_css', $data);
$table_name = $wpdb->prefix . Essential_Grid::TABLE_NAVIGATION_SKINS;
if(!isset($data['skin'])){
return __('Invalid Navigation Skin. Wrong ID given.', EG_TEXTDOMAIN);
}
//check if entry with id exists, because this is unique
$response = $wpdb->delete($table_name, array('handle' => $data['skin']));
if($response === false) return __('Navigation Skin not be deleted', EG_TEXTDOMAIN);
return true;
}
/**
* Set all Layout Elements
*/
public function set_layout($layout){
$layout = apply_filters('essgrid_set_layout', $layout);
if(!empty($layout)){
foreach($layout as $type => $position){
if(!empty($position)){
$pos = current(array_keys($position));
$this->layout[$pos][$layout[$type][$pos]] = $type;
}
}
foreach($this->layout as $key => $val)
ksort($this->layout[$key]);
}
}
/**
* Set specific styles
*/
public function set_specific_styles($styles){
$styles = apply_filters('essgrid_set_specific_styles', $styles);
$this->specific_styles = $styles;
}
/**
* Set special class to wrapper
* @since: 1.5.0
*/
public function set_special_class($classes){
$classes = apply_filters('essgrid_set_special_class', $classes);
$this->special_class .= ' '.$classes;
}
/**
* Get special class to wrapper
* @since: 2.3.7
*/
public function get_special_class(){
return $this->special_class;
}
/**
* Set filter added to true/false
* @since: 2.1.0
*/
public function set_filter_added($setto){
$this->filter_added = apply_filters('essgrid_set_filter_added', $setto);
}
/**
* Set Filter All Text
*/
public function set_filter_text($text, $key = ''){
$a = apply_filters('essgrid_set_filter_text', array('text' => $text, 'key' => $key));
$this->filter_all_text['filter'.$a['key']] = __($a['text'], EG_TEXTDOMAIN);
}
/**
* Set Filter All Visiblity
*/
public function set_filterall_visible($visible, $key = ''){
$a = apply_filters('essgrid_set_filterall_visible', array('visible' => $visible, 'key' => $key));
$this->filterall_visible['filter'.$a['key']] = __($a['visible'], EG_TEXTDOMAIN);
}
/**
* Set Sort By Text
* @since: 1.5.0
*/
public function set_orders_text($text){
$text = apply_filters('essgrid_set_orders_text', $text);
$this->sort_by_text = $text;
}
/**
* Set Filter Dropdown Text
*/
public function set_dropdown_text($text, $key = ''){
$a = apply_filters('essgrid_set_dropdown_text', array('text' => $text, 'key' => $key));
$text = apply_filters('essgrid_set_dropdown_text', $text, $key);
$this->filter_dropdown_text['filter'.$a['key']] = $a['text'];
}
/**
* Set Filter Option To Show Count
* @since: 2.0
*/
public function set_show_count($opt, $key = ''){
$a = apply_filters('essgrid_set_show_count', array('opt' => $opt, 'key' => $key));
$this->filter_show_count['filter'.$a['key']] = $a['opt'];
}
/**
* Set specific filter settings
* @since: 1.1.0
*/
public function set_filter_settings($key, $settings){
$a = apply_filters('essgrid_set_filter_settings', array('settings' => $settings, 'key' => $key));
$this->filter_settings[$a['key']] = $a['settings'];
}
/**
* Output Container
*/
public function output_layout($layout_container, $spacing = 0){
$fclass = ($this->filter_type != false) ? ' esg-'.$this->filter_type : '';
do_action('essgrid_output_layout_pre', $layout_container, $this->layout);
$l = '';
if(!empty($this->layout[$layout_container])){
$l = '<article class="esg-filters'.$fclass;
if($layout_container == 'left') $l .= ' esg-navbutton-solo-left';
if($layout_container == 'right') $l .= ' esg-navbutton-solo-right';
$l .= '"';
$l .= ' style="';
if(!empty($this->styles)){
foreach($this->styles as $style => $value){
$l .= $style.': '.$value.'; ';
}
}
if(!empty($this->specific_styles[$layout_container])){
foreach($this->specific_styles[$layout_container] as $style => $value){
$l .= $style.': '.$value.'; ';
}
}
$l .= '"';
$l .= '>';
$num = count($this->layout[$layout_container]) - 1;
$real_spacing = ($spacing !== 0) ? $spacing / 2 : 0;
foreach($this->layout[$layout_container] as $key => $what){
$important = ($what == 'right' || $what == 'left') ? ' !important' : ''; //set important if we are the arrows, because they have already !important in settings.css
$this->spacing = ' style="margin-left: '.$real_spacing.'px'.$important.'; margin-right: '.$real_spacing.'px'.$important.';';
if($what == 'right' || $what == 'left') $this->spacing .= ' display: none;'; //hide navigation buttons left & right at start
$this->spacing .= '"';
/*if($num >= 1 && $key != $num && $key > 0){
$this->spacing = ' style="margin-left: '.$real_spacing.'px'.$important.'; margin-right: '.$real_spacing.'px'.$important.';';
if($what == 'right' || $what == 'left') $this->spacing .= ' display: none;'; //hide navigation buttons left & right at start
$this->spacing .= '"';
}else{
if($key == 0){
$this->spacing = ' style="margin-right: '.$real_spacing.'px'.$important.';';
if($what == 'right' || $what == 'left') $this->spacing .= ' display: none;'; //hide navigation buttons left & right at start
$this->spacing .= '"';
}elseif($key == $num){
$this->spacing = ' style="margin-left: '.$real_spacing.'px'.$important.';';
if($what == 'right' || $what == 'left') $this->spacing .= ' display: none;'; //hide navigation buttons left & right at start
$this->spacing .= '"';
}else{
$this->spacing = false;
}
}*/
switch($what){
case 'sorting':
$l .= self::output_sorting();
break;
case 'cart':
$l .= self::output_cart();
break;
case 'left':
$l .= self::output_navigation_left();
break;
case 'right':
$l .= self::output_navigation_right();
break;
case 'pagination':
$l .= self::output_pagination();
break;
case 'filter':
$l .= self::output_filter_unwrapped();
break;
case 'search-input':
$l .= self::output_search_input();
break;
default:
//check if its one of the filter fields
if(strpos($what, 'filter-') !== false){
$cur_id = intval(str_replace('filter-', '', $what));
$l .= self::output_filter_unwrapped(false, '-'.$cur_id);
}else{
do_action('essgrid_output_layout_'.$what);
}
break;
}
}
$l .= '</article>';
$l .= '<div class="esg-clear-no-height"></div>';
echo apply_filters('essgrid_output_layout', $l);
}
do_action('essgrid_output_layout_post', $layout_container, $this->layout);
}
public function set_filter($data){
if(!empty($data)){
$this->filter = $data + $this->filter; //merges the array and preserves the key
asort($this->filter);
$this->filter = apply_filters('essgrid_set_filter', $this->filter);
}
}
public function set_orders($data){
$this->sorting = $data + $this->sorting; //merges the array and preserves the key
arsort($this->sorting);
$this->sorting = apply_filters('essgrid_set_orders', $this->sorting);
}
public function set_orders_start($start_by){
$this->sorting_start = apply_filters('essgrid_set_orders_start', $start_by);
}
public function set_filter_type($type){
if($type == 'single'){
$this->filter_type = 'singlefilters';
}elseif($type == 'multi'){
$this->filter_type = 'multiplefilters';
}else{
$this->filter_type = false;
}
$this->filter_type = apply_filters('essgrid_set_filter_type', $this->filter_type);
}
/**
* Set filter that are selected at start
* @since: 2.0.1
**/
public function set_filter_start_select($select){
$this->filter_start_select = apply_filters('essgrid_set_filter_start_select', explode(',', $select));
foreach($this->filter_start_select as $key => $val){
if(trim($val) == '') unset($this->filter_start_select[$key]);
}
}
public function set_style($name, $value){
$a = apply_filters('essgrid_set_style', array('name' => $name, 'value' => $value));
$this->styles[$a['name']] = $a['value'];
}
public function output_filter($demo = false){
if(!$this->filter_show || $this->filter_type == false) return true;
//$f = '<!-- THE FILTERING, SORTING AND WOOCOMMERCE BUTTONS -->';
$f = '<article class="esg-filters esg-'.$this->filter_type.' '.$this->special_class.'"';
if(!empty($this->styles)){
$f .= ' style="';
foreach($this->styles as $style => $value){
$f .= $style.': '.$value.'; ';
}
$f .= '"';
}
$f .= '>'; //<!-- USE esg-multiplefilters FOR MIXED FILTERING, AND esg-singlefilters FOR SINGLE FILTERING -->
//$f .= '<!-- THE FILTER BUTTONS -->';
$f .= '<div class="esg-filter-wrapper">';
// 2.2.5
$f .= '<div class="esg-mobile-filter-button" style="display: none"><span>'.$this->filter_dropdown_text['filter'].'</span><i class="eg-icon-down-open"></i></div>';
$sel = (!empty($this->filter_start_select)) ? '' : ' selected';
/* 2.2.6 hide Filter-All button if text is empty */
$all_filter_text = $this->filter_all_text['filter'];
$hideallfilter = $this->filterall_visible['filter'] === 'on' ? '' : ' style="display: none"';
$f .= '<div class="esg-filterbutton'.$sel.' esg-allfilter" data-filter="filterall" data-fid="-1"'.$hideallfilter.'><span>'.$all_filter_text.'</span></div>';
if($demo === 'skinchoose'){
$f .= '<div class="esg-filterbutton" data-filter="filter-selectedskin"><span>'.__('Selected Skin', EG_TEXTDOMAIN).'</span><span class="esg-filter-checked"><i class="eg-icon-ok-1"></i></span></div>';
}
if($demo !== false){
$f .= '<div class="esg-filterbutton" data-filter="filter-favorite"><span>'.__('Favorites', EG_TEXTDOMAIN).'</span><span class="esg-filter-checked"><i class="eg-icon-ok-1"></i></span></div>';
}
if(!empty($this->filter)){
foreach($this->filter as $filter_id => $filter){
$_v = Essential_Grid_Base::sanitize_utf8_to_unicode($filter['slug']);
$filter_text = ($demo !== false) ? self::translate_demo_filter($filter['slug']) : Essential_Grid_Wpml::strip_category_additions($filter['name']);
$sel = (in_array($_v, $this->filter_start_select)) ? ' selected' : '';
$f .= '<div class="esg-filterbutton'.$sel.'" data-fid="'.$filter_id.'" data-filter="filter-'.$_v.'"><span>'.$filter_text.'</span><span class="esg-filter-checked"><i class="eg-icon-ok-1"></i></span></div>';
}
}
$f .= '</div>';
//echo self::output_sorting();
//echo self::output_cart();
$f .= '<div class="clear"></div>';
$f .= '</article>'; //<!-- END OF FILTERING, SORTING AND CART BUTTONS -->';
$f .= '<div class="clear eg-filter-clear"></div>';
$this->set_filter_added(true);
return apply_filters('essgrid_output_filter', $f, $demo);
}
public function output_filter_unwrapped($demo = false, $type = ''){ //$type -> names what settings we need to check for: filter, filter2, filter3
global $sitepress;
$grouping = (isset($this->filter_settings['filter'.$type]['filter-grouping'])) ? $this->filter_settings['filter'.$type]['filter-grouping'] : 'false';
$listing = (isset($this->filter_settings['filter'.$type]['filter-listing'])) ? $this->filter_settings['filter'.$type]['filter-listing'] : 'list';
$amount = (isset($this->filter_show_count['filter'.$type]) && $this->filter_show_count['filter'.$type] == 'on') ? ' eg-show-amount' : '';
$do_show = @$this->filter_settings['filter'.$type]['filter-selected'];
$is_post = (isset($this->filter_settings['filter'.$type]['custom'])) ? false : true;
$dropdown = '';
switch($listing){
case 'dropdown': //use dropdown
$dropdown = ' dropdownstyle';
break;
case 'mobiledropdownstyle': //use dropdown only on mobile
$dropdown = ' mobiledropdownstyle';
break;
}
//$f = '<!-- THE FILTERING, SORTING AND WOOCOMMERCE BUTTONS -->';
$f = '<!-- THE FILTER BUTTONS -->';
$f .= '<div class="esg-filter-wrapper'.$dropdown.$amount.' '.$this->special_class.'"';
if($this->spacing !== false) $f .= $this->spacing;
$f .= '>';
$filtertext = __('Filter Categories', EG_TEXTDOMAIN);
if(array_key_exists('filter'.$type, $this->filter_dropdown_text)) {
$filtertext = $this->filter_dropdown_text['filter'.$type];
}
if($listing == 'dropdown'){
// 2.2.5
$f .= '<div class="esg-selected-filterbutton esg-mobile-filter-button"><span>'.$filtertext.'</span><i class="eg-icon-down-open"></i></div>';
$f .= '<div class="esg-dropdown-wrapper">';
}
else {
// 2.2.5
$f .= '<div class="esg-mobile-filter-button"><span>'.$filtertext.'</span><i class="eg-icon-down-open"></i></div>';
}
$sel = (!empty($this->filter_start_select)) ? '' : ' selected';
/* 2.2.6 hide Filter-All button if text is empty */
$all_filter_text = @$this->filter_all_text['filter'.$type];
$hideallfilter = @$this->filterall_visible['filter'.$type] === 'on' ? '' : ' style="display: none"';
$f .= '<div class="esg-filterbutton'.$sel.' esg-allfilter" data-filter="filterall" data-fid="-1"'.$hideallfilter.'><span>'.$all_filter_text.'</span></div>';
if($demo){
$f .= '<div class="esg-filterbutton" data-filter="filter-favorite"><span>'.__('Favorites', EG_TEXTDOMAIN).'</span><span class="esg-filter-checked"><i class="eg-icon-ok-1"></i></span></div>';
}
if($is_post && !empty($do_show) && is_array($do_show)){ //we are a post based grid
foreach($do_show as $string_id){
$fraw = explode('_', $string_id);
if(count($fraw) > 1){
$f_id = array_pop($fraw);
}else{
$f_id = $fraw[0];
}
if(Essential_Grid_Wpml::is_wpml_exists() && isset($sitepress)){
$t_id = @icl_object_id($f_id, implode('_', $fraw), true, ICL_LANGUAGE_CODE);
if(!empty($t_id)) $f_id = $t_id;
}
if(isset($this->filter[$f_id])){
$filter_text = ($demo) ? self::translate_demo_filter($this->filter[$f_id]['slug']) : Essential_Grid_Wpml::strip_category_additions($this->filter[$f_id]['name']);
// 2.2.5
// sanitize multi-select custom meta
if(strpos($filter_text, "['") !== false && strpos($filter_text, "']") !== false) {
$filter_text = preg_replace("/\[\'|\'\]/", '', $filter_text);
$filter_text = preg_replace("/\'\,\'/", ' & ', $filter_text);
}
$_v = Essential_Grid_Base::sanitize_utf8_to_unicode($this->filter[$f_id]['slug']);
$sel = (in_array($_v, $this->filter_start_select)) ? ' selected' : '';
$parent_id = (isset($this->filter[$f_id]['parent']) && intval($this->filter[$f_id]['parent']) > 0) ? $this->filter[$f_id]['parent'] : 0;
$parent = ($parent_id > 0) ? ' data-pid="'.$parent_id.'"' : '';
$f .= '<div class="esg-filterbutton'.$sel.'" data-fid="'.$f_id.'"'.$parent.' data-filter="filter-'.$_v.'"><span>'.$filter_text.'</span><span class="esg-filter-checked"><i class="eg-icon-ok-1"></i></span></div>';
}
}
}else{
if(!empty($do_show) && is_array($do_show)){
foreach($do_show as $name){
if(!empty($this->filter)){
foreach($this->filter as $filter_id => $filter){
if($filter['name'] !== $name) continue;
$filter_text = ($demo) ? self::translate_demo_filter($filter['slug']) : Essential_Grid_Wpml::strip_category_additions($filter['name']);
// 2.2.5
// sanitize multi-select custom meta
if(strpos($filter_text, "['") !== false && strpos($filter_text, "']") !== false) {
$filter_text = preg_replace("/\[\'|\'\]/", '', $filter_text);
$filter_text = preg_replace("/\'\,\'/", ' & ', $filter_text);
}
$_v = Essential_Grid_Base::sanitize_utf8_to_unicode($filter['slug']);
$sel = (in_array($_v, $this->filter_start_select)) ? ' selected' : '';
$parent_id = (isset($filter['parent']) && intval($filter['parent']) > 0) ? $filter['parent'] : 0;
$parent = ($parent_id > 0) ? ' data-pid="'.$parent_id.'"' : '';
$f .= '<div class="esg-filterbutton'.$sel.'" data-fid="'.$filter_id.'"'.$parent.' data-filter="filter-'.$_v.'"><span>'.$filter_text.'</span><span class="esg-filter-checked"><i class="eg-icon-ok-1"></i></span></div>';
}
}
}
}else{ //fallback to old version
if(!empty($this->filter)){
foreach($this->filter as $filter_id => $filter){
$filter_text = ($demo) ? self::translate_demo_filter($filter['slug']) : Essential_Grid_Wpml::strip_category_additions($filter['name']);
// 2.2.5
// sanitize multi-select custom meta
if(strpos($filter_text, "['") !== false && strpos($filter_text, "']") !== false) {
$filter_text = preg_replace("/\[\'|\'\]/", '', $filter_text);
$filter_text = preg_replace("/\'\,\'/", ' & ', $filter_text);
}
$_v = Essential_Grid_Base::sanitize_utf8_to_unicode($filter['slug']);
$sel = (in_array($_v, $this->filter_start_select)) ? ' selected' : '';
$parent_id = (isset($filter['parent']) && intval($filter['parent']) > 0) ? $filter['parent'] : 0;
$parent = ($parent_id > 0) ? ' data-pid="'.$parent_id.'"' : '';
$f .= '<div class="esg-filterbutton'.$sel.'" data-fid="'.$filter_id.'"'.$parent.' data-filter="filter-'.$_v.'"><span>'.$filter_text.'</span><span class="esg-filter-checked"><i class="eg-icon-ok-1"></i></span></div>';
}
}
}
}
if($listing == 'dropdown'){
$f .= '</div>';
}
$f .= '<div class="eg-clearfix"></div>';
$f .= '</div>';
$this->set_filter_added(true);
return apply_filters('essgrid_output_filter_unwrapped', $f, $demo, $type);
}
public function output_sorting(){
$s = '';
if(!empty($this->sorting)){
//$s .= '<!-- THE SORTING BUTTON -->';
$s .= '<div class="esg-sortbutton-wrapper '.$this->special_class.'"';
if($this->spacing !== false) $s .= $this->spacing;
$s .= '>';
$s .= '<div class="esg-sortbutton"><span>'.$this->sort_by_text.'</span><span class="sortby_data">'.$this->set_sorting_text($this->sorting_start).'</span>';
$s .= '<select class="esg-sorting-select">';
foreach($this->sorting as $sort){
$s .= '<option value="'.$this->set_sorting_value($sort).'" '.selected( $this->sorting_start, $this->set_sorting_value($sort), false ).'>'.$this->set_sorting_text($sort).'</option>';
}
$s .= '</select>';
$s .= '</div><div class="esg-sortbutton-order eg-icon-down-open tp-asc"></div>';
$s .= '</div>'; //<!-- END OF SORTING BUTTON -->';
}
return apply_filters('essgrid_output_sorting', $s);
}
public function set_sorting_text($san_text){
if(strpos($san_text, 'eg-') === 0){
$meta = new Essential_Grid_Meta();
$m = $meta->get_all_meta(false);
if(!empty($m)){
foreach($m as $me){
if('eg-'.$me['handle'] == $san_text) return apply_filters('essgrid_set_sorting_text', $me['name'], $san_text);
}
}
}elseif(strpos($san_text, 'egl-') === 0){
$meta = new Essential_Grid_Meta_Linking();
$m = $meta->get_all_link_meta(false);
if(!empty($m)){
foreach($m as $me){
if('egl-'.$me['handle'] == $san_text) return apply_filters('essgrid_set_sorting_text', $me['name'], $san_text);
}
}
}else{
$orig = $san_text;
switch($san_text){
case 'date':
$san_text = __('Date', EG_TEXTDOMAIN);
break;
case 'title':
$san_text = __('Title', EG_TEXTDOMAIN);
break;
case 'excerpt':
$san_text = __('Excerpt', EG_TEXTDOMAIN);
break;
case 'id':
$san_text = __('ID', EG_TEXTDOMAIN);
break;
case 'slug':
$san_text = __('Slug', EG_TEXTDOMAIN);
break;
case 'author':
$san_text = __('Author', EG_TEXTDOMAIN);
break;
case 'last-modified':
$san_text = __('Last Modified', EG_TEXTDOMAIN);
break;
case 'number-of-comments':
$san_text = __('Comments', EG_TEXTDOMAIN);
break;
case 'meta_num_total_sales':
$san_text = __('Total Sales', EG_TEXTDOMAIN);
break;
case 'meta_num__regular_price':
$san_text = __('Regular Price', EG_TEXTDOMAIN);
break;
case 'meta_num__sale_price':
$san_text = __('Sale Price', EG_TEXTDOMAIN);
break;
case 'meta__featured':
$san_text = __('Featured', EG_TEXTDOMAIN);
break;
case 'meta__sku':
$san_text = __('SKU', EG_TEXTDOMAIN);
break;
case 'meta_num_stock':
$san_text = __('In Stock', EG_TEXTDOMAIN);
break;
default:
$san_text = ucfirst($san_text);
break;
}
}
return apply_filters('essgrid_set_sorting_text', $san_text, $orig);
}
public function set_sorting_value($san_handle){
$orig = $san_handle;
switch($orig){
case 'meta_num_total_sales':
$san_handle = 'total-sales';
break;
case 'meta_num__regular_price':
$san_handle = 'regular-price';
break;
case 'meta_num__sale_price':
$san_handle = 'sale-price';
break;
case 'meta__featured':
$san_handle = 'featured';
break;
case 'meta__sku':
$san_handle = 'sku';
break;
case 'meta_num_stock':
$san_handle = 'in-stock';
break;
}
return apply_filters('essgrid_set_sorting_value', $san_handle, $orig);
}
public function output_cart(){
if(!Essential_Grid_Woocommerce::is_woo_exists()) return true;
if( !function_exists( 'wc_cart_totals_subtotal_html' ) ) return true;
ob_start();
//$c .= '<!-- THE CART BUTTON -->';
echo '<div class="esg-cartbutton-wrapper '.$this->special_class.'"';
if($this->spacing !== false) echo $this->spacing;
echo '>';
echo '<div class="esg-cartbutton">';
echo '<a href="'.wc_get_cart_url().'">';
echo '<i class="eg-icon-basket"></i><span class="ess-cart-content">';
echo WC()->cart->get_cart_contents_count();
echo __(' items - ', EG_TEXTDOMAIN);
echo wc_cart_totals_subtotal_html();
echo '</span>';
echo '</a>';
echo '</div>';//<a href="#"><div class="esg-sortbutton-order eg-icon-down-open tp-asc"></div></a>
echo '</div>'; //<!-- END OF CART BUTTON -->';
$c = ob_get_contents();
ob_clean();
ob_end_clean();
return apply_filters('essgrid_output_cart', $c);
}
public function output_navigation(){
//$n = '<!-- THE NAVIGATION BUTTONS -->';
$n = '<article class="navigationbuttons '.$this->special_class.'">';
$n .= self::output_navigation_left();
$n .= self::output_navigation_right();
$n .= '</article>'; //<!-- END OF THE NAVIGATION BUTTONS -->';
return apply_filters('essgrid_output_navigation', $n);
}
public function output_navigation_left(){
$n = '<div class="esg-navigationbutton esg-left '.$this->special_class.'" ';
if($this->spacing !== false) $n .= $this->spacing;
$n .= '><i class="eg-icon-left-open"></i></div>';
return apply_filters('essgrid_output_navigation_left', $n);
}
public function output_navigation_right(){
$n = '<div class="esg-navigationbutton esg-right '.$this->special_class.'" ';
if($this->spacing !== false) $n .= $this->spacing;
$n .= '><i class="eg-icon-right-open"></i></div>';
return apply_filters('essgrid_output_navigation_right', $n);
}
public function output_pagination($backend = false){
//$p = '<!-- THE PAGINATION CONTAINER. PAGE BUTTONS WILL BE ADDED ON DEMAND AUTOMATICALLY !! -->';
$p = '<div class="esg-pagination '.$this->special_class.'"';
if($this->spacing !== false) $p .= $this->spacing;
$p .= '></div>'; //<!-- END OF THE PAGINATION -->';
return apply_filters('essgrid_output_pagination', $p, $backend);
}
public function output_navigation_skin($handle){
$base = new Essential_Grid_Base();
$css = self::get_essential_navigation_skin_by_handle($handle);
$n = '';
if($css !== false){
$n = '<style type="text/css">';
$n .= $base->compress_css($css['css']);
$n .= '</style>'."\n";
}
return apply_filters('essgrid_output_navigation_skin', $n, $handle);
}
public static function output_navigation_skins(){
$base = new Essential_Grid_Base();
$skins = self::get_essential_navigation_skins();
$css = '';
if(!empty($skins)){
foreach($skins as $skin){
$css .= '<style class="navigation-skin-css-'.$skin['id'].'" type="text/css">';
$css .= $base->compress_css($skin['css']);
$css .= '</style>'."\n";
}
}
return apply_filters('essgrid_output_navigation_skins', $css);
}
private function translate_demo_filter($name){
$post = Essential_Grid_Item_Element::getPostElementsArray();
$event = Essential_Grid_Item_Element::getEventElementsArray();
$woocommerce = array();
if(Essential_Grid_Woocommerce::is_woo_exists()){
$tmp_wc = Essential_Grid_Woocommerce::get_meta_array();
foreach($tmp_wc as $handle => $wc_name){
$woocommerce[$handle]['name'] = $wc_name;
}
}
if(array_key_exists($name, $post)) return $post[$name]['name'];
if(array_key_exists($name, $event)) return $event[$name]['name'];
if(array_key_exists($name, $woocommerce)) return $woocommerce[$name]['name'];
return apply_filters('essgrid_translate_demo_filter', ucwords($name), $name);
}
/**
* Change the Search Text
* @since: 2.0
*/
public function set_search_text($text){
$this->search_text = apply_filters('essgrid_set_search_text', $text);
}
/**
* Output the Search Input Field
* @since: 2.0
*/
public function output_search_input(){
$s = '<div class="esg-filter-wrapper eg-search-wrapper'.$this->special_class.'"';
if($this->spacing !== false) $s .= $this->spacing;
$s .= '>';
$s .= '<input name="eg-search-input-'.$this->grid_id.'" class="eg-search-input" type="text" value="" placeholder="'.$this->search_text.'">';
$s .= '<span class="eg-search-submit"><i class="eg-icon-search"></i></span>';
$s .= '<span class="eg-search-clean"><i class="eg-icon-cancel"></i></span>';
$s .= '</div>';
$this->search_found = true; //trigger this to add
return apply_filters('essgrid_output_search_input', $s);
}
/**
* Output "Filter All" markup if search is existing in any container
* @since: 2.0.7
*/
public function check_for_search(){
$s = '';
if($this->filter_added === false && $this->search_found === true){
//$s .= '<!-- NEEDED FOR SEARCH -->';
$s .= '<div class="esg-filter-wrapper" style="display:none;">';
$s .= '<article class="esg-filters esg-'.$this->filter_type.' '.$this->special_class.'">';
$s .= '<div class="esg-filterbutton selected esg-allfilter" data-filter="filterall" data-fid="-1" ><span>'.$this->filter_all_text['filter'].'</span></div>';
$s .= '</article>';
$s .= '</div>';
}
return apply_filters('essgrid_check_for_search', $s, $this->filter_added, $this->search_found);
}
}