/** * Example class showing how to use the filters provided by the Aelia Currency * Switcher to implement a callback for the conversion of prices for custom * products. * * @author Aelia * @link https://aelia.co */ class Currency_Switcher_Integration_Example { public function __construct() { $this->set_hooks(); } /** * Sets the hooks required by the class. */ protected function set_hooks() { add_filter('wc_aelia_currencyswitcher_product_convert_callback', array($this, 'wc_aelia_currencyswitcher_product_convert_callback'), 10, 2); } /** * Converts the prices of a subscription product to the specified currency. * * @param WC_Product_MyCustomProduct product A custom product. * @param string currency A currency code. * @return WC_Product_MyCustomProduct The product with converted prices. */ public function convert_my_custom_product_prices($product, $currency) { /* Here you can perform any currency related operation you need. For example, * if your product prices were loaded in base currency, this is the perfect * place to replace them with the ones in the correct currency. * * If you designed your product class with built-in multi-currency support, * and it automatically loads its prices in the appropriate currency, you * won't have to do anything here. You will still need this callback, though, * so that the Currency Switcher will know that someone "took care" of the * custom product types, and no warnings will be raised. */ return $product; } /** * Intercepts the product conversion callbacks used by the Currency Switcher, adding * new ones to handle custom products. * * @param callable $callback The original callback passed to the hook. * @param WC_Product The product to examine. * @return callable */ public function wc_aelia_currencyswitcher_product_convert_callback($callback, $product) { // This array maps a list of classes to a callback key. If your plugin uses // namespaced classes, or if you are planning to introduce namespaced classes // in the future, you can specify both the simple and the namespaced class // name, as in the example below $method_keys = array( // If the product class is "WC_Product_MyCustomProduct", we will use our // convert_my_custom_product_prices method to load its currency-specific // prices, or to invoke the conversion 'WC_Product_MyCustomProduct' => 'convert_my_custom_product_prices', // Namespaced class '\My\Namespaced\Class\WC_Product_MyCustomProduct' => 'convert_my_custom_product_prices', ); // Determine the conversion method to use. We add a safeguard check, in case // we specify the wrong callback, so that the site won't crash if the method // doesn't exist if(!empty($method_keys[get_class($product)])) { // Get the callback method from the map, depending on the class $callback_method = $method_keys[get_class($product)]; // If we have the method we specified in the map, replace the original // callback with our own if(method_exists($this, $callback_method)) { $callback = array($this, $callback_method); } } return $callback; } }