I have products with price per package in eshop. I also created custom field with product price per square meters. Products are sold only by package not by square meters, but on archive page I need filtering products by price per square meters. I unregistered WC_Widget_Price_Filter widget and registered modified version of that widget, which displays correct min and max prices in square meters in filter slider. I modified function price_filter_post_clauses to display correct products. Function is located in includes/class-wc-query.php.
public function price_filter_post_clauses( $ args, $ wp_query ) { global $ wpdb; // phpcs:ignore WordPress.Security.NonceVerification.Recommended if ( ! $ wp_query->is_main_query() || ( ! isset( $ _GET['max_price'] ) && ! isset( $ _GET['min_price'] ) ) ) { return $ args; } // phpcs:disable WordPress.Security.NonceVerification.Recommended $ current_min_price = isset( $ _GET['min_price'] ) ? floatval( wp_unslash( $ _GET['min_price'] ) ) : 0; $ current_max_price = isset( $ _GET['max_price'] ) ? floatval( wp_unslash( $ _GET['max_price'] ) ) : PHP_INT_MAX; // phpcs:enable WordPress.Security.NonceVerification.Recommended /** * Adjust if the store taxes are not displayed how they are stored. * Kicks in when prices excluding tax are displayed including tax. */ if ( wc_tax_enabled() && 'incl' === get_option( 'woocommerce_tax_display_shop' ) && ! wc_prices_include_tax() ) { $ tax_class = apply_filters( 'woocommerce_price_filter_widget_tax_class', '' ); // Uses standard tax class. $ tax_rates = WC_Tax::get_rates( $ tax_class ); if ( $ tax_rates ) { $ current_min_price -= WC_Tax::get_tax_total( WC_Tax::calc_inclusive_tax( $ current_min_price, $ tax_rates ) ); $ current_max_price -= WC_Tax::get_tax_total( WC_Tax::calc_inclusive_tax( $ current_max_price, $ tax_rates ) ); } } $ args['join'] = $ this->append_product_sorting_table_join( $ args['join'] ); $ args['where'] .= $ wpdb->prepare( ' AND wc_product_meta_lookup.min_price >= %f AND wc_product_meta_lookup.max_price <= %f ', $ current_min_price, $ current_max_price ); return $ args; }
I modified sql in $ args[‘join’] and $ args[‘where’]. Is it possible to modify this function without modifying it directly?