businessdad icon

Currency Switcher - Dynamic multi-currency price filter

businessdad | PRO | 05/03/17 06:50:12 PM UTC | 0 ⭐ | 953 👁️ | Never ⏰ | []
PHP |

2.51 KB

|

None

|

0 👍

/

0 👎

/**
 * Aelia Currency Switcher - Filtering products with dynamic multi-currency pricing.
 * The following code improves the accuracy of the price filtering widget, by matching the minimum
 * and maximum price against the product prices in the active currency. 
 *
 * IMPORTANT
 * For an accurate filtering, the product prices have to be calculated on the fly, as they depend
 * on factors such as the exchange rates at the moment of filtering. This means that the filtering
 * logic can be significantly heavier and, consequently, slower. We recommend that you test this
 * code on a staging copy of your site, and optimise it for your own specific setup, before using
 * it on a production site.
 *
 * HOW TO USE THIS CODE
 * Simply add the code to the bottom of your theme's functions.php file, and it
 * will run automatically. For more information: https://www.skyverge.com/blog/add-custom-code-to-wordpress/
 *
 * GPL DISCLAIMER
 * Because this code program is free of charge, there is no warranty for it, to the extent permitted by applicable law.
 * Except when otherwise stated in writing the copyright holders and/or other parties provide the program "as is"
 * without warranty of any kind, either expressed or implied, including, but not limited to, the implied warranties of
 * merchantability and fitness for a particular purpose. The entire risk as to the quality and performance of the program
 * is with you. should the program prove defective, you assume the cost of all necessary servicing, repair or correction.
 *
 * Need a consultation, or assistance to customise this code? Find us on Codeable: https://aelia.co/hire_us
 */
add_filter('loop_shop_post_in', function($product_ids) {
  $max_price = $_GET['max_price'];
  $min_price = $_GET['min_price'];
 
  // Eventually, alter the parameters to exclude products that would be hidden
  // regardless of the price, e.g. hidden products, out of stock products, etc.
  $posts = get_posts(array(
    'post_type' => 'product'
  ));
  
  foreach($posts as $entry) {
    // Skip any product that might already be in the list
    if(in_array($entry->ID, $product_ids)) {
      continue;
    }
    
    $product = wc_get_product($entry);
    // Get the price on the fly. This will return the price in the active currency,
    // converted automatically if needed
    $product_price = $product->get_price();
    if($product_price >= $min_price && product_price <= $max_price) {
      $product_ids[] = $entry->ID;
    }
  }
 
  return $product_ids;
}, 10, 1);

Comments