Resolve 'non-numeric value encountered' error in PHP 7.1 when freeshipping coupon used
This commit is contained in:
parent
419244051e
commit
458a6c87c7
|
@ -335,6 +335,9 @@ class WC_Discounts {
|
||||||
$total_discount = 0;
|
$total_discount = 0;
|
||||||
$cart_total = 0;
|
$cart_total = 0;
|
||||||
|
|
||||||
|
// Because get_amount() could return an empty string, let's be sure to set our local variable to a known good value.
|
||||||
|
$coupon_amount = ( '' === $coupon->get_amount() ) ? 0 : $coupon->get_amount();
|
||||||
|
|
||||||
foreach ( $items_to_apply as $item ) {
|
foreach ( $items_to_apply as $item ) {
|
||||||
// Find out how much price is available to discount for the item.
|
// Find out how much price is available to discount for the item.
|
||||||
$discounted_price = $this->get_discounted_price_in_cents( $item );
|
$discounted_price = $this->get_discounted_price_in_cents( $item );
|
||||||
|
@ -346,7 +349,7 @@ class WC_Discounts {
|
||||||
$cart_total += $price_to_discount;
|
$cart_total += $price_to_discount;
|
||||||
|
|
||||||
// Run coupon calculations.
|
// Run coupon calculations.
|
||||||
$discount = floor( $price_to_discount * ( $coupon->get_amount() / 100 ) );
|
$discount = floor( $price_to_discount * ( $coupon_amount / 100 ) );
|
||||||
|
|
||||||
if ( is_a( $this->object, 'WC_Cart' ) && has_filter( 'woocommerce_coupon_get_discount_amount' ) ) {
|
if ( is_a( $this->object, 'WC_Cart' ) && has_filter( 'woocommerce_coupon_get_discount_amount' ) ) {
|
||||||
// Send through the legacy filter, but not as cents.
|
// Send through the legacy filter, but not as cents.
|
||||||
|
@ -360,8 +363,8 @@ class WC_Discounts {
|
||||||
$this->discounts[ $coupon->get_code() ][ $item->key ] += $discount;
|
$this->discounts[ $coupon->get_code() ][ $item->key ] += $discount;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Work out how much discount would have been given to the cart has a whole and compare to what was discounted on all line items.
|
// 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_cart_round_discount( $cart_total * ( $coupon->get_amount() / 100 ), 0 );
|
$cart_total_discount = wc_cart_round_discount( $cart_total * ( $coupon_amount / 100 ), 0 );
|
||||||
|
|
||||||
if ( $total_discount < $cart_total_discount ) {
|
if ( $total_discount < $cart_total_discount ) {
|
||||||
$total_discount += $this->apply_coupon_remainder( $coupon, $items_to_apply, $cart_total_discount - $total_discount );
|
$total_discount += $this->apply_coupon_remainder( $coupon, $items_to_apply, $cart_total_discount - $total_discount );
|
||||||
|
|
|
@ -372,4 +372,19 @@ class WC_Tests_Discounts extends WC_Unit_Test_Case {
|
||||||
update_option( 'woocommerce_calc_taxes', 'no' );
|
update_option( 'woocommerce_calc_taxes', 'no' );
|
||||||
$coupon->delete( true );
|
$coupon->delete( true );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public function test_free_shipping_coupon_no_products() {
|
||||||
|
$discounts = new WC_Discounts();
|
||||||
|
$coupon = WC_Helper_Coupon::create_coupon( 'freeshipping' );
|
||||||
|
$coupon->set_props( array(
|
||||||
|
'discount_type' => 'percent',
|
||||||
|
'amount' => '',
|
||||||
|
'free_shipping' => 'yes',
|
||||||
|
));
|
||||||
|
|
||||||
|
$discounts->apply_coupon( $coupon );
|
||||||
|
|
||||||
|
$all_discounts = $discounts->get_discounts();
|
||||||
|
$this->assertEquals( 0, count( $all_discounts['freeshipping'] ), 'Free shipping coupon should not have any discounts.' );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue