_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 "
"; echo "
"; } /** * Display promotional message in check out while processing order review * */ public function displaySubTotalPromotionMessagesInCheckout(){ echo "
"; $this->displayPromotionMessages(); echo "
"; echo ""; } /** * Export Data via CSV */ public function awdrExportCsv(){ if (isset($_POST['wdr-export']) && isset($_POST['security'])) { if(wp_verify_nonce(sanitize_text_field(wp_unslash($_POST['security'])),'awdr_export_rules')) { ob_end_clean(); $rule_helper = new Rule(); $rules = $rule_helper->exportRuleByName('all'); $file_name = 'advanced-discount-rules-' . gmdate("Y-m-d-h-i-a") . '.csv'; $file = fopen('php://output', 'w'); header('Content-type: application/csv'); header('Content-Disposition: attachment; filename=' . $file_name); $export_csv_separator = apply_filters('advanced_woo_discount_rules_csv_import_export_separator', ','); $enclosure = apply_filters('advanced_woo_discount_rules_csv_import_export_encloser','"'); $escape = apply_filters('advanced_woo_discount_rules_csv_import_export_escape',"\\"); fputcsv($file, array('id', 'enabled', 'deleted', 'exclusive', 'title', 'priority', 'apply_to', 'filters', 'conditions', 'product_adjustments', 'cart_adjustments', 'buy_x_get_x_adjustments', 'buy_x_get_y_adjustments', 'bulk_adjustments', 'set_adjustments', 'other_discounts', 'date_from', 'date_to', 'usage_limits', 'rule_language', 'used_limits', 'additional', 'max_discount_sum', 'advanced_discount_message', 'discount_type', 'used_coupons', 'created_by', 'created_on', 'modified_by', 'modified_on'), $export_csv_separator,$enclosure,$escape); foreach ($rules as $rule_row) { $row_data = (array)$rule_row; fputcsv($file, $row_data, $export_csv_separator, $enclosure, $escape); } exit; } } } /** * Display total savings in order * @param $order */ public function displayTotalSavingsThroughDiscountInOrder($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'=>'woo_order_total','order'=>$order, 'item'=>$items]); } echo wp_kses_post($save_text); } /** * Include tax in fee * */ public function applyTaxInFee($fee, $cart){ if(Woocommerce::isTaxEnabled() && apply_filters('advanced_woo_discount_rules_is_allow_tax_calculation_for_fee',true,$fee,$cart)){ if(Woocommerce::isEnteredPriceIncludeTax()){ if(class_exists('\WC_Tax')){ $fee_taxs = \WC_Tax::calc_tax( $fee, \WC_Tax::get_rates( '', \WC()->cart->get_customer() ), true ); if(!empty($fee_taxs)){ foreach ($fee_taxs as $key => $val){ $fee = $fee - $val; } } } } } return $fee; } /** * Change the custom taxonomies label * * @param $custom_taxonomies * * @return array */ public static function changeCustomTaxonomyLabel($custom_taxonomies){ if(!empty($custom_taxonomies) && is_array($custom_taxonomies) && method_exists(Woocommerce::class,'changeCustomTaxonomyLabel') ){ return Woocommerce::changeCustomTaxonomyLabel($custom_taxonomies); } return $custom_taxonomies; } /** * Add coupon meta data to validate the coupon restrictions * * @param $item * @param $code * @param $coupon * @param $order */ public static function addCouponMeta($item, $code, $coupon, $order ){ if ( is_a( $coupon, 'WC_Coupon' ) ) { !empty($coupon->get_product_ids()) ? $item->add_meta_data( 'wdr_apply_coupon_product_ids', $coupon->get_product_ids(), true ) : ''; !empty($coupon->get_excluded_product_ids()) ? $item->add_meta_data( 'wdr_exclude_product_ids', $coupon->get_excluded_product_ids(), true ): ''; !empty($coupon->get_product_categories()) ? $item->add_meta_data( 'wdr_product_categories', $coupon->get_product_categories(), true ): ''; !empty($coupon->get_excluded_product_categories()) ? $item->add_meta_data( 'wdr_exclude_product_categories', $coupon->get_excluded_product_categories(), true ): ''; !empty($coupon->get_exclude_sale_items()) ? $item->add_meta_data( 'wdr_exclude_sale_items', $coupon->get_exclude_sale_items(), true ): ''; !empty($coupon->get_minimum_amount()) ? $item->add_meta_data( 'wdr_minimum_amount', $coupon->get_minimum_amount(), true ): ''; !empty($coupon->get_maximum_amount()) ? $item->add_meta_data( 'wdr_maximum_amount', $coupon->get_maximum_amount(), true ): ''; !empty($coupon->get_email_restrictions()) ? $item->add_meta_data( 'wdr_customer_emails', $coupon->get_email_restrictions(), true ): ''; !empty($coupon->get_usage_limit()) ? $item->add_meta_data( 'wdr_usage_limit', $coupon->get_usage_limit(), true ): ''; !empty($coupon->get_usage_limit_per_user()) ? $item->add_meta_data( 'wdr_usage_limit_per_user', $coupon->get_usage_limit_per_user(), true ): ''; } } /** * validate the coupon restrictions based on product, category, sale items * * @param $valid * @param $product * @param $coupon * @param $order_item * * @return false */ public static function validateCoupon( $valid, $product, $coupon, $order_item ) { // Only proceed if we are in admin and wc_get_order() exists if ( ! $order_item || ! is_admin() || ! function_exists( 'wc_get_order' ) ) { return $valid; } //Safely get order ID (works for both array and object) $order_id = 0; if ( is_object( $order_item ) && method_exists( $order_item, 'get_order_id' ) ) { $order_id = $order_item->get_order_id(); } elseif ( is_array( $order_item ) && ! empty( $order_item['order_id'] ) ) { $order_id = absint( $order_item['order_id'] ); } if ( ! $order_id ) { return $valid; } // Check if function wc_get_order exists before calling if ( ! function_exists( 'wc_get_order' ) ) { return $valid; } $order = wc_get_order( $order_id ); if ( ! $order ) { return $valid; } $coupon_code = $coupon->get_code(); $matched_coupon_item = null; // Loop through coupon items foreach ( $order->get_items( 'coupon' ) as $order_coupon ) { if ( strtolower( $order_coupon->get_code() ) === strtolower( $coupon_code ) ) { $matched_coupon_item = $order_coupon; break; } } if ( ! $matched_coupon_item ) { return $valid; } // Safely get product data if ( ! is_object( $product ) || ! method_exists( $product, 'get_id' ) ) { return $valid; } $product_id = $product->get_id(); $product_cats = method_exists( $product, 'get_category_ids' ) ? $product->get_category_ids() : []; $product_on_sale = method_exists( $product, 'is_on_sale' ) ? $product->is_on_sale() : false; // Coupon restrictions $coupon_product_ids = array_filter((array) $matched_coupon_item->get_meta( 'wdr_apply_coupon_product_ids', true )); if ( ! empty( $coupon_product_ids ) ) { if ( method_exists( $product, 'is_type' ) && $product->is_type( 'variation' ) ) { $parent_product_id = $product->get_parent_id(); if ( in_array( $parent_product_id, $coupon_product_ids, true ) ) { $parent_product = wc_get_product( $parent_product_id ); if ( is_object( $parent_product ) && method_exists( $parent_product, 'get_children' ) ) { $variable_product_ids = $parent_product->get_children(); if ( is_array( $variable_product_ids ) && ! empty( $variable_product_ids ) ) { $coupon_product_ids = array_merge( $coupon_product_ids, $variable_product_ids ); } } } } if ( ! in_array( $product_id, $coupon_product_ids, true ) ) { return false; } } // Excluded products $exclude_product_ids = array_filter((array) $matched_coupon_item->get_meta( 'wdr_exclude_product_ids', true )); if ( ! empty($exclude_product_ids ) && in_array( $product_id, $exclude_product_ids, true ) ) { return false; } // Allowed categories (your logic was reversed) $allowed_cats = array_filter( (array)$matched_coupon_item->get_meta( 'wdr_product_categories', true )); if ( ! empty( $allowed_cats ) ) { $found_allowed_cat = false; foreach ( $product_cats as $cat_id ) { if ( in_array( $cat_id, $allowed_cats, true ) ) { $found_allowed_cat = true; break; } } if ( ! $found_allowed_cat ) { return false; } } // Excluded categories $excluded_cats = array_filter((array) $matched_coupon_item->get_meta( 'wdr_exclude_product_categories', true )); if ( ! empty( $excluded_cats) ) { foreach ( $product_cats as $cat_id ) { if ( in_array( $cat_id, $excluded_cats, true ) ) { return false; } } } // Exclude sale items $exclude_sale_items = (bool) $matched_coupon_item->get_meta( 'wdr_exclude_sale_items', true ); if ( $exclude_sale_items && $product_on_sale ) { return false; } return $valid; } }