array( 'product_variation', '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) : if ($product->post_type == 'product') $matched_products[] = $product->ID; if ($product->post_parent>0 && !in_array($product->post_parent, $matched_products)) $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; endif; return (array) $filtered_posts; } /** * Price Filter post Widget */ class WooCommerce_Widget_Price_Filter extends WP_Widget { /** Variables to setup the widget. */ var $woo_widget_cssclass; var $woo_widget_description; var $woo_widget_idbase; var $woo_widget_name; /** constructor */ function WooCommerce_Widget_Price_Filter() { /* 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.', 'woocommerce' ); $this->woo_widget_idbase = 'woocommerce_price_filter'; $this->woo_widget_name = __('WooCommerce Price Filter', 'woocommerce' ); /* 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); } /** @see WP_Widget */ function widget( $args, $instance ) { extract($args); global $_chosen_attributes, $wpdb, $woocommerce, $wp_query; if (!is_tax( 'product_cat' ) && !is_post_type_archive('product') && !is_tax( 'product_tag' )) return; $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 = ''; if (isset($_GET['post_type'])) $fields .= ''; if ($_chosen_attributes) foreach ($_chosen_attributes as $attribute => $data) : $fields .= ''; if ($data['query_type']=='or') $fields .= ''; endforeach; $min = $max = 0; $post_min = $post_max = ''; if (sizeof($woocommerce->query->layered_nav_product_ids)==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'")); else : $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 ( $wpdb->posts.ID IN (".implode(',', $woocommerce->query->layered_nav_product_ids).") OR ( $wpdb->posts.post_parent IN (".implode(',', $woocommerce->query->layered_nav_product_ids).") AND $wpdb->posts.post_parent != 0 ) )")); endif; if (isset($_SESSION['min_price'])) $post_min = $_SESSION['min_price']; if (isset($_SESSION['max_price'])) $post_max = $_SESSION['max_price']; echo '
'.$fields.'
'; echo $after_widget; } /** @see WP_Widget->update */ function update( $new_instance, $old_instance ) { if (!isset($new_instance['title']) || empty($new_instance['title'])) $new_instance['title'] = __('Filter by price', 'woocommerce'); $instance['title'] = strip_tags(stripslashes($new_instance['title'])); return $instance; } /** @see WP_Widget->form */ function form( $instance ) { global $wpdb; ?>