businessdad icon

YITH Bundles - Aelia Currency Switcher integration

businessdad | PRO | 05/06/20 10:53:05 PM UTC | 0 ⭐ | 923 👁️ | Never ⏰ | []
PHP |

5.37 KB

|

None

|

0 👍

/

0 👎

/**
 * YITH Bundles - Aelia Currency Switcher Integration (PROTOTYPE)
 * The following code is a prototype for the development of an integration between the YITH Bundles
 * plugin and the Aelia Currency Switcher.
 * 
 * IMPORTANT
 * This code should only be used when the Aelia Currency Switcher is active. Please remember to disable
 * or remove it if you deactivate or uninstall our plugin.
 *
 * DISCLAIMER
 * Aelia and any member of its staff are not responsible for any data loss or damage incurred
 * when using the code, which you can use at your own risk.
 *
 * 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
 */
namespace Aelia\WC\CurrencySwitcher\YITH_Bundles;
if(!defined('ABSPATH')) exit; // Exit if accessed directly
 
use \WC_Aelia_CurrencySwitcher;
use \WC_Aelia_CurrencyPrices_Manager;
use \WC_Product;
use \WC_Product_Yith_Bundle;
 
/**
 * Implements support for YITH Bundles plugin.
 */
class YITH_Bundles_Integration {
    protected static $_instance;
 
    // @var WC_Aelia_CurrencyPrices_Manager The object that handles Currency Prices for the Products.
    protected static $_currencyprices_manager;
 
    /**
     * Returns the singleton instance of this class
     *
     * @return YITH_Bundles_Integration
     */
    public static function instance() {
        if(empty(self::$_instance)) {
            self::$_instance = new static();
        }
        return self::$_instance;
    }
 
    /**
     * Returns the instance of the currency prices manager class.
     *
     * @return WC_Aelia_CurrencyPrices_Manager
     */
    protected static function currencyprices_manager() {
        if(empty(self::$_currencyprices_manager)) {
            self::$_currencyprices_manager = \WC_Aelia_CurrencyPrices_Manager::instance();
        }
        return self::$_currencyprices_manager;
    }
 
    /**
     * Indicates if a bundle is priced on a per product basis.
     *
     * @param WC_Product product The bundle product to check.
     * @return bool
     */
    protected function is_bundle_priced_individually($product) {
        return !empty($product->per_items_pricing);
    }
 
    /**
     * Class constructor
     */
    public function __construct() {
        $this->set_hooks();
    }
 
    /**
     * Set 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);
        add_action('woocommerce_process_product_meta_yith_bundle', array($this, 'woocommerce_process_product_meta_yith_bundle'));
    }
 
    /**
     * Callback to perform the conversion of bundle prices into selected currency.
     *
     * @param callable $convert_callback A callable, or null.
     * @param WC_Product The product to examine.
     * @return callable
     */
    public function wc_aelia_currencyswitcher_product_convert_callback($convert_callback, $product) {
        $method_keys = array(
            'WC_Product_Yith_Bundle' => 'yith_bundle',
        );
 
        // Determine the conversion method to use
        $method_key = isset($method_keys[get_class($product)]) ? $method_keys[get_class($product)] : '';
        $convert_method = 'convert_' . $method_key . '_product_prices';
 
        if(!method_exists($this, $convert_method)) {
            return $convert_callback;
        }
        return array($this, $convert_method);
    }
 
    /**
     * Indicates if a product requires conversion.
     *
     * @param WC_Product product The product to process.
     * @param string currency The target currency for which product prices will
     * be requested.
     * @return bool
     */
    protected function product_requires_conversion($product, $currency) {
        // If the product is already in the target currency, it doesn't require
        // conversion
        return empty($product->currency) || ($product->currency != $currency);
    }
 
    /**
     * Converts the prices of a bundle product to the specified currency.
     *
     * @param WC_Product_Yith_Bundle product A variable product.
     * @param string currency A currency code.
     * @return WC_Product_Yith_Bundle The product with converted prices.
     */
    public function convert_yith_bundle_product_prices(WC_Product_Yith_Bundle $product, $currency) {
        if(!$this->product_requires_conversion($product, $currency)) {
            return $product;
        }
 
        if(!$this->is_bundle_priced_individually($product)) {
            $product = self::currencyprices_manager()->convert_simple_product_prices($product, $currency);
        }
 
        return $product;
    }
 
    /*** Manual pricing of bundles ***/
    /**
     * Event handler fired when a bundle is being saved. It processes and
     * saves the Currency Prices associated with the bundle.
     *
     * @param int post_id The ID of the Post (bundle) being saved.
     */
    public function woocommerce_process_product_meta_yith_bundle($post_id) {
        self::currencyprices_manager()->process_product_meta($post_id);
    }
}
 
YITH_Bundles_Integration::instance();

Comments