2011-08-10 17:11:11 +00:00
< ? php
/**
2011-09-04 00:02:44 +00:00
* Price Filter Widget and related functions
2011-08-10 17:11:11 +00:00
*
* Generates a range slider to filter products by price
*
* @ package WooCommerce
* @ category Widgets
* @ author WooThemes
*/
2011-09-04 00:02:44 +00:00
/**
* Price filter Init
*/
add_action ( 'init' , 'woocommerce_price_filter_init' );
2011-08-10 17:11:11 +00:00
function woocommerce_price_filter_init () {
unset ( $_SESSION [ 'min_price' ]);
unset ( $_SESSION [ 'max_price' ]);
if ( isset ( $_GET [ 'min_price' ])) :
$_SESSION [ 'min_price' ] = $_GET [ 'min_price' ];
endif ;
if ( isset ( $_GET [ 'max_price' ])) :
$_SESSION [ 'max_price' ] = $_GET [ 'max_price' ];
2011-09-04 00:02:44 +00:00
endif ;
}
/**
* Price Filter post filter
*/
2011-09-21 16:58:05 +00:00
add_filter ( 'loop_shop_post_in' , 'woocommerce_price_filter' );
2011-09-04 00:02:44 +00:00
function woocommerce_price_filter ( $filtered_posts ) {
if ( isset ( $_GET [ 'max_price' ]) && isset ( $_GET [ 'min_price' ])) :
$matched_products = array ();
$matched_products_query = get_posts ( array (
'post_type' => 'product' ,
'post_status' => 'publish' ,
'posts_per_page' => - 1 ,
'meta_query' => array (
array (
'key' => 'price' ,
'value' => array ( $_GET [ 'min_price' ], $_GET [ 'max_price' ] ),
'type' => 'NUMERIC' ,
'compare' => 'BETWEEN'
)
)
));
if ( $matched_products_query ) :
foreach ( $matched_products_query as $product ) :
$matched_products [] = $product -> ID ;
if ( $product -> post_parent > 0 ) $matched_products [] = $product -> post_parent ;
endforeach ;
endif ;
// Filter the id's
if ( sizeof ( $filtered_posts ) == 0 ) :
$filtered_posts = $matched_products ;
$filtered_posts [] = 0 ;
else :
$filtered_posts = array_intersect ( $filtered_posts , $matched_products );
$filtered_posts [] = 0 ;
endif ;
2011-08-10 17:11:11 +00:00
endif ;
2011-09-04 00:02:44 +00:00
return ( array ) $filtered_posts ;
2011-08-10 17:11:11 +00:00
}
2011-09-04 00:02:44 +00:00
/**
* Price Filter post Widget
*/
2011-08-10 17:11:11 +00:00
class WooCommerce_Widget_Price_Filter extends WP_Widget {
2011-08-26 21:28:55 +00:00
/** Variables to setup the widget. */
var $woo_widget_cssclass ;
var $woo_widget_description ;
var $woo_widget_idbase ;
var $woo_widget_name ;
2011-08-10 17:11:11 +00:00
/** constructor */
function WooCommerce_Widget_Price_Filter () {
2011-08-26 21:28:55 +00:00
/* Widget variable settings. */
$this -> woo_widget_cssclass = 'widget_price_filter' ;
$this -> woo_widget_description = __ ( 'Shows a price filter slider in a widget which lets you narrow down the list of shown products when viewing product categories.' , 'woothemes' );
$this -> woo_widget_idbase = 'woocommerce_price_filter' ;
$this -> woo_widget_name = __ ( 'WooCommerce Price Filter' , 'woothemes' );
/* Widget settings. */
$widget_ops = array ( 'classname' => $this -> woo_widget_cssclass , 'description' => $this -> woo_widget_description );
/* Create the widget. */
$this -> WP_Widget ( 'price_filter' , $this -> woo_widget_name , $widget_ops );
2011-08-10 17:11:11 +00:00
}
2011-09-06 11:11:22 +00:00
/** @see WP_Widget */
2011-08-10 17:11:11 +00:00
function widget ( $args , $instance ) {
extract ( $args );
if ( ! is_tax ( 'product_cat' ) && ! is_post_type_archive ( 'product' ) && ! is_tax ( 'product_tag' )) return ;
2011-09-06 11:11:22 +00:00
global $_chosen_attributes , $wpdb , $woocommerce ;
2011-08-31 00:29:02 +00:00
2011-08-10 17:11:11 +00:00
$title = $instance [ 'title' ];
$title = apply_filters ( 'widget_title' , $title , $instance , $this -> id_base );
echo $before_widget . $before_title . $title . $after_title ;
// Remember current filters/search
$fields = '' ;
if ( get_search_query ()) $fields = '<input type="hidden" name="s" value="' . get_search_query () . '" />' ;
2011-09-30 19:14:12 +00:00
if ( isset ( $_GET [ 'post_type' ])) $fields .= '<input type="hidden" name="post_type" value="' . esc_attr ( $_GET [ 'post_type' ] ) . '" />' ;
2011-08-10 17:11:11 +00:00
if ( $_chosen_attributes ) foreach ( $_chosen_attributes as $attribute => $value ) :
2011-09-30 19:14:12 +00:00
$fields .= '<input type="hidden" name="' . esc_attr ( str_replace ( 'pa_' , 'filter_' , $attribute ) ) . '" value="' . esc_attr ( implode ( ',' , $value ) ) . '" />' ;
2011-08-10 17:11:11 +00:00
endforeach ;
$min = 0 ;
$max = ceil ( $wpdb -> get_var ( " SELECT max(meta_value + 0)
FROM $wpdb -> posts
LEFT JOIN $wpdb -> postmeta ON $wpdb -> posts . ID = $wpdb -> postmeta . post_id
WHERE meta_key = 'price' AND (
2011-09-16 08:10:12 +00:00
$wpdb -> posts . ID IN ( " .implode(',', $woocommerce->query ->layered_nav_product_ids). " )
2011-08-10 17:11:11 +00:00
OR (
2011-09-16 08:10:12 +00:00
$wpdb -> posts . post_parent IN ( " .implode(',', $woocommerce->query ->layered_nav_product_ids). " )
2011-08-10 17:11:11 +00:00
AND $wpdb -> posts . post_parent != 0
)
) " ));
2011-09-30 19:14:12 +00:00
echo ' < form method = " get " action = " " >
2011-08-10 17:11:11 +00:00
< div class = " price_slider_wrapper " >
< div class = " price_slider " ></ div >
< div class = " price_slider_amount " >
2011-10-26 19:10:36 +00:00
< button type = " submit " class = " button " > '.__(' Filter ', ' woothemes ').' </ button > '.__(' Price : ', ' woothemes ').' < span ></ span >
2011-09-30 19:14:12 +00:00
< input type = " hidden " id = " max_price " name = " max_price " value = " '.esc_attr( $max ).' " />
< input type = " hidden " id = " min_price " name = " min_price " value = " '.esc_attr( $min ).' " />
2011-08-10 17:11:11 +00:00
'.$fields.'
</ div >
</ div >
</ form > ' ;
echo $after_widget ;
}
2011-09-06 11:11:22 +00:00
/** @see WP_Widget->update */
2011-08-10 17:11:11 +00:00
function update ( $new_instance , $old_instance ) {
if ( ! isset ( $new_instance [ 'title' ]) || empty ( $new_instance [ 'title' ])) $new_instance [ 'title' ] = __ ( 'Filter by price' , 'woothemes' );
$instance [ 'title' ] = strip_tags ( stripslashes ( $new_instance [ 'title' ]));
return $instance ;
}
2011-09-06 11:11:22 +00:00
/** @see WP_Widget->form */
2011-08-10 17:11:11 +00:00
function form ( $instance ) {
global $wpdb ;
?>
< p >< label for = " <?php echo $this->get_field_id ('title'); ?> " >< ? php _e ( 'Title:' , 'woothemes' ) ?> </label>
2011-09-19 06:01:26 +00:00
< input type = " text " class = " widefat " id = " <?php echo esc_attr( $this->get_field_id ('title') ); ?> " name = " <?php echo esc_attr( $this->get_field_name ('title') ); ?> " value = " <?php if (isset ( $instance['title'] )) { echo esc_attr( $instance['title'] );} ?> " /></ p >
2011-08-10 17:11:11 +00:00
< ? php
}
} // class WooCommerce_Widget_Price_Filter