Automattic\WooCommerce\Blocks
QueryFilters::get_price_filter_query_for_displayed_taxes
Get query for price filters when dealing with displayed taxes.
Method of the class: QueryFilters{}
No Hooks.
Returns
String. Constructed query.
Usage
// private - for code of main (parent) class only $result = $this->get_price_filter_query_for_displayed_taxes( $price_filter, $column, $operator );
- $price_filter(float) (required)
- Price filter to apply.
- $column(string)
- Price being filtered (min or max).
Default: 'min_price' - $operator(string)
- Comparison operator for column.
Default: '>='
QueryFilters::get_price_filter_query_for_displayed_taxes() QueryFilters::get price filter query for displayed taxes code WC 10.3.6
private function get_price_filter_query_for_displayed_taxes( $price_filter, $column = 'min_price', $operator = '>=' ) {
global $wpdb;
// Select only used tax classes to avoid unwanted calculations.
$product_tax_classes = array_filter( $wpdb->get_col( "SELECT DISTINCT tax_class FROM {$wpdb->wc_product_meta_lookup};" ) );
if ( empty( $product_tax_classes ) ) {
return '';
}
$or_queries = array();
// We need to adjust the filter for each possible tax class and combine the queries into one.
foreach ( $product_tax_classes as $tax_class ) {
$adjusted_price_filter = $this->adjust_price_filter_for_tax_class( $price_filter, $tax_class );
$or_queries[] = $wpdb->prepare(
'( wc_product_meta_lookup.tax_class = %s AND wc_product_meta_lookup.`' . esc_sql( $column ) . '` ' . esc_sql( $operator ) . ' %f )',
$tax_class,
$adjusted_price_filter
);
}
// phpcs:disable WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQL.NotPrepared
return $wpdb->prepare(
' AND (
wc_product_meta_lookup.tax_status = "taxable" AND ( 0=1 OR ' . implode( ' OR ', $or_queries ) . ')
OR ( wc_product_meta_lookup.tax_status != "taxable" AND wc_product_meta_lookup.`' . esc_sql( $column ) . '` ' . esc_sql( $operator ) . ' %f )
) ',
$price_filter
);
// phpcs:enable WordPress.DB.PreparedSQL.InterpolatedNotPrepared, WordPress.DB.PreparedSQL.NotPrepared
}