/** * Returns the discounts that are global to the cart * * @return array A list of discounts that are global to the cart. */ function get_global_discounts() { $discounts = edd_get_cart_discounts(); if (empty($discounts)) { $discounts = array(); } $discounts = array_map(function ($discount_code) { $discount_id = edd_get_discount_id_by_code($discount_code); return array('code' => $discount_code, 'id' => $discount_id, 'name' => get_post_meta($discount_id, '_edd_discount_name', true)); }, $discounts); return array_filter($discounts, function ($discount) { return !edd_is_discount_not_global($discount['id']); }); }
/** * Process Get Discounts API Request * * @access public * @since 1.6 * @global object $wpdb Used to query the database using the WordPress * Database API * @param int $discount Discount ID * @return array $discounts Multidimensional array of the discounts */ public function get_discounts($discount = null) { $discount_list = array(); if (!user_can($this->user_id, 'manage_shop_discounts') && !$this->override) { return $discount_list; } $error = array(); if (empty($discount)) { global $wpdb; $paged = $this->get_paged(); $per_page = $this->per_page(); $discounts = edd_get_discounts(array('posts_per_page' => $per_page, 'paged' => $paged)); $count = 0; if (empty($discounts)) { $error['error'] = __('No discounts found!', 'easy-digital-downloads'); return $error; } foreach ($discounts as $discount) { $discount_list['discounts'][$count]['ID'] = $discount->ID; $discount_list['discounts'][$count]['name'] = $discount->post_title; $discount_list['discounts'][$count]['code'] = edd_get_discount_code($discount->ID); $discount_list['discounts'][$count]['amount'] = edd_get_discount_amount($discount->ID); $discount_list['discounts'][$count]['min_price'] = edd_get_discount_min_price($discount->ID); $discount_list['discounts'][$count]['type'] = edd_get_discount_type($discount->ID); $discount_list['discounts'][$count]['uses'] = edd_get_discount_uses($discount->ID); $discount_list['discounts'][$count]['max_uses'] = edd_get_discount_max_uses($discount->ID); $discount_list['discounts'][$count]['start_date'] = edd_get_discount_start_date($discount->ID); $discount_list['discounts'][$count]['exp_date'] = edd_get_discount_expiration($discount->ID); $discount_list['discounts'][$count]['status'] = $discount->post_status; $discount_list['discounts'][$count]['product_requirements'] = edd_get_discount_product_reqs($discount->ID); $discount_list['discounts'][$count]['requirement_condition'] = edd_get_discount_product_condition($discount->ID); $discount_list['discounts'][$count]['global_discount'] = edd_is_discount_not_global($discount->ID); $discount_list['discounts'][$count]['single_use'] = edd_discount_is_single_use($discount->ID); $count++; } } else { if (is_numeric($discount) && get_post($discount)) { $discount_list['discounts'][0]['ID'] = $discount; $discount_list['discounts'][0]['name'] = get_post_field('post_title', $discount); $discount_list['discounts'][0]['code'] = edd_get_discount_code($discount); $discount_list['discounts'][0]['amount'] = edd_get_discount_amount($discount); $discount_list['discounts'][0]['min_price'] = edd_get_discount_min_price($discount); $discount_list['discounts'][0]['type'] = edd_get_discount_type($discount); $discount_list['discounts'][0]['uses'] = edd_get_discount_uses($discount); $discount_list['discounts'][0]['max_uses'] = edd_get_discount_max_uses($discount); $discount_list['discounts'][0]['start_date'] = edd_get_discount_start_date($discount); $discount_list['discounts'][0]['exp_date'] = edd_get_discount_expiration($discount); $discount_list['discounts'][0]['status'] = get_post_field('post_status', $discount); $discount_list['discounts'][0]['product_requirements'] = edd_get_discount_product_reqs($discount); $discount_list['discounts'][0]['requirement_condition'] = edd_get_discount_product_condition($discount); $discount_list['discounts'][0]['global_discount'] = edd_is_discount_not_global($discount); $discount_list['discounts'][0]['single_use'] = edd_discount_is_single_use($discount); } else { $error['error'] = sprintf(__('Discount %s not found!', 'easy-digital-downloads'), $discount); return $error; } } return $discount_list; }
/** * Get the discounted amount on a price * * @since 1.9 * @param array $item Cart item array * @return float The discounted amount */ function edd_get_cart_item_discount_amount($item = array()) { global $edd_is_last_cart_item, $edd_flat_discount_total; // If we're not meeting the requirements of the $item array, return or set them if (empty($item) || empty($item['id'])) { return 0; } // Quantity is a requirement of the cart options array to determine the discounted price if (empty($item['quantity'])) { return 0; } if (!isset($item['options'])) { $item['options'] = array(); } $amount = 0; $price = edd_get_cart_item_price($item['id'], $item['options']); $discounted_price = $price; // Retrieve all discounts applied to the cart $discounts = edd_get_cart_discounts(); if ($discounts) { foreach ($discounts as $discount) { $code_id = edd_get_discount_id_by_code($discount); // Check discount exists if (!$code_id) { continue; } $reqs = edd_get_discount_product_reqs($code_id); $excluded_products = edd_get_discount_excluded_products($code_id); // Make sure requirements are set and that this discount shouldn't apply to the whole cart if (!empty($reqs) && edd_is_discount_not_global($code_id)) { // This is a product(s) specific discount foreach ($reqs as $download_id) { if ($download_id == $item['id'] && !in_array($item['id'], $excluded_products)) { $discounted_price -= $price - edd_get_discounted_amount($discount, $price); } } } else { // This is a global cart discount if (!in_array($item['id'], $excluded_products)) { if ('flat' === edd_get_discount_type($code_id)) { /* * * In order to correctly record individual item amounts, global flat rate discounts * are distributed across all cart items. The discount amount is divided by the number * of items in the cart and then a portion is evenly applied to each cart item */ $items_subtotal = 0.0; $cart_items = edd_get_cart_contents(); foreach ($cart_items as $cart_item) { if (!in_array($cart_item['id'], $excluded_products)) { $item_price = edd_get_cart_item_price($cart_item['id'], $cart_item['options']); $items_subtotal += $item_price * $cart_item['quantity']; } } $subtotal_percent = $price * $item['quantity'] / $items_subtotal; $code_amount = edd_get_discount_amount($code_id); $discounted_amount = $code_amount * $subtotal_percent; $discounted_price -= $discounted_amount; $edd_flat_discount_total += round($discounted_amount, edd_currency_decimal_filter()); if ($edd_is_last_cart_item && $edd_flat_discount_total < $code_amount) { $adjustment = $code_amount - $edd_flat_discount_total; $discounted_price -= $adjustment; } } else { $discounted_price -= $price - edd_get_discounted_amount($discount, $price); } } } } $amount = $price - apply_filters('edd_get_cart_item_discounted_amount', $discounted_price, $discounts, $item, $price); if ('flat' !== edd_get_discount_type($code_id)) { $amount = $amount * $item['quantity']; } } return $amount; }
</option> </select> </p> <p> <label> <input type="radio" class="tog" name="not_global" value="0"<?php checked(false, edd_is_discount_not_global($discount_id)); ?> /> <?php _e('Apply discount to entire purchase.', 'edd'); ?> </label><br/> <label> <input type="radio" class="tog" name="not_global" value="1"<?php checked(true, edd_is_discount_not_global($discount_id)); ?> /> <?php printf(__('Apply discount only to selected %s.', 'edd'), edd_get_label_plural()); ?> </label> </p> </div> <p class="description"><?php printf(__('Select %s relevant to this discount.', 'edd'), edd_get_label_plural()); ?> </p> </td> </tr> <?php
/** * Retrieves the total discounted amount on the cart * * @since 1.4.1 * @param array $discounts Discount codes * @return float $discounted_amount Total discounted amount */ function edd_get_cart_discounted_amount($discounts = false) { if (empty($discounts)) { $discounts = edd_get_cart_discounts(); } // Setup the array of discounts if (!empty($_POST['edd-discount']) && empty($discounts)) { // Check for a posted discount $posted_discount = isset($_POST['edd-discount']) ? trim($_POST['edd-discount']) : false; if ($posted_discount) { $discounts = array(); $discounts[] = $posted_discount; } } // Return 0.00 if no discounts present if (empty($discounts)) { return 0.0; } $subtotal = edd_get_cart_subtotal($tax = false); $amounts = array(); $discounted_items = array(); foreach ($discounts as $discount) { $code_id = edd_get_discount_id_by_code($discount); $reqs = edd_get_discount_product_reqs($code_id); // Make sure requirements are set and that this discount shouldn't apply to the whole cart if (!empty($reqs) && edd_is_discount_not_global($code_id)) { // This is a product(s) specific discount $condition = edd_get_discount_product_condition($code_id); $cart_items = edd_get_cart_contents(); foreach ($reqs as $download_id) { if (edd_item_in_cart($download_id)) { $cart_key = edd_get_item_position_in_cart($download_id); $price = edd_get_cart_item_price($download_id, $cart_items[$cart_key]['options']); $amount = edd_get_discounted_amount($discount, $price); $discounted_items[] = $price - $amount; } } } else { // This is a global cart discount $subtotal = edd_get_cart_subtotal(); $amount = edd_get_discounted_amount($discount, $subtotal); $amounts[] = $subtotal - $amount; } } // Add up the total amount $discounted_amount = 0.0; $item_discount = array_sum($discounted_items); $global_discount = array_sum($amounts); $discounted_amount += $item_discount; $discounted_amount += $global_discount; return apply_filters('edd_get_cart_discounted_amount', edd_sanitize_amount($discounted_amount)); }
/** * Get the discounted amount on a price * * @since 1.9 * @param array $item Cart item array * @return float The discounted amount */ function edd_get_cart_item_discount_amount($item = array()) { $amount = 0; $price = edd_get_cart_item_price($item['id'], $item['options'], edd_prices_include_tax()); $discounted_price = $price; // Retrieve all discounts applied to the cart $discounts = edd_get_cart_discounts(); if ($discounts) { foreach ($discounts as $discount) { $code_id = edd_get_discount_id_by_code($discount); $reqs = edd_get_discount_product_reqs($code_id); $excluded_products = edd_get_discount_excluded_products($code_id); // Make sure requirements are set and that this discount shouldn't apply to the whole cart if (!empty($reqs) && edd_is_discount_not_global($code_id)) { // This is a product(s) specific discount foreach ($reqs as $download_id) { if ($download_id == $item['id'] && !in_array($item['id'], $excluded_products)) { $discounted_price -= $price - edd_get_discounted_amount($discount, $price); } } } else { // This is a global cart discount if (!in_array($item['id'], $excluded_products)) { if ('flat' === edd_get_discount_type($code_id)) { /* * * In order to correctly record individual item amounts, global flat rate discounts * are distributed across all cart items. The discount amount is divided by the number * of items in the cart and then a portion is evenly applied to each cart item */ $discounted_amount = edd_get_discount_amount($code_id); $discounted_amount = $discounted_amount / edd_get_cart_quantity(); $discounted_price -= $discounted_amount; } else { $discounted_price -= $price - edd_get_discounted_amount($discount, $price); } } } } $amount = $price - apply_filters('edd_get_cart_item_discounted_amount', $discounted_price, $discounts, $item, $price); if ('flat' !== edd_get_discount_type($code_id)) { $amount = $amount * $item['quantity']; } } return $amount; }