WC_Discounts::apply_coupon_percent()
Apply percent discount to items and return an array of discounts granted.
Method of the class: WC_Discounts{}
Hooks from the method
Return
Int
. Total discounted.
Usage
// protected - for code of main (parent) or child class $result = $this->apply_coupon_percent( $coupon, $items_to_apply );
- $coupon(WC_Coupon) (required)
- Coupon object. Passed through filters.
- $items_to_apply(array) (required)
- Array of items to apply the coupon to.
Changelog
Since 3.2.0 | Introduced. |
WC_Discounts::apply_coupon_percent() WC Discounts::apply coupon percent code WC 9.7.1
protected function apply_coupon_percent( $coupon, $items_to_apply ) { $total_discount = 0; $cart_total = 0; $limit_usage_qty = 0; $applied_count = 0; $adjust_final_discount = true; if ( null !== $coupon->get_limit_usage_to_x_items() ) { $limit_usage_qty = $coupon->get_limit_usage_to_x_items(); } $coupon_amount = $coupon->get_amount(); foreach ( $items_to_apply as $item ) { // Find out how much price is available to discount for the item. $discounted_price = $this->get_discounted_price_in_cents( $item ); // Get the price we actually want to discount, based on settings. $price_to_discount = ( 'yes' === get_option( 'woocommerce_calc_discounts_sequentially', 'no' ) ) ? $discounted_price : NumberUtil::round( $item->price ); // See how many and what price to apply to. $apply_quantity = $limit_usage_qty && ( $limit_usage_qty - $applied_count ) < $item->quantity ? $limit_usage_qty - $applied_count : $item->quantity; $apply_quantity = max( 0, apply_filters( 'woocommerce_coupon_get_apply_quantity', $apply_quantity, $item, $coupon, $this ) ); $price_to_discount = ( $price_to_discount / $item->quantity ) * $apply_quantity; // Run coupon calculations. $discount = floor( $price_to_discount * ( $coupon_amount / 100 ) ); if ( is_a( $this->object, 'WC_Cart' ) && has_filter( 'woocommerce_coupon_get_discount_amount' ) ) { // Send through the legacy filter, but not as cents. $filtered_discount = wc_add_number_precision( apply_filters( 'woocommerce_coupon_get_discount_amount', wc_remove_number_precision( $discount ), wc_remove_number_precision( $price_to_discount ), $item->object, false, $coupon ) ); if ( $filtered_discount !== $discount ) { $discount = $filtered_discount; $adjust_final_discount = false; } } $discount = wc_round_discount( min( $discounted_price, $discount ), 0 ); $cart_total = $cart_total + $price_to_discount; $total_discount = $total_discount + $discount; $applied_count = $applied_count + $apply_quantity; // Store code and discount amount per item. $this->discounts[ $coupon->get_code() ][ $item->key ] += $discount; } // Work out how much discount would have been given to the cart as a whole and compare to what was discounted on all line items. $cart_total_discount = wc_round_discount( $cart_total * ( $coupon_amount / 100 ), 0 ); if ( $total_discount < $cart_total_discount && $adjust_final_discount ) { $total_discount += $this->apply_coupon_remainder( $coupon, $items_to_apply, $cart_total_discount - $total_discount ); } return $total_discount; }