File "class-widget-layered-nav.php"
Full Path: /home/ycoalition/public_html/blog/wp-content/themes/woodmart/inc/widgets/class-widget-layered-nav.php
File size: 33.63 KB
MIME-type: text/x-php
Charset: utf-8
<?php use Automattic\WooCommerce\Internal\ProductAttributesLookup\Filterer;
if ( ! defined( 'WOODMART_THEME_DIR' ) ) {
exit( 'No direct script access allowed' );
}
/**
* Color filter widget
*/
if ( ! class_exists( 'WOODMART_Widget_Layered_Nav' ) ) {
class WOODMART_Widget_Layered_Nav extends WPH_Widget {
function __construct() {
if ( ! woodmart_woocommerce_installed() || ! function_exists( 'wc_get_attribute_taxonomies' ) ) {
return;
}
// Configure widget array
$args = array(
// Widget Backend label
'label' => esc_html__( 'WOODMART WooCommerce Layered Nav', 'woodmart' ),
// Widget Backend Description
'description' => esc_html__( 'Shows a custom attribute in a widget which lets you narrow down the list of products when viewing product categories.', 'woodmart' ),
'slug' => 'woodmart-woocommerce-layered-nav',
);
// Configure the widget fields
// fields array
$args['fields'] = array(
array(
'id' => 'title',
'type' => 'text',
'std' => esc_html__( 'Filter by', 'woodmart' ),
'name' => esc_html__( 'Title', 'woodmart' ),
),
array(
'id' => 'attribute',
'type' => 'dropdown',
'std' => '',
'name' => esc_html__( 'Attribute', 'woodmart' ),
'callback' => 'get_layered_get_attributes_options',
),
array(
'id' => 'category',
'type' => 'select2',
'default' => array( 'all' ),
'name' => esc_html__( 'Show on category', 'woodmart' ),
'callback' => 'get_layered_get_categories_options',
'fields' => array(),
),
array(
'id' => 'query_type',
'type' => 'dropdown',
'std' => 'and',
'name' => esc_html__( 'Query type', 'woodmart' ),
'fields' => array(
esc_html__( 'AND', 'woodmart' ) => 'and',
esc_html__( 'OR', 'woodmart' ) => 'or',
),
),
array(
'id' => 'display',
'param_name' => 'display',
'type' => 'dropdown',
'std' => 'list',
'name' => esc_html__( 'Layout', 'woodmart' ),
'fields' => array(
esc_html__( 'List', 'woodmart' ) => 'list',
esc_html__( '2 columns', 'woodmart' ) => 'double',
esc_html__( 'Inline', 'woodmart' ) => 'inline',
esc_html__( 'Dropdown', 'woodmart' ) => 'dropdown'
)
),
array(
'id' => 'size',
'type' => 'dropdown',
'std' => 'normal',
'name' => esc_html__( 'Swatches size', 'woodmart' ),
'fields' => array(
esc_html__( 'Small', 'woodmart' ) => 'small',
esc_html__( 'Medium', 'woodmart' ) => 'normal',
esc_html__( 'Large', 'woodmart' ) => 'large',
)
),
array(
'id' => 'style',
'type' => 'dropdown',
'std' => 'inherit',
'name' => esc_html__( 'Swatch style', 'woodmart' ),
'fields' => array(
esc_html__( 'Inherit', 'woodmart' ) => 'inherit',
esc_html__( 'Style 1', 'woodmart' ) => '1',
esc_html__( 'Style 2', 'woodmart' ) => '2',
esc_html__( 'Style 3', 'woodmart' ) => '3',
esc_html__( 'Style 4', 'woodmart' ) => '4',
),
),
array(
'id' => 'shape',
'type' => 'dropdown',
'std' => 'round',
'name' => esc_html__( 'Swatches shape', 'woodmart' ),
'fields' => array(
esc_html__( 'Inherit', 'woodmart' ) => 'inherit',
esc_html__( 'Round', 'woodmart' ) => 'round',
esc_html__( 'Rounded', 'woodmart' ) => 'rounded',
esc_html__( 'Square', 'woodmart' ) => 'square',
),
),
array(
'id' => 'labels',
'type' => 'dropdown',
'std' => 'on',
'name' => esc_html__( 'Show labels', 'woodmart' ),
'fields' => array(
esc_html__( 'ON', 'woodmart' ) => 'on',
esc_html__( 'OFF', 'woodmart' ) => 'off',
),
),
array(
'id' => 'tooltips',
'type' => 'dropdown',
'std' => 'on',
'name' => esc_html__( 'Show tooltips', 'woodmart' ),
'fields' => array(
esc_html__( 'OFF', 'woodmart' ) => 'off',
esc_html__( 'ON', 'woodmart' ) => 'on',
),
),
array(
'id' => 'search_by_filters',
'type' => 'checkbox',
'name' => esc_html__( 'Show search input for this attribute', 'woodmart' ),
'dependency' => array(
'element' => 'display',
'value_not_equal_to' => array( 'dropdown' ),
),
),
);
// create widget
$this->create_widget( $args );
}
// Output function
// Based on woo widget @version 2.3.0
function widget( $args, $instance ) {
$_chosen_attributes = WC_Query::get_layered_nav_chosen_attributes();
$taxonomy = isset( $instance['attribute'] ) ? wc_attribute_taxonomy_name( $instance['attribute'] ) : '';
$category = isset( $instance['category'] ) ? $instance['category'] : array( 'all' );
$query_type = isset( $instance['query_type'] ) ? $instance['query_type'] : 'and';
$display = isset( $instance['display'] ) ? $instance['display'] : 'list';
$template = isset( $instance['template'] ) ? $instance['template'] : 'default';
$wrapper_classes = '';
if ( ! is_shop() && ! is_product_taxonomy() && $template == 'default' ) {
return;
}
$current_cat = get_queried_object();
if ( ! is_array( $category ) ) {
$category = explode( ',', $category );
}
if ( ! is_tax() && ! in_array( 'all', $category ) ) {
return;
}
if ( ! in_array( 'all', $category ) && property_exists( $current_cat, 'term_id' ) && ! in_array( $current_cat->term_id, $category ) && ! in_array( $current_cat->parent, $category ) ) {
return;
}
if ( ! taxonomy_exists( $taxonomy ) ) {
return;
}
$get_terms_args = array( 'hide_empty' => '1' );
$orderby = wc_attribute_orderby( $taxonomy );
switch ( $orderby ) {
case 'name':
$get_terms_args['orderby'] = 'name';
$get_terms_args['menu_order'] = false;
break;
case 'id':
$get_terms_args['orderby'] = 'id';
$get_terms_args['order'] = 'ASC';
$get_terms_args['menu_order'] = false;
break;
case 'menu_order':
$get_terms_args['menu_order'] = 'ASC';
break;
}
$terms = get_terms( $taxonomy, $get_terms_args );
if ( 0 === sizeof( $terms ) ) {
return;
}
if ( 'layered-nav' === woodmart_get_opt( 'shop_widgets_collapse' ) ) {
$wrapper_classes .= ' wd-widget-collapse';
}
if ( 'disable' !== woodmart_get_opt( 'shop_widgets_collapse', 'disable' ) && is_array( $_chosen_attributes ) && array_key_exists( $taxonomy, $_chosen_attributes ) ) {
$wrapper_classes .= ' wd-opened-initially wd-opened';
}
if ( $wrapper_classes ) {
$args['before_widget'] = str_replace( 'class="', 'class="' . $wrapper_classes . ' ', $args['before_widget'] );
}
if ( isset( $instance['search_by_filters'] ) && $instance['search_by_filters'] ) {
woodmart_enqueue_inline_style( 'filter-search' );
woodmart_enqueue_js_script( 'search-by-filters' );
}
ob_start();
echo wp_kses_post( $args['before_widget'] );
if ( $title = apply_filters( 'widget_title', empty( $instance['title'] ) ? '' : $instance['title'], $instance ) ) {
echo wp_kses_post( $args['before_title'] ) . $title . wp_kses_post( $args['after_title'] );
}
if ( $template == 'default' ) {
if ( 'dropdown' === $display ) {
wp_enqueue_script( 'selectWoo' );
wp_enqueue_style( 'select2' );
$found = $this->layered_nav_dropdown( $terms, $taxonomy, $query_type );
} else {
$found = $this->layered_nav_list( $terms, $taxonomy, $query_type, $instance );
}
} else {
$found = $this->layered_nav_checkbox_list( $terms, $taxonomy, $query_type, $instance );
}
echo wp_kses_post( $args['after_widget'] );
// Force found when option is selected - do not force found on taxonomy attributes
if ( ! is_tax() && is_array( $_chosen_attributes ) && array_key_exists( $taxonomy, $_chosen_attributes ) ) {
$found = true;
}
if ( ! $found ) {
ob_end_clean();
} else {
echo ob_get_clean();
}
}
/**
* Return the currently viewed taxonomy name.
*
* @return string
*/
protected function get_current_taxonomy() {
return is_tax() ? get_queried_object()->taxonomy : '';
}
/**
* Return the currently viewed term ID.
*
* @return int
*/
protected function get_current_term_id() {
return absint( is_tax() ? get_queried_object()->term_id : 0 );
}
/**
* Return the currently viewed term slug.
*
* @return int
*/
protected function get_current_term_slug() {
return absint( is_tax() ? get_queried_object()->slug : 0 );
}
/**
* Show dropdown layered nav.
*
* @param array $terms Terms.
* @param string $taxonomy Taxonomy.
* @param string $query_type Query Type.
* @return bool Will nav display?
*/
protected function layered_nav_dropdown( $terms, $taxonomy, $query_type ) {
global $wp;
$found = false;
if ( $taxonomy !== $this->get_current_taxonomy() ) {
$term_counts = $this->get_filtered_term_product_counts( wp_list_pluck( $terms, 'term_id' ), $taxonomy, $query_type );
$_chosen_attributes = WC_Query::get_layered_nav_chosen_attributes();
$taxonomy_filter_name = str_replace( 'pa_', '', $taxonomy );
$taxonomy_label = wc_attribute_label( $taxonomy );
/* translators: %s: taxonomy name */
$any_label = apply_filters( 'woocommerce_layered_nav_any_label', sprintf( __( 'Any %s', 'woodmart' ), $taxonomy_label ), $taxonomy_label, $taxonomy );
$multiple = 'or' === $query_type;
$current_values = isset( $_chosen_attributes[ $taxonomy ]['terms'] ) ? $_chosen_attributes[ $taxonomy ]['terms'] : array();
if ( '' === get_option( 'permalink_structure' ) ) {
$form_action = remove_query_arg( array( 'page', 'paged' ), add_query_arg( $wp->query_string, '', home_url( $wp->request ) ) );
} else {
$form_action = preg_replace( '%\/page/[0-9]+%', '', home_url( trailingslashit( $wp->request ) ) );
}
woodmart_enqueue_js_script( 'filter-dropdowns' );
echo '<form method="get" action="' . esc_url( $form_action ) . '" class="wd-widget-layered-nav-dropdown-form">';
echo '<select class="wd-widget-layered-nav-dropdown woodmart_dropdown_layered_nav_' . esc_attr( $taxonomy_filter_name ) . '"' . ( $multiple ? 'multiple="multiple"' : '' ) . ' data-placeholder="' . esc_attr( $any_label ) . '" data-noResults="' . esc_html__( 'No matches found', 'woodmart' ) . '" data-slug="' . esc_attr( $taxonomy_filter_name ) . '">';
echo '<option value="">' . esc_html( $any_label ) . '</option>';
foreach ( $terms as $term ) {
// If on a term page, skip that term in widget list.
if ( $term->term_id === $this->get_current_term_id() ) {
continue;
}
// Get count based on current view.
$option_is_set = in_array( $term->slug, $current_values, true );
$count = isset( $term_counts[ $term->term_id ] ) ? $term_counts[ $term->term_id ] : 0;
// Only show options with count > 0.
if ( 0 < $count ) {
$found = true;
} elseif ( 0 === $count && ! $option_is_set ) {
continue;
}
echo '<option value="' . esc_attr( urldecode( $term->slug ) ) . '" ' . selected( $option_is_set, true, false ) . '>' . esc_html( $term->name ) . '</option>';
}
echo '</select>';
if ( $multiple ) {
echo '<button class="wd-widget-layered-nav-dropdown__submit" type="submit" value="' . esc_attr__( 'Apply', 'woodmart' ) . '">' . esc_html__( 'Apply', 'woodmart' ) . '</button>';
}
if ( 'or' === $query_type ) {
echo '<input type="hidden" name="query_type_' . esc_attr( $taxonomy_filter_name ) . '" value="or" />';
}
echo '<input type="hidden" name="filter_' . esc_attr( $taxonomy_filter_name ) . '" value="' . esc_attr( implode( ',', $current_values ) ) . '" />';
echo wc_query_string_form_fields( null, array( 'filter_' . $taxonomy_filter_name, 'query_type_' . $taxonomy_filter_name ), '', true ); // @codingStandardsIgnoreLine
echo '</form>';
}
return $found;
}
/**
* Get current page URL for layered nav items.
*
* @return string
*/
protected function get_page_base_url() {
if ( Automattic\Jetpack\Constants::is_defined( 'SHOP_IS_ON_FRONT' ) ) {
$link = home_url();
} elseif ( is_shop() ) {
$link = get_permalink( wc_get_page_id( 'shop' ) );
} 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->slug, $queried_object->taxonomy );
}
// Min/Max.
if ( isset( $_GET['min_price'] ) ) {
$link = add_query_arg( 'min_price', wc_clean( wp_unslash( $_GET['min_price'] ) ), $link );
}
if ( isset( $_GET['max_price'] ) ) {
$link = add_query_arg( 'max_price', wc_clean( wp_unslash( $_GET['max_price'] ) ), $link );
}
// Order by.
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( htmlspecialchars_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 );
}
// All current filters.
if ( $_chosen_attributes = WC_Query::get_layered_nav_chosen_attributes() ) { // phpcs:ignore Squiz.PHP.DisallowMultipleAssignments.Found, WordPress.CodeAnalysis.AssignmentInCondition.Found
foreach ( $_chosen_attributes as $name => $data ) {
$filter_name = wc_attribute_taxonomy_slug( $name );
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( 'woocommerce_widget_get_current_page_url', $link, $this );
}
/**
* Count products within certain terms, taking the main WP query into consideration.
*
* This query allows counts to be generated based on the viewed products, not all products.
*
* @param array $term_ids Term IDs.
* @param string $taxonomy Taxonomy.
* @param string $query_type Query Type.
* @return array
*/
protected function get_filtered_term_product_counts( $term_ids, $taxonomy, $query_type ) {
if ( function_exists( 'WC' ) && version_compare( WC()->version, '5.5.0', '<' ) ) {
global $wpdb;
$tax_query = WC_Query::get_main_tax_query();
$meta_query = WC_Query::get_main_meta_query();
if ( 'or' === $query_type ) {
foreach ( $tax_query as $key => $query ) {
if ( is_array( $query ) && $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 IN ( 'product' )
AND {$wpdb->posts}.post_status = 'publish'
" . $tax_query_sql['where'] . $meta_query_sql['where'] . '
AND terms.term_id IN (' . implode( ',', array_map( 'absint', $term_ids ) ) . ')
';
if ( $search = WC_Query::get_main_search_query_sql() ) {
$query['where'] .= ' AND ' . $search;
if ( woodmart_get_opt( 'search_by_sku' ) ) {
// search for variations with a matching sku and return the parent.
$sku_to_parent_id = $wpdb->get_col( $wpdb->prepare( "SELECT p.post_parent as post_id FROM {$wpdb->posts} as p join {$wpdb->wc_product_meta_lookup} ml on p.ID = ml.product_id and ml.sku LIKE '%%%s%%' where p.post_parent <> 0 group by p.post_parent", wc_clean( $_GET['s'] ) ) );
// Search for a regular product that matches the sku.
$sku_to_id = $wpdb->get_col( $wpdb->prepare( "SELECT product_id FROM {$wpdb->wc_product_meta_lookup} WHERE sku LIKE '%%%s%%';", wc_clean( $_GET['s'] ) ) );
$search_ids = array_merge( $sku_to_id, $sku_to_parent_id );
$search_ids = array_filter( array_map( 'absint', $search_ids ) );
if ( sizeof( $search_ids ) > 0 ) {
$query['where'] = str_replace( '))', ") OR ({$wpdb->posts}.ID IN (" . implode( ',', $search_ids ) . ')))', $query['where'] );
}
}
}
$query['group_by'] = 'GROUP BY terms.term_id';
$query = apply_filters( 'woocommerce_get_filtered_term_product_counts_query', $query );
$query = implode( ' ', $query );
// We have a query - let's see if cached results of this query already exist.
$query_hash = md5( $query );
// Maybe store a transient of the count values.
$cache = apply_filters( 'woocommerce_layered_nav_count_maybe_cache', true );
if ( true === $cache ) {
$cached_counts = (array) get_transient( 'wc_layered_nav_counts_' . sanitize_title( $taxonomy ) );
} else {
$cached_counts = array();
}
if ( ! isset( $cached_counts[ $query_hash ] ) ) {
$results = $wpdb->get_results( $query, ARRAY_A ); // @codingStandardsIgnoreLine
$counts = array_map( 'absint', wp_list_pluck( $results, 'term_count', 'term_count_id' ) );
$cached_counts[ $query_hash ] = $counts;
if ( true === $cache ) {
set_transient( 'wc_layered_nav_counts_' . sanitize_title( $taxonomy ), $cached_counts, DAY_IN_SECONDS );
}
}
return array_map( 'absint', (array) $cached_counts[ $query_hash ] );
} else {
return wc_get_container()->get( Filterer::class )->get_filtered_term_product_counts( $term_ids, $taxonomy, $query_type );
}
}
/**
* Show list based layered nav.
*
* @param array $terms
* @param string $taxonomy
* @param string $query_type
* @return bool Will nav display?
*/
protected function layered_nav_list( $terms, $taxonomy, $query_type, $instance ) {
$labels = isset( $instance['labels'] ) ? $instance['labels'] : 'on';
$tooltips = isset( $instance['tooltips'] ) ? $instance['tooltips'] : 'off';
$size = isset( $instance['size'] ) ? $instance['size'] : 'normal';
$style = isset( $instance['style'] ) ? $instance['style'] : 'inherit';
$shape = isset( $instance['shape'] ) ? $instance['shape'] : 'round';
$display = isset( $instance['display'] ) ? $instance['display'] : 'list';
$search_by_filters = isset( $instance['search_by_filters'] ) ? $instance['search_by_filters'] : 0;
$scroll_for_widget = woodmart_get_opt( 'widgets_scroll' );
$is_brand = ( woodmart_get_opt( 'brands_attribute' ) == $taxonomy );
if ( 'inherit' === $style ) {
$style = woodmart_wc_get_attribute_term( $taxonomy, 'swatch_style' );
}
if ( 'inherit' === $shape ) {
$shape = woodmart_wc_get_attribute_term( $taxonomy, 'swatch_shape' );
if ( ! $shape ) {
$shape = 'round';
}
}
$class = 'wd-labels-' . $labels;
$class .= ' wd-size-' . $size;
$class .= ' wd-layout-' . $display;
if ( $style ) {
$class .= ' wd-text-style-' . $style;
woodmart_enqueue_inline_style( 'woo-mod-swatches-style-' . $style );
} else {
$class .= ' wd-text-style-1';
woodmart_enqueue_inline_style( 'woo-mod-swatches-style-1' );
}
if ( $is_brand ) {
$class .= ' wd-swatches-brands';
} else {
if ( $style ) {
$class .= ' wd-bg-style-' . $style;
} else {
$class .= ' wd-bg-style-4';
woodmart_enqueue_inline_style( 'woo-mod-swatches-style-4' );
}
$class .= ' wd-shape-' . $shape;
}
if ( in_array( $size, array( 'small', 'normal', 'large' ), true ) ) {
$class .= woodmart_get_old_classes( ' swatches-' . $size );
}
if ( $search_by_filters ) {
$taxonomy_object = get_taxonomy( $taxonomy );
if ( isset( $taxonomy_object->labels->singular_name ) ) {
$label = $taxonomy_object->labels->singular_name;
} else {
$label = str_replace( 'pa_', ' ', $taxonomy );
}
$placeholder = sprintf( esc_html__( 'Find a %s', 'woodmart' ), $label );
?>
<div class="wd-filter-wrapper">
<div class="wd-filter-search wd-search">
<input type="text" placeholder="<?php echo esc_attr( $placeholder ); ?>" aria-label="<?php echo esc_attr( $placeholder ); ?>">
<span class="wd-filter-search-clear wd-action-btn wd-style-icon wd-cross-icon">
<a href="#" aria-label="<?php esc_attr__( 'Clear search', 'woodmart' ); ?>"></a>
</span>
</div>
<?php
}
// List display
if ( $scroll_for_widget ) {
echo '<div class="wd-scroll">';
$class .= ' wd-scroll-content';
}
echo '<ul class="wd-swatches-filter wd-filter-list ' . esc_attr( $class ) . '">';
$term_counts = $this->get_filtered_term_product_counts( wp_list_pluck( $terms, 'term_id' ), $taxonomy, $query_type );
$_chosen_attributes = WC_Query::get_layered_nav_chosen_attributes();
$found = false;
foreach ( $terms as $term ) {
$current_values = isset( $_chosen_attributes[ $taxonomy ]['terms'] ) ? $_chosen_attributes[ $taxonomy ]['terms'] : array();
$option_is_set = in_array( $term->slug, $current_values );
$count = isset( $term_counts[ $term->term_id ] ) ? $term_counts[ $term->term_id ] : 0;
// skip the term for the current archive
if ( $this->get_current_term_id() === $term->term_id ) {
continue;
}
// Only show options with count > 0
if ( 0 < $count ) {
$found = true;
} elseif ( 0 === $count && ! $option_is_set ) {
continue;
}
$filter_name = 'filter_' . sanitize_title( str_replace( 'pa_', '', $taxonomy ) );
$current_filter = isset( $_GET[ $filter_name ] ) ? explode( ',', wc_clean( $_GET[ $filter_name ] ) ) : array();
$current_filter = array_map( 'sanitize_title', $current_filter );
if ( ! in_array( $term->slug, $current_filter ) ) {
$current_filter[] = $term->slug;
}
$base_link = $this->get_page_base_url();
$link = remove_query_arg( $filter_name, $base_link );
// Add current filters to URL.
foreach ( $current_filter as $key => $value ) {
// Exclude query arg for current term archive term.
if ( $value === $this->get_current_term_slug() ) {
unset( $current_filter[ $key ] );
}
// Exclude self so filter can be unset on click.
if ( $option_is_set && $value === $term->slug ) {
unset( $current_filter[ $key ] );
}
}
if ( ! empty( $current_filter ) ) {
asort( $current_filter );
$link = add_query_arg( $filter_name, implode( ',', $current_filter ), $link );
// Add Query type Arg to URL.
if ( 'or' === $query_type && ! ( 1 === count( $current_filter ) && $option_is_set ) ) {
$link = add_query_arg( 'query_type_' . wc_attribute_taxonomy_slug( $taxonomy ), 'or', $link );
}
$link = str_replace( '%2C', ',', $link );
}
// Add swatches block
$swatch_div = $swatch_style = '';
$swatch_color = get_term_meta( $term->term_id, 'color', true );
$swatch_image = get_term_meta( $term->term_id, 'image', true );
$swatch_text = get_term_meta( $term->term_id, 'not_dropdown', true );
$class = $option_is_set ? ' wd-active' : '';
$filter_classes = woodmart_get_old_classes( ' filter-swatch' );
if ( $swatch_color || $swatch_image || $swatch_text ) {
$class .= ' wd-swatch-wrap';
}
if ( ! empty( $swatch_color ) ) {
$filter_classes .= woodmart_get_old_classes( ' with-bg' );
$filter_classes .= ' wd-bg';
$swatch_style = 'background-color: ' . $swatch_color . ';';
}
if ( ( ! empty( $swatch_image ) && ! is_array( $swatch_image ) ) || ( is_array( $swatch_image ) && ! empty( $swatch_image['id'] ) ) ) {
$filter_classes .= woodmart_get_old_classes( ' with-bg' );
$filter_classes .= ' wd-bg';
}
if ( is_array( $swatch_image ) ) {
$swatch_image = wp_get_attachment_image( $swatch_image['id'], 'full' );
} elseif ( $swatch_image ) {
$swatch_image = '<img src="' . $swatch_image . '" alt="' . esc_attr__( 'Swatch image', 'woodmart' ) . '">';
}
if ( ! empty( $swatch_text ) && ! $swatch_style && ! $swatch_image ) {
$filter_classes .= woodmart_get_old_classes( ' with-text' );
$filter_classes .= ' wd-text';
}
if ( $tooltips == 'on' ) {
$filter_classes .= ' wd-tooltip';
}
// END swatches customization
echo '<li class="wc-layered-nav-term' . esc_attr( $class ) . '">';
echo ( true == $option_is_set || $count > 0 ) ? '<a rel="nofollow noopener" href="' . esc_url( apply_filters( 'woocommerce_layered_nav_link', $link ) ) . '" class="layered-nav-link">' : '<span>';
if ( $swatch_style || $swatch_text || $swatch_image ) {
echo '<span class="wd-swatch' . esc_attr( $filter_classes ) . '">';
if ( $swatch_style || $swatch_image ) {
echo '<span class="wd-swatch-bg" style="'. $swatch_style .'">';
if ( $swatch_image ) {
echo $swatch_image;
}
echo '</span>';
}
echo '<span class="wd-swatch-text">'. esc_html( $term->name ) . '</span>';
echo '</span>';
}
echo '<span class="wd-filter-lable layer-term-lable">' . esc_html( $term->name ) . '</span>';
echo ( true == $option_is_set || $count > 0 ) ? '</a>' : '</span>';
echo ' <span class="count">' . absint( $count ) . '</span></li>';
}
echo '</ul>';
if ( $scroll_for_widget ) {
echo '</div>';
}
if ( $search_by_filters ) {
echo '</div>';
}
return $found;
}
protected function layered_nav_checkbox_list( $terms, $taxonomy, $query_type, $instance ) {
$query_type = isset( $instance['query_type'] ) ? $instance['query_type'] : 'and';
$title = isset( $instance['filter-title'] ) ? $instance['filter-title'] : esc_html__( 'Filter by', 'woodmart' );
$labels = $instance['labels'] ? 'on' : 'off';
$display = isset( $instance['display'] ) ? $instance['display'] : 'list';
$size = isset( $instance['size'] ) ? $instance['size'] : 'normal';
$style = isset( $instance['style'] ) ? $instance['style'] : 'inherit';
$shape = isset( $instance['shape'] ) ? $instance['shape'] : 'round';
$categories = isset( $instance['categories'] ) ? $instance['categories'] : array();
$show_selected_values = isset( $instance['show_selected_values'] ) ? $instance['show_selected_values'] : 'yes';
$show_dropdown_on = isset( $instance['show_dropdown_on'] ) ? $instance['show_dropdown_on'] : 'click';
$is_on_shop = is_shop() || is_product_taxonomy();
$current_cat = get_queried_object();
if ( isset( $categories[0] ) && $categories[0] && ! in_array( $current_cat->term_id, $categories ) && $is_on_shop ) {
return;
}
$is_brand = ( woodmart_get_opt( 'brands_attribute' ) == $taxonomy );
if ( 'inherit' === $style ) {
$style = woodmart_wc_get_attribute_term( $taxonomy, 'swatch_style' );
}
if ( 'inherit' === $shape ) {
$shape = woodmart_wc_get_attribute_term( $taxonomy, 'swatch_shape' );
if ( ! $shape ) {
$shape = 'round';
}
}
$classes = ' wd-labels-' . $labels;
$classes .= ' wd-layout-' . $display;
$classes .= ' wd-size-' . $size;
if ( $style ) {
$classes .= ' wd-text-style-' . $style;
woodmart_enqueue_inline_style( 'woo-mod-swatches-style-' . $style );
} else {
$classes .= ' wd-text-style-1';
woodmart_enqueue_inline_style( 'woo-mod-swatches-style-1' );
}
if ( $is_brand ) {
$classes .= ' wd-swatches-brands';
} else {
if ( $style ) {
$classes .= ' wd-bg-style-' . $style;
} else {
$classes .= ' wd-bg-style-4';
woodmart_enqueue_inline_style( 'woo-mod-swatches-style-4' );
}
$classes .= ' wd-shape-' . $shape;
}
if ( in_array( $size, array( 'small', 'normal', 'large' ), true ) ) {
$classes .= woodmart_get_old_classes( ' swatches-' . $size );
}
$wrapper_classes = '';
if ( 'or' === $query_type ) {
$wrapper_classes .= ' multi_select';
}
$wrapper_classes .= ' wd-event-' . $show_dropdown_on;
$taxonomy_filter_name = str_replace( 'pa_', '', $taxonomy );
$current_value = isset( $_GET[ 'filter_' . $taxonomy_filter_name ] ) ? sanitize_text_field( $_GET[ 'filter_' . $taxonomy_filter_name ] ) : '';
if ( $is_on_shop ) {
$term_counts = $this->get_filtered_term_product_counts( wp_list_pluck( $terms, 'term_id' ), $taxonomy, $query_type );
}
$_chosen_attributes = WC_Query::get_layered_nav_chosen_attributes();
$found = false;
echo '<div class="wd-pf-checkboxes wd-pf-attributes wd-col' . esc_attr( $wrapper_classes ) . '">';
echo '<input class="result-input" name="filter_' . esc_attr( $taxonomy_filter_name ) . '" type="hidden" value="' . esc_attr( $current_value ) . '">';
if ( $query_type == 'or' ) {
echo '<input name="query_type_' . esc_attr( $taxonomy_filter_name ) . '" type="hidden" value="' . esc_attr( $query_type ) . '">';
}
echo '<div class="wd-pf-title"><span class="title-text">' . esc_html( $title ) . '</span>';
if ( 'yes' === $show_selected_values ) {
echo '<ul class="wd-pf-results"></ul>';
}
echo '</div>';
echo '<div class="wd-pf-dropdown wd-dropdown">';
echo '<div class="wd-scroll">';
echo '<ul class="wd-swatches-filter wd-scroll-content' . esc_attr( $classes ) . '">';
foreach ( $terms as $term ) {
$current_values = isset( $_chosen_attributes[ $taxonomy ]['terms'] ) ? $_chosen_attributes[ $taxonomy ]['terms'] : array();
$option_is_set = in_array( $term->slug, $current_values );
$count = isset( $term_counts[ $term->term_id ] ) ? $term_counts[ $term->term_id ] : 0;
// Only show options with count > 0
if ( $is_on_shop ) {
if ( 0 < $count ) {
$found = true;
} elseif ( 0 === $count && ! $option_is_set ) {
continue;
}
}
// Add swatches block
$swatch_div = $swatch_style = '';
$swatch_color = get_term_meta( $term->term_id, 'color', true );
$swatch_image = get_term_meta( $term->term_id, 'image', true );
$swatch_text = get_term_meta( $term->term_id, 'not_dropdown', true );
$class = $option_is_set ? ' wd-active' : '';
$filter_classes = woodmart_get_old_classes( ' filter-swatch' );
if ( $swatch_color || $swatch_image || $swatch_text ) {
$class .= ' wd-swatch-wrap';
}
if( ! empty( $swatch_color ) ) {
$filter_classes .= ' wd-bg';
$filter_classes .= woodmart_get_old_classes( ' with-bg' );
$swatch_style = 'background-color: ' . $swatch_color .';';
}
if ( ( ! empty( $swatch_image ) && ! is_array( $swatch_image ) ) || ( is_array( $swatch_image ) && ! empty( $swatch_image['id'] ) ) ) {
$filter_classes .= ' wd-bg';
$filter_classes .= woodmart_get_old_classes( ' with-bg' );
}
if ( is_array( $swatch_image ) ) {
$swatch_image = wp_get_attachment_image( $swatch_image['id'], 'full' );
} elseif ( $swatch_image ) {
$swatch_image = '<img src="' . $swatch_image . '" alt="' . esc_attr__( 'Swatch image', 'woodmart' ) . '">';
}
if ( ! empty( $swatch_text ) && ! $swatch_style && ! $swatch_image ) {
$filter_classes .= ' wd-text';
$filter_classes .= woodmart_get_old_classes( ' with-text' );
}
if ( $labels == 'off' ) {
$filter_classes .= ' wd-tooltip';
}
// END swatches customization
echo '<li class="wd-pf-' . esc_attr( $term->slug ) . esc_attr( $class ) . '">';
echo '<a rel="nofollow noopener" href="' . esc_url( get_term_link( $term->term_id, $term->taxonomy ) ) .'" class="pf-value" data-val="' . esc_attr( wc_attribute_taxonomy_slug( $term->slug ) ) . '" data-title="' . esc_attr( $term->name ) . '">';
if ( $swatch_style || $swatch_text || $swatch_image ) {
echo '<span class="wd-swatch' . esc_attr( $filter_classes ) . '">';
if ( $swatch_style || $swatch_image ) {
echo '<span class="wd-swatch-bg" style="' . $swatch_style . '">';
if ( $swatch_image ) {
echo $swatch_image;
}
echo '</span>';
}
echo '<span class="wd-swatch-text">' . esc_html( $term->name ) . '</span>';
echo '</span>';
}
echo '<span class="wd-filter-lable layer-term-lable">' . esc_html( $term->name ) . '</span>';
echo '</a>';
echo '</li>';
}
echo '</ul>';
echo '</div>';
echo '</div>';
echo '</div>';
if ( ! $is_on_shop ) {
$found = true;
}
return $found;
}
function form( $instance ) {
parent::form( $instance );
}
}
}