Woocommerce Filter Products by Price widget – filter by price in custom field

Question

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?

0
jaroMT 8 months 2020-11-27T13:10:18-05:00 0 Answers 12 views 0

Leave an answer

Browse
Browse