Files
elessi-theme/cores/nasa-widget-functions.php

632 lines
26 KiB
PHP

<?php
defined('ABSPATH') or die(); // Exit if accessed directly
/**
* Get Role Filter Price
*/
if (!function_exists('elessi_get_filtered_price')) :
function elessi_get_filtered_price() {
global $wpdb;
$args = WC()->query->get_main_query()->query_vars;
$tax_query = isset($args['tax_query']) ? $args['tax_query'] : array();
$meta_query = isset($args['meta_query']) ? $args['meta_query'] : array();
if (!is_post_type_archive('product') && !empty($args['taxonomy']) && !empty($args['term'])) {
$tax_query[] = WC()->query->get_main_tax_query();
}
foreach ($meta_query + $tax_query as $key => $query) {
if (!empty($query['price_filter']) || ! empty($query['rating_filter'])) {
unset($meta_query[$key]);
}
}
$meta_query = new WP_Meta_Query($meta_query);
$tax_query = new WP_Tax_Query($tax_query);
$search = WC_Query::get_main_search_query_sql();
$meta_query_sql = $meta_query->get_sql('post', $wpdb->posts, 'ID');
$tax_query_sql = $tax_query->get_sql($wpdb->posts, 'ID');
$search_query_sql = $search ? ' AND ' . $search : '';
$sql = "
SELECT min(min_price) as min_price, MAX(max_price) as max_price
FROM {$wpdb->wc_product_meta_lookup}
WHERE product_id IN (
SELECT ID FROM {$wpdb->posts}
" . $tax_query_sql['join'] . $meta_query_sql['join'] . "
WHERE {$wpdb->posts}.post_type IN ('" . implode("','", array_map('esc_sql', apply_filters('woocommerce_price_filter_post_type', array('product')))) . "')
AND {$wpdb->posts}.post_status = 'publish'
" . $tax_query_sql['where'] . $meta_query_sql['where'] . $search_query_sql . '
)';
$sql = apply_filters('woocommerce_price_filter_sql', $sql, $meta_query_sql, $tax_query_sql);
return $wpdb->get_row($sql); // WPCS: unprepared SQL ok.
}
endif;
/**
* Variation content widget
*/
if (!function_exists('elessi_get_content_widget_variation')) :
function elessi_get_content_widget_variation($args, $instance) {
$args = array('widget_id' => $args['widget_id']);
$hide_widget = false;
$hide_empty = isset($instance['hide_empty']) && $instance['hide_empty'] ? true : false;
$var_exist = $hide_empty ? false : true;
$columns_classic = isset($instance['cols']) && in_array($instance['cols'], array('1', '2')) ? $instance['cols'] : '2';
$columns_classic_class = ' ns-cols-' . $columns_classic;
$taxonomy = isset($instance['attribute']) ? wc_attribute_taxonomy_name($instance['attribute']) : '';
if (!taxonomy_exists($taxonomy)) {
$hide_widget = true;
return array('hide_widget' => $hide_widget, 'content' => '');
}
$content = '<div id="' . esc_attr($args['widget_id']) . '-ajax-wrap" class="nasa-filter-variations-widget-wrap">';
$query_type = isset($instance['query_type']) ? $instance['query_type'] : 'or';
$terms_args = array('taxonomy' => $taxonomy, 'hide_empty' => $hide_empty);
$orderby = wc_attribute_orderby($taxonomy);
switch ($orderby) {
case 'name' :
$terms_args['orderby'] = 'name';
$terms_args['menu_order'] = false;
break;
case 'id' :
$terms_args['orderby'] = 'id';
$terms_args['order'] = 'ASC';
$terms_args['menu_order'] = false;
break;
case 'menu_order' :
default:
$terms_args['menu_order'] = 'ASC';
break;
}
$terms = get_terms(apply_filters('woocommerce_product_attribute_terms', $terms_args));
$hasResult = false;
$count_terms = $terms ? count($terms) : 0;
if (0 < $count_terms) {
$term_counts = elessi_get_filtered_term_product_counts(wp_list_pluck($terms, 'term_id'), $taxonomy, $query_type);
$attr_name = 0 === strpos($taxonomy, 'pa_') ? substr($taxonomy, 3) : $taxonomy;
$filter_name = 'filter_' . $attr_name;
$current_filter = array();
if (isset($_GET[$filter_name]) && $_GET[$filter_name] != '') {
$current_filter = is_array($_GET[$filter_name]) ?
$_GET[$filter_name] : explode(',', wc_clean($_GET[$filter_name]));
}
$current_filter = !empty($current_filter) ? array_map('sanitize_title', $current_filter) : $current_filter;
$vari_type = 'default';
$taxonomyObj = null;
$color_size = false;
$color_switch = 'color';
$label_switch = 'label';
$image_switch = 'image';
if ($nasa_attr_ux_exist = class_exists('Nasa_Abstract_WC_Attr_UX')) {
$taxonomyObj = Nasa_Abstract_WC_Attr_UX::get_tax_attribute($taxonomy);
$color_switch = Nasa_Abstract_WC_Attr_UX::_NASA_COLOR;
$label_switch = Nasa_Abstract_WC_Attr_UX::_NASA_LABEL;
$image_switch = Nasa_Abstract_WC_Attr_UX::_NASA_IMAGE;
}
$class_ul = ' small-block-grid-1 medium-block-grid-4 large-block-grid-5';
$brand_items = false;
if ($taxonomyObj && isset($taxonomyObj->attribute_type)) {
$color_size = true;
switch ($taxonomyObj->attribute_type) {
case $color_switch:
$vari_type = 'color';
$class_ul = ' small-block-grid-2 medium-block-grid-4 large-block-grid-7';
break;
case $label_switch:
$vari_type = 'size';
$class_ul = ' small-block-grid-2 medium-block-grid-4 large-block-grid-7';
break;
case $image_switch:
$vari_type = 'image';
global $nasa_opt;
$brands = array();
$nasa_brands = isset($nasa_opt['attr_brands']) && !empty($nasa_opt['attr_brands']) ?
$nasa_opt['attr_brands'] : array();
if (!empty($nasa_brands)) {
foreach ($nasa_brands as $key => $val) {
if ($val === '1') {
$brands[] = $key;
}
}
}
if (!empty($brands) && in_array($attr_name, $brands)) {
$class_ul = ' nasa-variation-filters-brands small-block-grid-2 medium-block-grid-4 large-block-grid-6';
$brand_items = true;
}
break;
default :
$color_size = false;
break;
}
}
$class_ul .= $columns_classic_class;
$show_items = isset($instance['show_items']) ? (int) $instance['show_items'] : 0;
// Current term
$queryObj = get_queried_object();
$current_term_slug = absint((is_tax() && isset($queryObj->slug)) ? $queryObj->slug : 0);
$_chosen_attributes = WC_Query::get_layered_nav_chosen_attributes();
$content_li = '';
foreach ($terms as $k => $term) {
$count = isset($term_counts[$term->term_id]) ? $term_counts[$term->term_id] : 0;
$term_meta = $color_size ? get_term_meta($term->term_id, $taxonomyObj->attribute_type, true) : null;
$vari_txt = ($vari_type == 'size' && trim($term_meta) != '') ? $term_meta : $term->name;
$content_text = '<span class="nasa-text-variation nasa-text-variation-' . $vari_type . '">';
$content_text .= $vari_txt;
$content_text .= '</span>';
/**
* Link
*/
$current_filter_term = $current_filter;
$current_values = isset($_chosen_attributes[$taxonomy]['terms']) ? $_chosen_attributes[$taxonomy]['terms'] : array();
$option_is_set = in_array($term->slug, $current_values);
if (!in_array($term->slug, $current_filter_term)) {
$current_filter_term[] = $term->slug;
}
$link = elessi_get_page_base_url($taxonomy);
// Add current filters to URL.
foreach ($current_filter_term as $key => $value) {
// Exclude query arg for current term archive term
if ($value === $current_term_slug) {
unset($current_filter_term[$key]);
}
// Exclude self so filter can be unset on click.
if ($option_is_set && $value === $term->slug) {
unset($current_filter_term[$key]);
}
}
if (!empty($current_filter_term)) {
$link = add_query_arg($filter_name, implode(',', $current_filter_term), $link);
// Add Query type Arg to URL
if ('or' === $query_type && !(1 === sizeof($current_filter_term) && $option_is_set)) {
$attr_name = 0 === strpos($taxonomy, 'pa_') ? substr($taxonomy, 3) : $taxonomy;
$link = add_query_arg('query_type_' . sanitize_title($attr_name), 'or', $link);
}
// $link = str_replace('%2C', ',', $link);
}
if ($count > 0 || $option_is_set) {
$link = apply_filters('woocommerce_layered_nav_link', $link, $term, $taxonomy);
}
/**
* Current Filter = this widget
*/
$aclass = 'nasa-filter-by-variations nasa-filter-by-attrs';
$class = '';
if (isset($current_filter) && is_array($current_filter) && in_array($term->slug, $current_filter)) {
$class .= ' chosen nasa-chosen';
$aclass .= ' nasa-filter-var-chosen';
}
$countClss = 'count';
if ($vari_type != '') {
$class .= ' nasa-li-filter-' . $vari_type;
$aclass .= ' nasa-filter-' . $vari_type;
$countClss .= ' nasa-count-filter-' . $vari_type;
}
$aclass .= $brand_items ? ' nasa-filter-brand-item' : '';
if ($count) {
$hasResult = true;
$var_exist = true;
} elseif (!$count && $hide_empty) {
$class .= ' nasa-empty-hidden';
$show_items = $show_items > 0 ? $show_items += 1 : $show_items;
}
$attr_name = 0 === strpos($term->taxonomy, 'pa_') ? substr($term->taxonomy, 3) : $term->taxonomy;
$attr = esc_attr(sanitize_title($attr_name));
$liClass = ($k % 2 == 0) ? 'nasa-odd' : 'nasa-even';
$liClass .= ' no-hidden';
// $style = ($vari_type == 'color') ? ' style="background:' . esc_attr($term_meta) . '"' : '';
$liClass .= ($show_items > 0 && $k >= $show_items) ? ' nasa-show-less' : '';
$content_li .= '<li class="' . $liClass . $class . ' nasa-attr-' . $attr . ' nasa_' . $attr . '_' . esc_attr($term->term_id) . '">';
$content_li .=
'<a ' .
'class="' . $aclass . '" ' .
'title="' . esc_attr($vari_txt) . '" ' .
'href="' . esc_url($link) . '"' .
'>';
if (($vari_type == 'color')) {
$colors = $term_meta ? explode(',', $term_meta) : array();
$colors = apply_filters('ns_attr_color_arr', $colors);
$color_html = '<span class="nasa-filter-color-span nasa-flex ns-colors-wrap">';
if (isset($colors[0])) {
$color_html .= '<span style="background-color:' . esc_attr($colors[0]) . ';"></span>';
}
if (isset($colors[1])) {
$color_html .= '<span style="background-color:' . esc_attr($colors[1]) . ';"></span>';
}
$color_html .= '</span>';
$content_li .= $color_html;
}
// $content_li .= $vari_type == 'color' ? '<span class="nasa-filter-color-span" ' . $style . '></span>' : '';
if ($vari_type == 'image' && $nasa_attr_ux_exist) {
if (class_exists('Nasa_Abstract_WC_Attr_UX')) {
$image_size = $brand_items ? 'full' : 28;
$img_html = Nasa_Abstract_WC_Attr_UX::get_image_preview($term_meta, false, $image_size, 28, $vari_txt);
} else {
$img_html = wp_get_attachment_image($term_meta, 'thumbnail', false, array('alt' => $vari_txt, 'class' => 'attr-image-preview'));
}
$img_html = $img_html ? $img_html : wc_placeholder_img();
$content_li .= '<span class="nasa-filter-image-span">' . $img_html . '</span>';
}
$content_li .= $content_text;
if (isset($instance['count']) && $instance['count']) {
$content_li .= ' <span class="' . $countClss . '">' . $count . '</span>';
}
$content_li .= '</a>';
$content_li .= '</li>';
}
$hide_widget = !$hasResult && $hide_empty ? true : false;
if (!$hide_widget && !$var_exist) {
$hide_widget = true;
}
if ($hide_widget) {
return array('hide_widget' => $hide_widget, 'content' => '');
}
$content_ul = '<ul class="nasa-variation-filters nasa-variations-' . $vari_type . $class_ul . '">';
$fadeIn = (isset($instance['effect']) && $instance['effect'] == 'fade') ? '1' : '0';
$content_li .= ($show_items && ($count_terms > $show_items)) ?
'<li class="nasa_show_manual" data-fadein="' . $fadeIn . '">' .
'<a data-show="1" class="nasa-show-more" href="javascript:void(0);" data-text="' . esc_attr__('- Show less', 'elessi-theme') . '" rel="nofollow">' .
esc_html__('+ Show more', 'elessi-theme') .
'</a>' .
'</li>' : '';
$content .= $content_ul . $content_li . '</ul></div>';
return array('hide_widget' => $hide_widget, 'content' => $content);
}
return array('hide_widget' => true, 'content' => '');
}
endif;
/**
* Get term count variations
*/
if (!function_exists('elessi_get_filtered_term_product_counts')) :
function elessi_get_filtered_term_product_counts($term_ids, $taxonomy, $query_type) {
if (function_exists('wc_get_container') && class_exists('Automattic\WooCommerce\Internal\ProductAttributesLookup\Filterer')) {
return wc_get_container()->get(Automattic\WooCommerce\Internal\ProductAttributesLookup\Filterer::class)->get_filtered_term_product_counts($term_ids, $taxonomy, $query_type);
}
global $wpdb;
$meta_query = WC_Query::get_main_meta_query();
$tax_query = WC_Query::get_main_tax_query();
if ('or' === $query_type) {
foreach ($tax_query as $key => $query) {
if (isset($query['taxonomy']) && $taxonomy === $query['taxonomy']) {
unset($tax_query[$key]);
}
}
}
$meta_query = new WP_Meta_Query($meta_query);
$tax_query = new WP_Tax_Query($tax_query);
$meta_query_sql = $meta_query->get_sql('post', $wpdb->posts, 'ID');
$tax_query_sql = $tax_query->get_sql($wpdb->posts, 'ID');
// Generate query
$query = array();
$query['select'] = 'SELECT COUNT(DISTINCT ' . $wpdb->posts . '.ID) as term_count, terms.term_id as term_count_id';
$query['from'] = 'FROM ' . $wpdb->posts;
$query['join'] = 'INNER JOIN ' . $wpdb->term_relationships . ' AS term_relationships ON ' . $wpdb->posts . '.ID = term_relationships.object_id ' .
'INNER JOIN ' . $wpdb->term_taxonomy . ' AS term_taxonomy USING(term_taxonomy_id) ' .
'INNER JOIN ' . $wpdb->terms . ' AS terms USING(term_id) ' .
$tax_query_sql['join'] . $meta_query_sql['join'];
$query['where'] = 'WHERE ' . $wpdb->posts . '.post_type LIKE "product" ' .
'AND ' . $wpdb->posts . '.post_status LIKE "publish" ' .
$tax_query_sql['where'] . $meta_query_sql['where'] . ' ' .
'AND terms.term_id IN (' . implode(',', array_map('absint', $term_ids)) . ')';
// For search case
if (isset($_GET['s']) && $_GET['s']) {
$s = esc_sql(str_replace(array("\r", "\n"), '', stripslashes($_GET['s'])));
$query['where'] .= ' AND (' . $wpdb->posts . '.post_title LIKE "%' . $s . '%" OR ' . $wpdb->posts . '.post_excerpt LIKE "%' . $s . '%" OR ' . $wpdb->posts . '.post_content LIKE "%' . $s . '%")';
}
$query['group_by'] = "GROUP BY terms.term_id";
$queryString = implode(' ', apply_filters('woocommerce_get_filtered_term_product_counts_query', $query));
$results = $wpdb->get_results($queryString);
return wp_list_pluck($results, 'term_count', 'term_count_id');
}
endif;
/**
* Return the currently viewed term slug.
* @return int
*/
if (!function_exists('elessi_get_current_term_slug')) :
function elessi_get_current_term_slug() {
return absint(is_tax() ? get_queried_object()->slug : 0);
}
endif;
/**
* Get current page URL for layered nav items.
* @return string
*/
if (!function_exists('elessi_get_page_base_url')) :
function elessi_get_page_base_url($taxonomy) {
if (defined('SHOP_IS_ON_FRONT')) {
$link = home_url('/');
} elseif (is_post_type_archive('product') || is_page(wc_get_page_id('shop'))) {
$link = get_post_type_archive_link('product');
} elseif (is_product_category()) {
$link = get_term_link(get_query_var('product_cat'), 'product_cat');
} elseif (is_product_tag()) {
$link = get_term_link(get_query_var('product_tag'), 'product_tag');
} else {
$queried_object = get_queried_object();
$link = get_term_link($queried_object, $queried_object->taxonomy);
}
/**
* Custom taxonomy
*/
if (class_exists('Nasa_WC_Taxonomy')) {
$nasa_taxonomy = apply_filters('nasa_taxonomy_custom_cateogory', Nasa_WC_Taxonomy::$nasa_taxonomy);
if (isset($_GET[$nasa_taxonomy])) {
$link = add_query_arg($nasa_taxonomy, wc_clean(wp_unslash($_GET[$nasa_taxonomy])), $link);
}
}
/**
* Min
*/
if (isset($_GET['min_price'])) {
$link = add_query_arg('min_price', wc_clean(wp_unslash($_GET['min_price'])), $link);
}
/**
* Max
*/
if (isset($_GET['max_price'])) {
$link = add_query_arg('max_price', wc_clean(wp_unslash($_GET['max_price'])), $link);
}
/**
* Orderby
*/
if (isset($_GET['orderby'])) {
$link = add_query_arg('orderby', wc_clean(wp_unslash($_GET['orderby'])), $link);
}
/**
* Search Arg.
* To support quote characters, first they are decoded from &quot; entities, then URL encoded.
*/
if (get_search_query()) {
$link = add_query_arg('s', rawurlencode(wp_specialchars_decode(get_search_query())), $link);
}
/**
* Post Type Arg
*/
if (isset($_GET['post_type'])) {
$link = add_query_arg('post_type', wc_clean(wp_unslash($_GET['post_type'])), $link);
/**
* Prevent post type and page id when pretty permalinks are disabled.
*/
if (is_shop()) {
$link = remove_query_arg('page_id', $link);
}
}
/**
* Min Rating Arg
*/
if (isset($_GET['rating_filter'])) {
$link = add_query_arg('rating_filter', wc_clean(wp_unslash($_GET['rating_filter'])), $link);
}
/**
* Filter Status
*/
if (class_exists('Elessi_WC_Widget_Status_Filter')) {
foreach (Elessi_WC_Widget_Status_Filter::$_status as $status) {
if (isset($_GET[$status]) && $_GET[$status] === '1') {
$link = add_query_arg($status, '1', $link);
}
}
}
/**
* Filter Alphabet
*/
if (class_exists('Elessi_WC_Widget_Alphabet_Filter')) {
$alpha_rq = Elessi_WC_Widget_Alphabet_Filter::$_request_name;
if (isset($_GET[$alpha_rq]) && in_array($_GET[$alpha_rq], Elessi_WC_Widget_Alphabet_Filter::$_alphabet)) {
$link = add_query_arg($alpha_rq, wc_clean(wp_unslash($_GET[$alpha_rq])), $link);
}
}
/**
* Filter Multi Tags
*/
if (class_exists('Elessi_WC_Widget_Tags_Filter')) {
if (isset($_GET[Elessi_WC_Widget_Tags_Filter::$_request_name]) && !empty($_GET[Elessi_WC_Widget_Tags_Filter::$_request_name])) {
$link = add_query_arg(Elessi_WC_Widget_Tags_Filter::$_request_name, wc_clean(wp_unslash($_GET[Elessi_WC_Widget_Tags_Filter::$_request_name])), $link);
}
}
/**
* Filter Multi Categories
*/
if (class_exists('Elessi_WC_Widget_Multi_Categories_Filter')) {
if (isset($_GET[Elessi_WC_Widget_Multi_Categories_Filter::$_request_name]) && !empty($_GET[Elessi_WC_Widget_Multi_Categories_Filter::$_request_name])) {
$link = add_query_arg(Elessi_WC_Widget_Multi_Categories_Filter::$_request_name, wc_clean(wp_unslash($_GET[Elessi_WC_Widget_Multi_Categories_Filter::$_request_name])), $link);
}
}
/**
* All current filters
*/
if ($_chosen_attributes = WC_Query::get_layered_nav_chosen_attributes()) {
$taxonomy = wc_attribute_taxonomy_slug($taxonomy);
foreach ($_chosen_attributes as $name => $data) {
$filter_name = wc_attribute_taxonomy_slug($name);
if ($taxonomy == $filter_name) {
continue;
}
if (!empty($data['terms'])) {
$link = add_query_arg('filter_' . $filter_name, implode(',', $data['terms']), $link);
}
if ('or' === $data['query_type']) {
$link = add_query_arg('query_type_' . $filter_name, 'or', $link);
}
}
}
return apply_filters('nasa_page_base_url', $link);
}
endif;
/**
* Get current page URL Origin Not Request GET.
* @return string
*/
if (!function_exists('elessi_get_origin_url')) :
function elessi_get_origin_url($remove_query = array('page', 'paged', 'product-page')) {
global $wp;
$nasa_origin_url = get_option('permalink_structure') == '' ?
remove_query_arg($remove_query, add_query_arg($wp->query_string, '', home_url(trailingslashit($wp->request)))) :
preg_replace('%\/page/[0-9]+%', '', home_url(trailingslashit($wp->request)));
return apply_filters('nasa_origin_url', $nasa_origin_url);
}
endif;
/**
* Get current page URL Origin Not Request GET But Has Paged.
* @return string
*/
if (!function_exists('elessi_get_origin_url_paging')) :
function elessi_get_origin_url_paging($exc = array()) {
global $wp, $nasa_origin_url_paging;
if (!isset($nasa_origin_url_paging)) {
$nasa_origin_url_paging = get_option('permalink_structure') == '' ?
add_query_arg($wp->query_string, '', home_url(trailingslashit($wp->request))) :
home_url(trailingslashit($wp->request));
$GLOBALS['nasa_origin_url_paging'] = $nasa_origin_url_paging;
}
/**
* Exclude
*/
if (!empty($exc)) {
foreach ($exc as $get) {
if (isset($_GET[$get])) {
$nasa_origin_url_paging = add_query_arg($get, esc_attr($_GET[$get]), $nasa_origin_url_paging);
}
}
}
return apply_filters('nasa_origin_url_paging', $nasa_origin_url_paging);
}
endif;
/**
* Remove defaults widgets of Woocommerce
*/
// add_action('init', 'elessi_remove_default_wg_woo');
if (!function_exists('elessi_remove_default_wg_woo')) :
function elessi_remove_default_wg_woo() {
global $nasa_opt;
if ((!isset($nasa_opt['disable_ajax_product']) || !$nasa_opt['disable_ajax_product'])) {
unregister_widget('WC_Widget_Price_Filter');
unregister_widget('WC_Widget_Layered_Nav');
unregister_widget('WC_Widget_Layered_Nav_Filters');
unregister_widget('WC_Widget_Rating_Filter');
unregister_widget('WC_Widget_Product_Search');
}
}
endif;