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 = '
'; $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 = ''; $content_text .= $vari_txt; $content_text .= ''; /** * 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 .= '
  • '; $content_li .= ''; if (($vari_type == 'color')) { $colors = $term_meta ? explode(',', $term_meta) : array(); $colors = apply_filters('ns_attr_color_arr', $colors); $color_html = ''; if (isset($colors[0])) { $color_html .= ''; } if (isset($colors[1])) { $color_html .= ''; } $color_html .= ''; $content_li .= $color_html; } // $content_li .= $vari_type == 'color' ? '' : ''; 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 .= '' . $img_html . ''; } $content_li .= $content_text; if (isset($instance['count']) && $instance['count']) { $content_li .= ' ' . $count . ''; } $content_li .= ''; $content_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 = '
    '; 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 " 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;