businessdad

YITH Bundles - Aelia Currency Switcher integration

May 6th, 2020
202
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /**
  2.  * YITH Bundles - Aelia Currency Switcher Integration (PROTOTYPE)
  3.  * The following code is a prototype for the development of an integration between the YITH Bundles
  4.  * plugin and the Aelia Currency Switcher.
  5.  *
  6.  * IMPORTANT
  7.  * This code should only be used when the Aelia Currency Switcher is active. Please remember to disable
  8.  * or remove it if you deactivate or uninstall our plugin.
  9.  *
  10.  * DISCLAIMER
  11.  * Aelia and any member of its staff are not responsible for any data loss or damage incurred
  12.  * when using the code, which you can use at your own risk.
  13.  *
  14.  * GPL DISCLAIMER
  15.  * Because this code program is free of charge, there is no warranty for it, to the extent permitted by applicable law.
  16.  * Except when otherwise stated in writing the copyright holders and/or other parties provide the program "as is"
  17.  * without warranty of any kind, either expressed or implied, including, but not limited to, the implied warranties of
  18.  * merchantability and fitness for a particular purpose. The entire risk as to the quality and performance of the program
  19.  * is with you. should the program prove defective, you assume the cost of all necessary servicing, repair or correction.
  20.  *
  21.  * Need a consultation, or assistance to customise this code? Find us on Codeable: https://aelia.co/hire_us
  22.  */
  23. namespace Aelia\WC\CurrencySwitcher\YITH_Bundles;
  24. if(!defined('ABSPATH')) exit; // Exit if accessed directly
  25.  
  26. use \WC_Aelia_CurrencySwitcher;
  27. use \WC_Aelia_CurrencyPrices_Manager;
  28. use \WC_Product;
  29. use \WC_Product_Yith_Bundle;
  30.  
  31. /**
  32.  * Implements support for YITH Bundles plugin.
  33.  */
  34. class YITH_Bundles_Integration {
  35.     protected static $_instance;
  36.  
  37.     // @var WC_Aelia_CurrencyPrices_Manager The object that handles Currency Prices for the Products.
  38.     protected static $_currencyprices_manager;
  39.  
  40.     /**
  41.      * Returns the singleton instance of this class
  42.      *
  43.      * @return YITH_Bundles_Integration
  44.      */
  45.     public static function instance() {
  46.         if(empty(self::$_instance)) {
  47.             self::$_instance = new static();
  48.         }
  49.         return self::$_instance;
  50.     }
  51.  
  52.     /**
  53.      * Returns the instance of the currency prices manager class.
  54.      *
  55.      * @return WC_Aelia_CurrencyPrices_Manager
  56.      */
  57.     protected static function currencyprices_manager() {
  58.         if(empty(self::$_currencyprices_manager)) {
  59.             self::$_currencyprices_manager = \WC_Aelia_CurrencyPrices_Manager::instance();
  60.         }
  61.         return self::$_currencyprices_manager;
  62.     }
  63.  
  64.     /**
  65.      * Indicates if a bundle is priced on a per product basis.
  66.      *
  67.      * @param WC_Product product The bundle product to check.
  68.      * @return bool
  69.      */
  70.     protected function is_bundle_priced_individually($product) {
  71.         return !empty($product->per_items_pricing);
  72.     }
  73.  
  74.     /**
  75.      * Class constructor
  76.      */
  77.     public function __construct() {
  78.         $this->set_hooks();
  79.     }
  80.  
  81.     /**
  82.      * Set the hooks required by the class.
  83.      */
  84.     protected function set_hooks() {
  85.         add_filter('wc_aelia_currencyswitcher_product_convert_callback', array($this, 'wc_aelia_currencyswitcher_product_convert_callback'), 10, 2);
  86.         add_action('woocommerce_process_product_meta_yith_bundle', array($this, 'woocommerce_process_product_meta_yith_bundle'));
  87.     }
  88.  
  89.     /**
  90.      * Callback to perform the conversion of bundle prices into selected currency.
  91.      *
  92.      * @param callable $convert_callback A callable, or null.
  93.      * @param WC_Product The product to examine.
  94.      * @return callable
  95.      */
  96.     public function wc_aelia_currencyswitcher_product_convert_callback($convert_callback, $product) {
  97.         $method_keys = array(
  98.             'WC_Product_Yith_Bundle' => 'yith_bundle',
  99.         );
  100.  
  101.         // Determine the conversion method to use
  102.         $method_key = isset($method_keys[get_class($product)]) ? $method_keys[get_class($product)] : '';
  103.         $convert_method = 'convert_' . $method_key . '_product_prices';
  104.  
  105.         if(!method_exists($this, $convert_method)) {
  106.             return $convert_callback;
  107.         }
  108.         return array($this, $convert_method);
  109.     }
  110.  
  111.     /**
  112.      * Indicates if a product requires conversion.
  113.      *
  114.      * @param WC_Product product The product to process.
  115.      * @param string currency The target currency for which product prices will
  116.      * be requested.
  117.      * @return bool
  118.      */
  119.     protected function product_requires_conversion($product, $currency) {
  120.         // If the product is already in the target currency, it doesn't require
  121.         // conversion
  122.         return empty($product->currency) || ($product->currency != $currency);
  123.     }
  124.  
  125.     /**
  126.      * Converts the prices of a bundle product to the specified currency.
  127.      *
  128.      * @param WC_Product_Yith_Bundle product A variable product.
  129.      * @param string currency A currency code.
  130.      * @return WC_Product_Yith_Bundle The product with converted prices.
  131.      */
  132.     public function convert_yith_bundle_product_prices(WC_Product_Yith_Bundle $product, $currency) {
  133.         if(!$this->product_requires_conversion($product, $currency)) {
  134.             return $product;
  135.         }
  136.  
  137.         if(!$this->is_bundle_priced_individually($product)) {
  138.             $product = self::currencyprices_manager()->convert_simple_product_prices($product, $currency);
  139.         }
  140.  
  141.         return $product;
  142.     }
  143.  
  144.     /*** Manual pricing of bundles ***/
  145.     /**
  146.      * Event handler fired when a bundle is being saved. It processes and
  147.      * saves the Currency Prices associated with the bundle.
  148.      *
  149.      * @param int post_id The ID of the Post (bundle) being saved.
  150.      */
  151.     public function woocommerce_process_product_meta_yith_bundle($post_id) {
  152.         self::currencyprices_manager()->process_product_meta($post_id);
  153.     }
  154. }
  155.  
  156. YITH_Bundles_Integration::instance();
Add Comment
Please, Sign In to add comment