2012-10-14 12:06:37 +00:00
< ? php
2014-11-19 17:12:56 +00:00
if ( ! defined ( 'ABSPATH' ) ) {
exit ;
}
2012-10-14 12:06:37 +00:00
/**
2015-12-17 07:23:58 +00:00
* Layered Navigation Filters Widget .
2012-10-14 12:06:37 +00:00
*
2014-11-15 01:12:59 +00:00
* @ author WooThemes
* @ category Widgets
* @ package WooCommerce / Widgets
* @ version 2.3 . 0
* @ extends WC_Widget
2012-10-14 12:06:37 +00:00
*/
2013-05-24 15:51:58 +00:00
class WC_Widget_Layered_Nav_Filters extends WC_Widget {
2012-10-14 12:06:37 +00:00
/**
2015-11-03 13:31:20 +00:00
* Constructor .
2012-10-14 12:06:37 +00:00
*/
2013-05-24 15:51:58 +00:00
public function __construct () {
$this -> widget_cssclass = 'woocommerce widget_layered_nav_filters' ;
$this -> widget_description = __ ( 'Shows active layered nav filters so users can see and deactivate them.' , 'woocommerce' );
$this -> widget_id = 'woocommerce_layered_nav_filters' ;
2016-10-12 10:16:30 +00:00
$this -> widget_name = __ ( 'WooCommerce layered nav filters' , 'woocommerce' );
2013-05-24 15:51:58 +00:00
$this -> settings = array (
'title' => array (
'type' => 'text' ,
2016-10-12 10:16:30 +00:00
'std' => __ ( 'Active filters' , 'woocommerce' ),
2016-08-27 01:46:45 +00:00
'label' => __ ( 'Title' , 'woocommerce' ),
),
2013-05-24 15:51:58 +00:00
);
2014-11-15 01:12:59 +00:00
2013-05-24 15:51:58 +00:00
parent :: __construct ();
2012-10-14 12:06:37 +00:00
}
2016-11-21 12:14:57 +00:00
/**
* Get current page URL for layered nav items .
*
* @ return string
*/
protected function get_page_base_url () {
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 -> slug , $queried_object -> taxonomy );
}
// Min/Max
if ( isset ( $_GET [ 'min_price' ] ) ) {
$link = add_query_arg ( 'min_price' , wc_clean ( $_GET [ 'min_price' ] ), $link );
}
if ( isset ( $_GET [ 'max_price' ] ) ) {
$link = add_query_arg ( 'max_price' , wc_clean ( $_GET [ 'max_price' ] ), $link );
}
// Orderby
if ( isset ( $_GET [ 'orderby' ] ) ) {
$link = add_query_arg ( 'orderby' , wc_clean ( $_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 ( htmlspecialchars_decode ( get_search_query () ) ), $link );
}
// Post Type Arg
if ( isset ( $_GET [ 'post_type' ] ) ) {
$link = add_query_arg ( 'post_type' , wc_clean ( $_GET [ 'post_type' ] ), $link );
}
// Min Rating Arg
2016-12-09 15:43:25 +00:00
if ( isset ( $_GET [ 'rating_filter' ] ) ) {
$link = add_query_arg ( 'rating_filter' , wc_clean ( $_GET [ 'rating_filter' ] ), $link );
2016-11-21 12:14:57 +00:00
}
// All current filters
if ( $_chosen_attributes = WC_Query :: get_layered_nav_chosen_attributes () ) {
foreach ( $_chosen_attributes as $name => $data ) {
$filter_name = sanitize_title ( str_replace ( 'pa_' , '' , $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 $link ;
}
2012-10-14 12:06:37 +00:00
/**
2016-01-06 18:58:38 +00:00
* Output widget .
2012-10-14 12:06:37 +00:00
*
* @ see WP_Widget
* @ param array $args
* @ param array $instance
*/
2013-05-24 15:51:58 +00:00
public function widget ( $args , $instance ) {
2014-11-15 01:12:59 +00:00
if ( ! is_post_type_archive ( 'product' ) && ! is_tax ( get_object_taxonomies ( 'product' ) ) ) {
2012-10-14 12:06:37 +00:00
return ;
2014-11-15 01:12:59 +00:00
}
2012-11-27 16:22:47 +00:00
2016-02-10 10:19:32 +00:00
$_chosen_attributes = WC_Query :: get_layered_nav_chosen_attributes ();
2016-11-21 12:14:57 +00:00
$min_price = isset ( $_GET [ 'min_price' ] ) ? wc_clean ( $_GET [ 'min_price' ] ) : 0 ;
$max_price = isset ( $_GET [ 'max_price' ] ) ? wc_clean ( $_GET [ 'max_price' ] ) : 0 ;
2016-12-09 15:43:25 +00:00
$rating_filter = isset ( $_GET [ 'rating_filter' ] ) ? array_filter ( array_map ( 'absint' , explode ( ',' , $_GET [ 'rating_filter' ] ) ) ) : array ();
2016-11-21 12:14:57 +00:00
$base_link = $this -> get_page_base_url ();
2015-11-13 09:47:27 +00:00
2016-12-09 15:43:25 +00:00
if ( 0 < count ( $_chosen_attributes ) || 0 < $min_price || 0 < $max_price || ! empty ( $rating_filter ) ) {
2012-11-27 16:22:47 +00:00
2014-11-15 01:12:59 +00:00
$this -> widget_start ( $args , $instance );
2012-10-14 12:06:37 +00:00
2014-11-15 01:12:59 +00:00
echo '<ul>' ;
2012-11-27 16:22:47 +00:00
2012-10-14 12:06:37 +00:00
// Attributes
2016-06-06 18:39:23 +00:00
if ( ! empty ( $_chosen_attributes ) ) {
2013-08-04 03:59:26 +00:00
foreach ( $_chosen_attributes as $taxonomy => $data ) {
2015-12-04 13:55:31 +00:00
foreach ( $data [ 'terms' ] as $term_slug ) {
2016-02-09 14:41:17 +00:00
if ( ! $term = get_term_by ( 'slug' , $term_slug , $taxonomy ) ) {
2015-06-08 16:10:23 +00:00
continue ;
}
2016-02-09 14:41:17 +00:00
$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 );
$new_filter = array_diff ( $current_filter , array ( $term_slug ) );
2012-11-27 16:22:47 +00:00
2016-11-21 12:14:57 +00:00
$link = remove_query_arg ( array ( 'add-to-cart' , $filter_name ), $base_link );
2012-11-27 16:22:47 +00:00
2014-11-15 01:12:59 +00:00
if ( sizeof ( $new_filter ) > 0 ) {
2016-02-09 14:41:17 +00:00
$link = add_query_arg ( $filter_name , implode ( ',' , $new_filter ), $link );
2014-11-15 01:12:59 +00:00
}
2012-11-27 16:22:47 +00:00
2016-11-04 15:41:51 +00:00
echo '<li class="chosen"><a aria-label="' . esc_attr__ ( 'Remove filter' , 'woocommerce' ) . '" href="' . esc_url ( $link ) . '">' . esc_html ( $term -> name ) . '</a></li>' ;
2013-08-04 03:59:26 +00:00
}
2012-10-14 12:06:37 +00:00
}
}
2012-11-27 16:22:47 +00:00
2013-01-12 13:03:19 +00:00
if ( $min_price ) {
2016-11-21 12:14:57 +00:00
$link = remove_query_arg ( 'min_price' , $base_link );
2016-11-04 15:41:51 +00:00
echo '<li class="chosen"><a aria-label="' . esc_attr__ ( 'Remove filter' , 'woocommerce' ) . '" href="' . esc_url ( $link ) . '">' . sprintf ( __ ( 'Min %s' , 'woocommerce' ), wc_price ( $min_price ) ) . '</a></li>' ;
2012-10-14 12:06:37 +00:00
}
2012-11-27 16:22:47 +00:00
2013-01-12 13:03:19 +00:00
if ( $max_price ) {
2016-11-21 12:14:57 +00:00
$link = remove_query_arg ( 'max_price' , $base_link );
2016-11-04 15:41:51 +00:00
echo '<li class="chosen"><a aria-label="' . esc_attr__ ( 'Remove filter' , 'woocommerce' ) . '" href="' . esc_url ( $link ) . '">' . sprintf ( __ ( 'Max %s' , 'woocommerce' ), wc_price ( $max_price ) ) . '</a></li>' ;
2012-10-14 12:06:37 +00:00
}
2012-11-27 16:22:47 +00:00
2016-12-09 15:43:25 +00:00
if ( ! empty ( $rating_filter ) ) {
foreach ( $rating_filter as $rating ) {
$link_ratings = implode ( ',' , array_diff ( $rating_filter , array ( $rating ) ) );
$link = $link_ratings ? add_query_arg ( 'rating_filter' , $link_ratings ) : remove_query_arg ( 'rating_filter' , $base_link );
2017-03-14 12:32:34 +00:00
echo '<li class="chosen"><a aria-label="' . esc_attr__ ( 'Remove filter' , 'woocommerce' ) . '" href="' . esc_url ( $link ) . '">' . sprintf ( esc_html__ ( 'Rated %s out of 5' , 'woocommerce' ), esc_html ( $rating ) ) . '</a></li>' ;
2016-12-09 15:43:25 +00:00
}
2015-11-13 09:47:27 +00:00
}
2014-11-15 01:12:59 +00:00
echo '</ul>' ;
2012-10-14 12:06:37 +00:00
2014-11-15 01:12:59 +00:00
$this -> widget_end ( $args );
2012-10-14 12:06:37 +00:00
}
}
2013-05-24 15:51:58 +00:00
}