get_size_filters();
}
function apply_size_filter( $query ) {
$size_fields = ic_size_field_names();
$meta_query = array();
foreach ( $size_fields as $field_name => $label ) {
if ( is_product_filter_active( $field_name ) ) {
$min_max = apply_filters( 'ic_size_filter_value', get_product_filter_value( $field_name ) );
if ( empty( $min_max[ 1 ] ) ) {
continue;
}
if ( $min_max[ 0 ] === $this->get_min( $field_name, $query ) || $min_max[ 1 ] === $this->get_max( $field_name, $query ) ) {
continue;
}
$this_meta_query = array();
$this_meta_query[ 'relation' ] = 'OR';
$this_meta_query[] = array(
'key' => $field_name,
'value' => $min_max,
'compare' => 'BETWEEN',
'type' => 'numeric',
);
$this_meta_query[] = array(
'key' => '_1' . $field_name . '_filterable',
'value' => $min_max,
'compare' => 'BETWEEN',
'type' => 'numeric',
);
$meta_query[] = $this_meta_query;
}
}
if ( !empty( $meta_query ) ) {
$meta_query[ 'relation' ] = 'AND';
$query->set( 'meta_query', $meta_query );
}
}
static function set_size_filter( $session ) {
$size_fields = ic_size_field_names();
$save = false;
foreach ( $size_fields as $field_name => $label ) {
if ( isset( $_GET[ $field_name ] ) ) {
if ( !is_array( $_GET[ $field_name ] ) ) {
$filter_value = strval( $_GET[ $field_name ] );
} else {
$filter_value = array_map( 'strval', $_GET[ $field_name ] );
}
if ( !empty( $filter_value ) && (is_array( $filter_value ) || ic_string_contains( $filter_value, ';' )) ) {
if ( !is_array( $filter_value ) ) {
$min_max = explode( ';', $filter_value );
} else {
$min_max = $filter_value;
}
if ( !isset( $session[ 'filters' ] ) ) {
$session[ 'filters' ] = array();
}
$session[ 'filters' ][ $field_name ] = $min_max;
} else if ( isset( $session[ 'filters' ][ $field_name ] ) ) {
//unset( $session[ 'filters' ][ $field_name ] );
}
$save = true;
}
}
if ( $save ) {
set_product_catalog_session( $session );
}
}
function get_size_filters() {
$unit = ic_attributes_get_size_unit();
$field_names = ic_size_field_names();
$filter_fields = '';
foreach ( $field_names as $field_name => $label ) {
$min = $this->get_min( $field_name );
$max = $this->get_max( $field_name );
$current_min = $this->get_current_min( $field_name );
$current_max = $this->get_current_max( $field_name );
if ( !empty( $max ) && ($min !== $max || (is_product_filter_active( $field_name ) && $current_max <= $max && $current_min >= $min) ) ) {
$filter_fields .= '
';
}
}
if ( empty( $filter_fields ) ) {
$filter_fields = apply_filters( 'ic_one_size_available', __( 'One size available.', 'ecommerce-product-catalog' ) );
}
return $filter_fields;
}
function get_current_min( $field_name ) {
$min_max = get_product_filter_value( $field_name );
if ( !empty( $min_max[ 0 ] ) ) {
return apply_filters( 'ic_size_filter_current_min', $min_max[ 0 ] );
} else {
return $this->get_min( $field_name );
}
}
function get_current_max( $field_name ) {
$min_max = get_product_filter_value( $field_name );
if ( !empty( $min_max[ 1 ] ) ) {
return apply_filters( 'ic_size_filter_current_max', $min_max[ 1 ] );
} else {
return $this->get_max( $field_name );
}
}
function get_min( $field_name, $query = null ) {
$values = $this->filter_array( array_merge( $this->get_meta_values( $field_name, $query ), $this->get_meta_values( '_1' . $field_name . '_filterable', $query ) ) );
natsort( $values );
$return = apply_filters( 'ic_size_filter_min', intval( reset( $values ) ) );
return $return;
}
function get_max( $field_name, $query = null ) {
$values = $this->filter_array( array_merge( $this->get_meta_values( $field_name, $query ), $this->get_meta_values( '_1' . $field_name . '_filterable', $query ) ) );
natsort( $values );
$return = apply_filters( 'ic_size_filter_max', intval( end( $values ) ) );
return $return;
}
function filter_array( $array ) {
$filtered_value = array_map( 'floatval', array_filter( array_unique( $array ) ) );
return $filtered_value;
}
function get_meta_values( $key = '', $query = null, $type = 'al_product', $status = 'publish' ) {
global $wpdb, $ic_product_filters_query, $ic_ajax_query_vars;
if ( empty( $key ) ) {
return;
}
$r = ic_get_global( 'get_meta_values' . $key );
if ( $r !== false ) {
return $r;
}
$r = array();
if ( (is_ic_taxonomy_page( $query ) || is_ic_product_search( $query )) && !is_ic_product_listing( $query ) /* || !empty( $ic_product_filters_query ) || (is_ic_ajax() && !is_ic_product_listing()) */ ) {
$product_ids = $this->get_current_products( $key );
if ( !empty( $product_ids ) ) {
$r = $wpdb->get_col( $wpdb->prepare( "
SELECT pm.meta_value FROM {$wpdb->postmeta} pm
LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
WHERE
pm.meta_key = '%s'
AND p.post_status = '%s'
AND p.post_type = '%s'
AND p.ID IN ($product_ids)
", $key, $status, $type ) );
}
} else {
$r = $wpdb->get_col( $wpdb->prepare( "
SELECT pm.meta_value FROM {$wpdb->postmeta} pm
LEFT JOIN {$wpdb->posts} p ON p.ID = pm.post_id
WHERE pm.meta_key = '%s'
AND p.post_status = '%s'
AND p.post_type = '%s'
", $key, $status, $type ) );
}
ic_save_global( 'get_meta_values' . $key, $r );
return $r;
}
function get_current_products( $key ) {
global $wp_query, $ic_ajax_query_vars;
if ( !empty( $ic_ajax_query_vars ) && is_ic_ajax() ) {
$query = $ic_ajax_query_vars;
} else {
$query = $wp_query->query;
}
if ( !empty( $wp_query->query_vars ) && is_product_filters_active( array( $key ) ) ) {
if ( !empty( $wp_query->query_vars[ 'tax_query' ] ) ) {
$query[ 'tax_query' ] = $wp_query->query_vars[ 'tax_query' ];
}
}
$query[ 'posts_per_page' ] = 1000;
unset( $query[ 'paged' ] );
$product_ids = ic_get_global( 'get_meta_values_current_ids' );
if ( !$product_ids ) {
remove_action( 'apply_product_filters', array( $this, 'apply_size_filter' ) );
remove_action( 'ic_pre_get_products', 'set_products_limit', 99 );
$products = new WP_QUERY( $query );
add_action( 'apply_product_filters', array( $this, 'apply_size_filter' ) );
add_action( 'ic_pre_get_products', 'set_products_limit', 99 );
$product_ids = implode( ',', wp_list_pluck( $products->posts, 'ID' ) );
ic_save_global( 'get_meta_values_current_ids', $product_ids );
wp_reset_postdata();
}
return $product_ids;
}
}
global $ic_attribute_default_filters;
$ic_attribute_default_filters = new ic_attribute_default_filters;