$order_item = self::$woocommerce_helper->getOrderItem($order_item_or_id); } else { return false; } if (is_object($order_item) && method_exists($order_item, 'get_meta')) { $data = $order_item->get_meta('_wdr_discounts'); if (empty($data)) { $data = $order_item->get_meta('_advanced_woo_discount_item_total_discount'); if (!empty($data) && is_array($data)) { $data['initial_price_with_tax'] = $data['initial_price_based_on_tax_settings']; $data['discounted_price_with_tax'] = $data['discounted_price_based_on_tax_settings']; return self::prepareDiscountDetails($data); } } if (!empty($data) && is_array($data)) { return $data; } return $discount_details; } return false; } /** * Get save amount of a product in order * @param int|float|false $saved_amount * @param int|\WC_Order_Item $order_item_or_id * @return float|false * */ static function getSavedAmountFromOrderItem($saved_amount, $order_item_or_id) { if ($details = self::getDiscountDetailsFromOrderItem(false, $order_item_or_id)) { if (is_array($details) && !empty($details['initial_price_based_on_tax_settings']) && isset($details['discounted_price_based_on_tax_settings'])) { return round($details['initial_price_based_on_tax_settings'] - $details['discounted_price_based_on_tax_settings'], 4); } } return $saved_amount; } /** * Get discount details from order * @param array|false $discount_details * @param int|\WC_Order $order_or_id * @return array|false * */ static function getDiscountDetailsFromOrder($discount_details, $order_or_id) { if (is_object($order_or_id) && is_a($order_or_id, '\WC_Order')) { $order = $order_or_id; } elseif (is_numeric($order_or_id)) { $order = self::$woocommerce_helper->getOrder($order_or_id); } else { return false; } if (is_object($order) && method_exists($order, 'get_meta')) { $data = $order->get_meta('_wdr_discounts'); if (!empty($data) && is_array($data)) { return $data; } return $discount_details; } return false; } /** * Get save amount from order * @param int|float|false $saved_amount * @param int|\WC_Order $order_or_id * @return float|false * */ static function getSavedAmountFromOrder($saved_amount, $order_or_id) { if ($details = self::getDiscountDetailsFromOrder(false, $order_or_id)) { if (is_array($details) && isset($details['saved_amount']['total_based_on_tax_settings'])) { return $details['saved_amount']['total_based_on_tax_settings']; } } return $saved_amount; } /** * Change the default template for sale badge * * @param $located string * @param $template_name string * @param $args array * @param $template_path string * @param $default_path string * @return string * */ public static function changeTemplateForSaleTag($located, $template_name, $args, $template_path, $default_path){ if($template_name == 'single-product/sale-flash.php'){ $located = Helper::getTemplatePath('sale-flash.php', WDR_PLUGIN_PATH . 'App/Views/Templates/single-product/sale-flash.php', 'single-product'); } else if($template_name == 'loop/sale-flash.php'){ $located = Helper::getTemplatePath('sale-flash.php', WDR_PLUGIN_PATH . 'App/Views/Templates/loop/sale-flash.php', 'loop'); } return $located; } /** * Remove on sale flash except our hooks * */ function removeOnSaleFlashEvent(){ $allowed_hooks = array( //Filters "woocommerce_sale_flash" => array( "Wdr\App\Controllers\ManageDiscount|replaceSaleTagText" ), ); $this->removeOtherEvents($allowed_hooks); } /** * Suppress third party discount plugins from accessing the discount data */ function suppressOtherDiscountPlugins() { $allowed_hooks = array( //Filters "woocommerce_get_price_html" => array("Wdr\App\Controllers\ManageDiscount|getPriceHtml", "Wdr\App\Controllers\ManageDiscount|getPriceHtmlSalePriceAdjustment"), "woocommerce_product_is_on_sale" => array("Wdr\App\Controllers\ManageDiscount|isProductInSale"), "woocommerce_product_get_sale_price" => array(), "woocommerce_product_get_regular_price" => array(), "woocommerce_variable_price_html" => array("Wdr\App\Controllers\ManageDiscount|getVariablePriceHtml"), "woocommerce_cart_item_price" => array("Wdr\App\Controllers\ManageDiscount|getCartPriceHtml"), "woocommerce_cart_item_subtotal" => array("Wdr\App\Controllers\ManageDiscount|getCartProductSubtotalPriceHtml"), //Actions "woocommerce_checkout_order_processed" => array(), "woocommerce_before_calculate_totals" => array("Wdr\App\Controllers\ManageDiscount|applyCartProductDiscount"), //nothing allowed! ); $allowed_hooks = apply_filters('advanced_woo_discount_rules_exclude_hooks_from_removing', $allowed_hooks); $this->removeOtherEvents($allowed_hooks); } /** * Remove methods from the event * Exclude from the list * * @param $allowed_hooks array * */ function removeOtherEvents($allowed_hooks){ global $wp_filter; foreach ($wp_filter as $hook_name => $hook_obj) { if (preg_match('#^woocommerce_#', $hook_name)) { if (isset($allowed_hooks[$hook_name])) { $wp_filter[$hook_name] = $this->removeWrongCallbacks($hook_obj, $allowed_hooks[$hook_name]); } } } } /** * Remove the third party call backs * @param $hook_obj * @param $allowed_hooks * @return mixed */ function removeWrongCallbacks($hook_obj, $allowed_hooks) { if (method_exists($hook_obj, 'offsetSet') && method_exists($hook_obj, 'offsetUnset')) { foreach ($hook_obj->callbacks as $priority => $callbacks) { $priority_callbacks = array(); foreach ($callbacks as $idx => $callback_details) { if ($this->isCallbackMatch($callback_details, $allowed_hooks)) { $priority_callbacks[$idx] = $callback_details; } } $hook_obj->offsetUnset($priority); if ($priority_callbacks) { $hook_obj->offsetSet($priority, $priority_callbacks); } } } else { $new_callbacks = array(); foreach ($hook_obj->callbacks as $priority => $callbacks) { $priority_callbacks = array(); foreach ($callbacks as $idx => $callback_details) { if ($this->isCallbackMatch($callback_details, $allowed_hooks)) { $priority_callbacks[$idx] = $callback_details; } } if ($priority_callbacks) { $new_callbacks[$priority] = $priority_callbacks; } } $hook_obj->callbacks = $new_callbacks; } return $hook_obj; } /** * check the call back matched or not * @param $callback_details * @param $allowed_hooks * @return bool */ function isCallbackMatch($callback_details, $allowed_hooks) { $result = false; foreach ($allowed_hooks as $callback_name) { list($class_name, $func_name) = explode("|", $callback_name); if(empty($callback_details['function'])){ continue; } if(is_string($callback_details['function'])){ continue; } if(is_object($callback_details['function'])){ if($this->is_closure($callback_details['function'])){ continue; } } if (count($callback_details['function']) != 2) { continue; } if(!is_object($callback_details['function'][0])){ continue; } if ($class_name == get_class($callback_details['function'][0]) AND $func_name == $callback_details['function'][1]) { $result = true; break;// done! } } return $result; } function is_closure($t) { if(class_exists('\Closure')){ return $t instanceof \Closure; } else { return false; } } /** * Display you saved text in order pages * @param $total * @param $order * @return string */ function displayTotalSavingsInOrderAfterOrderTotal($total, $order) { if (!is_object($order)) { if (!empty($order) && is_int($order)) { $order = self::$woocommerce_helper->getOrder($order); } } $items = $order->get_items(); $total_discount = $this->getItemTotalDiscount($items); $save_text = NULL; if (!empty($total_discount)) { $total_discounted_price = self::$woocommerce_helper->formatPrice($total_discount, array('currency' => self::$woocommerce_helper->getOrderCurrency($order))); $subtotal_additional_text = $this->getYouSavedText($total_discounted_price); $save_text = apply_filters('advanced_woo_discount_rules_order_saved_text', $subtotal_additional_text, $total_discounted_price, $total_discount,['filter_type'=>'complete_order_total','order'=>$order, 'item'=>$items]); } return $total . $save_text; } /** * Calculate items total discount * @param $items * @return float|int */ function getItemTotalDiscount($items) { $total_discount = 0; if (!empty($items)) { foreach ($items as $key => $item) { $discount_details = $item->get_meta('_advanced_woo_discount_item_total_discount'); if (!empty($discount_details)) { $total_discount += $this->getDiscountPerItem($discount_details); } } } return $total_discount; } /** * order line item saved text * @param $subtotal * @param $item * @param $order * @return string */ function orderSubTotalDiscountDetails($subtotal, $item, $order) { $discount_details = self::$woocommerce_helper->getOrderItemMeta($item, '_advanced_woo_discount_item_total_discount'); if (!empty($discount_details)) { $total_discount = $this->getDiscountPerItem($discount_details); if (!empty($total_discount)) { $total_discounted_price = self::$woocommerce_helper->formatPrice($total_discount, array('currency' => self::$woocommerce_helper->getOrderCurrency($order))); $subtotal_additional_text = $this->getYouSavedText($total_discounted_price); $subtotal .= apply_filters('advanced_woo_discount_rules_order_saved_text', $subtotal_additional_text, $total_discounted_price, $total_discount,['filter_type'=>'complete_order_line_item','order'=> $order, 'item'=>$item]); } } return $subtotal; } /** * Show order discount details * @param $item_id * @param $item * @param $product */ public function orderItemMetaDiscountDetails($item_id, $item, $product) { $discount_details = self::$woocommerce_helper->getOrderItemMeta($item, '_advanced_woo_discount_item_total_discount'); if (!empty($discount_details)) { $total_discount = $this->getDiscountPerItem($discount_details); $order = self::$woocommerce_helper->getOrderByItem($item); if (!empty($order) && !empty($total_discount)) { $total_discounted_price = self::$woocommerce_helper->formatPrice($total_discount, array('currency' => self::$woocommerce_helper->getOrderCurrency($order))); $subtotal_additional_text = $this->getYouSavedText($total_discounted_price); echo wp_kses_post(apply_filters('advanced_woo_discount_rules_order_saved_text', $subtotal_additional_text, $total_discounted_price, $total_discount,['filter_type'=>'woo_order_line_item','order'=>$order, 'item'=>$item])); } } } /** * Hide Zero Coupon Value * @param $coupon_html * @param $coupon * @return mixed */ public function hideZeroCouponValue($coupon_html, $coupon) { $hide_zero_value_coupon = apply_filters('advanced_woo_discount_rules_hide_zero_value_coupon', true, $coupon); if ($hide_zero_value_coupon) { $rule_helper = new Rule(); $original_coupon_html = $coupon_html; $all_coupon_codes = $rule_helper->getCouponsFromDiscountRules(); $coupon_code = self::$woocommerce_helper->getCouponCode($coupon); $virtual_coupon = (isset($all_coupon_codes['custom_coupons']) && !empty($all_coupon_codes['custom_coupons'])) ? array_map('strtolower',$all_coupon_codes['custom_coupons']) : []; $woo_coupons = (isset($all_coupon_codes['woo_coupons'][0]) && !empty($all_coupon_codes['woo_coupons'][0])) ? $all_coupon_codes['woo_coupons'][0] : []; if (!empty($woo_coupons) && in_array($coupon_code, $woo_coupons)) { $zero_price_html = '-' . self::$woocommerce_helper->formatPrice(0); $coupon_html = str_replace($zero_price_html, '', $coupon_html); } else if (!empty($virtual_coupon) && in_array(strtolower($coupon_code), $virtual_coupon)) { $zero_price_html = '-' . self::$woocommerce_helper->formatPrice(0); $coupon_html = str_replace($zero_price_html, '', $coupon_html); } $coupon_html = apply_filters('advanced_woo_discount_rules_hide_zero_value_coupon_html', $coupon_html, $original_coupon_html, $coupon); } return $coupon_html; } /** * Display promotional messages * */ public function displayPromotionMessages(){ $cart = Woocommerce::getCart(); $messages = Helper::getPromotionMessages(); $messages = empty($cart) ? '' : $messages; if(!empty($messages) && is_array($messages)) { foreach ($messages as $message) { self::$woocommerce_helper->printNotice($message, "notice"); } } } /** * Load outer div for displaying promotional message in check out * */ public function displaySubTotalPromotionMessagesInCheckoutContainer(){ echo "