woo_widget_cssclass = 'widget_layered_nav'; $this->woo_widget_description = __( 'Shows a custom attribute in a widget which lets you narrow down the list of products when viewing product categories.', 'woocommerce' ); $this->woo_widget_idbase = 'woocommerce_layered_nav'; $this->woo_widget_name = __( 'WooCommerce Layered Nav', 'woocommerce' ); /* Widget settings. */ $widget_ops = array( 'classname' => $this->woo_widget_cssclass, 'description' => $this->woo_widget_description ); /* Create the widget. */ $this->WP_Widget( 'woocommerce_layered_nav', $this->woo_widget_name, $widget_ops ); } /** * widget function. * * @see WP_Widget * @access public * @param array $args * @param array $instance * @return void */ function widget( $args, $instance ) { global $_chosen_attributes, $woocommerce, $_attributes_array; extract( $args ); if ( ! is_post_type_archive( 'product' ) && ! is_tax( array_merge( $_attributes_array, array( 'product_cat', 'product_tag' ) ) ) ) return; $current_term = $_attributes_array && is_tax( $_attributes_array ) ? get_queried_object()->term_id : ''; $current_tax = $_attributes_array && is_tax( $_attributes_array ) ? get_queried_object()->taxonomy : ''; $title = apply_filters('widget_title', $instance['title'], $instance, $this->id_base); $taxonomy = $woocommerce->attribute_taxonomy_name($instance['attribute']); $query_type = isset( $instance['query_type'] ) ? $instance['query_type'] : 'and'; $display_type = isset( $instance['display_type'] ) ? $instance['display_type'] : 'list'; if ( ! taxonomy_exists( $taxonomy ) ) return; $terms = get_terms( $taxonomy, array( 'hide_empty' => '1' ) ); if ( count( $terms ) > 0 ) { ob_start(); $found = false; echo $before_widget . $before_title . $title . $after_title; // Force found when option is selected - do not force found on taxonomy attributes if ( ! $_attributes_array || ! is_tax( $_attributes_array ) ) if ( is_array( $_chosen_attributes ) && array_key_exists( $taxonomy, $_chosen_attributes ) ) $found = true; if ( $display_type == 'dropdown' ) { // skip when viewing the taxonomy if ( $current_tax && $taxonomy == $current_tax ) { $found = false; } else { $taxonomy_filter = str_replace( 'pa_', '', $taxonomy ); $found = true; echo ''; $woocommerce->add_inline_js(" jQuery('#dropdown_layered_nav_$taxonomy_filter').change(function(){ location.href = '" . preg_replace( '%\/page/[0-9]+%', '', add_query_arg('filtering', '1', remove_query_arg( array( 'page', 'filter_' . $taxonomy_filter ) ) ) ) . "&filter_$taxonomy_filter=' + jQuery('#dropdown_layered_nav_$taxonomy_filter').val(); }); "); } } else { // List display echo ""; } // End display type conditional echo $after_widget; if ( ! $found ) ob_clean(); else echo ob_get_clean(); } } /** * update function. * * @see WP_Widget->update * @access public * @param array $new_instance * @param array $old_instance * @return array */ function update( $new_instance, $old_instance ) { global $woocommerce; if ( empty( $new_instance['title'] ) ) $new_instance['title'] = $woocommerce->attribute_label( $new_instance['attribute'] ); $instance['title'] = strip_tags( stripslashes($new_instance['title'] ) ); $instance['attribute'] = stripslashes( $new_instance['attribute'] ); $instance['query_type'] = stripslashes( $new_instance['query_type'] ); $instance['display_type'] = stripslashes( $new_instance['display_type'] ); return $instance; } /** * form function. * * @see WP_Widget->form * @access public * @param array $instance * @return void */ function form( $instance ) { global $woocommerce; if ( ! isset( $instance['query_type'] ) ) $instance['query_type'] = 'and'; if ( ! isset( $instance['display_type'] ) ) $instance['display_type'] = 'list'; ?>

attribute_taxonomies; if ( $attribute_taxonomies ) { foreach ( $attribute_taxonomies as $tax ) { $attribute = sanitize_title( $tax->attribute_name ); $taxonomy = $woocommerce->attribute_taxonomy_name( $attribute ); // create an array of product attribute taxonomies $_attributes_array[] = $taxonomy; $name = 'filter_' . $attribute; $query_type_name = 'query_type_' . $attribute; if ( ! empty( $_GET[ $name ] ) && taxonomy_exists( $taxonomy ) ) { $_chosen_attributes[ $taxonomy ]['terms'] = explode( ',', $_GET[ $name ] ); if ( ! empty( $_GET[ $query_type_name ] ) && $_GET[ $query_type_name ] == 'or' ) $_chosen_attributes[ $taxonomy ]['query_type'] = 'or'; else $_chosen_attributes[ $taxonomy ]['query_type'] = 'and'; } } } add_filter('loop_shop_post_in', 'woocommerce_layered_nav_query'); } } add_action( 'init', 'woocommerce_layered_nav_init', 1 ); /** * Layered Nav post filter * * @package WooCommerce/Widgets * @access public * @param array $filtered_posts * @return array */ function woocommerce_layered_nav_query( $filtered_posts ) { global $_chosen_attributes, $woocommerce, $wp_query; if ( sizeof( $_chosen_attributes ) > 0 ) { $matched_products = array(); $filtered_attribute = false; foreach ( $_chosen_attributes as $attribute => $data ) { $matched_products_from_attribute = array(); $filtered = false; if ( sizeof( $data['terms'] ) > 0 ) { foreach ( $data['terms'] as $value ) { $posts = get_posts( array( 'post_type' => 'product', 'numberposts' => -1, 'post_status' => 'publish', 'fields' => 'ids', 'no_found_rows' => true, 'tax_query' => array( array( 'taxonomy' => $attribute, 'terms' => $value, 'field' => 'id' ) ) ) ); // AND or OR if ( $data['query_type'] == 'or' ) { if ( ! is_wp_error( $posts ) && ( sizeof( $matched_products_from_attribute ) > 0 || $filtered ) ) $matched_products_from_attribute = array_merge($posts, $matched_products_from_attribute); elseif ( ! is_wp_error( $posts ) ) $matched_products_from_attribute = $posts; } else { if ( ! is_wp_error( $posts ) && ( sizeof( $matched_products_from_attribute ) > 0 || $filtered ) ) $matched_products_from_attribute = array_intersect($posts, $matched_products_from_attribute); elseif ( ! is_wp_error( $posts ) ) $matched_products_from_attribute = $posts; } $filtered = true; } } if ( sizeof( $matched_products ) > 0 || $filtered_attribute ) $matched_products = array_intersect( $matched_products_from_attribute, $matched_products ); else $matched_products = $matched_products_from_attribute; $filtered_attribute = true; } if ( $filtered ) { $woocommerce->query->layered_nav_post__in = $matched_products; $woocommerce->query->layered_nav_post__in[] = 0; 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; }