get_results( $wpdb->prepare(" SELECT DISTINCT ID, post_parent, post_type FROM $wpdb->posts INNER JOIN $wpdb->postmeta ON ID = post_id WHERE post_type IN ( 'product', 'product_variation' ) AND post_status = 'publish' AND meta_key = %s AND meta_value BETWEEN %d AND %d ", '_price', $min, $max ), OBJECT_K ); 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; } } // 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; } } 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; // Not on product page - return if ( sizeof( $woocommerce->query->unfiltered_product_ids ) == 0 ) return; // None shown - 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 (isset($_GET['product_cat'])) $fields .= ''; if (isset($_GET['product_tag'])) $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 ( $min == $max ) return; 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; ?>