Buy_X_For_Y_Fixed extends Type implements Applicable, Actionable Uses Discount_With_Required_Qty, Discount_With_Calculated_Subtotal
Buy X for Y fixed discount type.
Charge a fixed price for buying multiple quantities, e.g. 2 tshirts for $25.
Tags
Interfaces, Classes and Traits
 Applicable
 Indicates that a discount type needs to be verified as applicable to the cart as a whole.
 Actionable
 Interface for discount types that have cart actions.
Table of Contents
 ORDER = 4
 $discount : Discount
 The discount object.
 $processing_order : bool
 Whether the discount type is processing a WooCommerce order.
 $total_discounted_products : int
 The total number of discounted products in the cartorder.
 $total_order_discount : float
 The total discount that needs to be applied to the order.
 cart_meets_products_selection_and_quantity() : bool
 Check whether the cart meets the minimum required quantity for the discount to apply.
 decrease_total_discounted_products() : self
 Decrease the total number of discounted products in the cartorder.
 decrease_total_order_discount() : self
 Decrease the total discount that needs to be applied to the order.
 generate_virtual_coupon_for_order() : void
 Generate a virtual coupon for the order.
 get_cart_quantity_of_relevant_products() : int
 Return the total quantity of relevant products in the cart.
 get_default_settings_values() : array<stringint, mixed>
 Get the default settings values for this discount type.
 get_discount() : Discount
 Get the discount object.
 get_fixed_price() : float
 Get the fixed price for the discount.
 get_min_required_qty() : int
 Retrieve the minimum required quantity for the discount to apply.
 get_name() : string
 Get the name for this discount type.
 get_order_quantity_of_relevant_products() : int
 Return the total quantity of relevant products in the order.
 get_settings() : array<stringint, mixed>
 Get the settings for this discount type.
 get_slug() : string
 Get the slug for this discount type.
 get_tooltip() : string
 Get the tooltip for this discount type.
 get_total_discounted_products() : int
 Return the total number of discounted products in the cartorder.
 get_total_order_discount() : float
 Return the total discount that needs to be applied to the order.
 increase_total_discounted_products() : self
 Increase the total number of discounted products in the cartorder.
 increase_total_order_discount() : self
 Increase the total discount that needs to be applied to the order.
 is_applicable_to_cart() : bool
 Determine if the discount is applicable to the cart as a whole.
 is_applicable_to_order() : bool
 Determine if the discount is applicable to the order as a whole.
 is_processing_order() : bool
 Return whether the discount type is being applied to a WooCommerce order.
 make() : static
 Make a new discount type.
 order_meets_products_selection_and_quantity() : bool
 Check whether the order meets the minimum required quantity for the discount to apply.
 reset_total_discounted_products() : self
 Reset the total number of discounted products in the cartorder.
 reset_total_order_discount() : self
 Reset the total discount that needs to be applied to the order.
 run_cart_actions() : void
 Forces products to be discounted and match the fixed price.
 run_order_actions() : void
 Apply a percentage discount to all order items in the order so that the total price is equal to the fixed price as set in the discount settings.
 set_discount() : self
 Set the discount object.
 set_proccesing_order() : self
 Flag whether the discount type is being applied to a WooCommerce order.
 set_total_discounted_products() : self
 Set the total number of discounted products in the cartorder.
 set_total_order_discount() : self
 Set the total discount that needs to be applied to the order.
 cart_has_product_with_required_qty() : bool
 Check if the cart has a product with the required quantity.
 get_cart_order_cheapest_product_with_required_qty() : mixed
 Get the cheapest product with the required quantity.
 get_cart_subtotal() : float
 Get the appropriate subtotal used to determine the dynamic discount amount generated by the fixed price.
 get_order_subtotal() : float
 Get the appropriate subtotal used to determine the dynamic discount amount generated by the fixed price.
 maybe_discount_all_items() : void
 Maybe discount all items.
 maybe_discount_item() : void
 Maybe discount an item.
 order_has_product_with_required_qty() : bool
 Check if the order has a product with the required quantity.
Constants
ORDER
public
mixed
ORDER
= 4
Properties
$discount
The discount object.
protected
Discount
$discount
$processing_order
Whether the discount type is processing a WooCommerce order.
protected
bool
$processing_order
= false
This is used so that we prevent applying discounts at a order line level due to the multitude of issues in how taxes are calculated in WooCommerce.
$total_discounted_products
The total number of discounted products in the cartorder.
protected
int
$total_discounted_products
= 0
This is used to track the number of discounted products in the cartorder but not all types will use this.
Not all discount types need to track the number of discounted products.
$total_order_discount
The total discount that needs to be applied to the order.
protected
float
$total_order_discount
= 0
Methods
cart_meets_products_selection_and_quantity()
Check whether the cart meets the minimum required quantity for the discount to apply.
public
cart_meets_products_selection_and_quantity(WC_Cart $cart, Discount $discount) : bool
 If the discount is applicable to all products, the cart must contain the minimum required quantity of any product.
 If the discount is applicable to specific products, the cart must contain the minimum required quantity of any of the selected products.
 If the discount is applicable to specific categories, the cart must contain the minimum required quantity of any product in the selected categories.
Parameters
 $cart : WC_Cart
 $discount : Discount
Return values
bool —decrease_total_discounted_products()
Decrease the total number of discounted products in the cartorder.
public
decrease_total_discounted_products(int $amount) : self
Parameters
 $amount : int

The amount to decrease the total number of discounted products by.
Return values
self —The discount type.
decrease_total_order_discount()
Decrease the total discount that needs to be applied to the order.
public
decrease_total_order_discount(float $amount) : self
Parameters
 $amount : float

The amount to decrease the total discount by.
Return values
self —The discount type.
generate_virtual_coupon_for_order()
Generate a virtual coupon for the order.
public
generate_virtual_coupon_for_order(WC_Order $order) : void
This is used to apply the discount to the order and is not a real coupon.
This is mainly used during the creating of manual orders.
Parameters
 $order : WC_Order

The order object.
Return values
void —get_cart_quantity_of_relevant_products()
Return the total quantity of relevant products in the cart.
public
get_cart_quantity_of_relevant_products(WC_Cart $cart) : int
Parameters
 $cart : WC_Cart

The cart object.
Return values
int —get_default_settings_values()
Get the default settings values for this discount type.
public
static get_default_settings_values() : array<stringint, mixed>
Tags
Return values
array<stringint, mixed> —get_discount()
Get the discount object.
public
get_discount() : Discount
Return values
Discount —get_fixed_price()
Get the fixed price for the discount.
public
get_fixed_price() : float
Return values
float —get_min_required_qty()
Retrieve the minimum required quantity for the discount to apply.
public
get_min_required_qty() : int
Return values
int —get_name()
Get the name for this discount type.
public
static get_name() : string
Tags
Return values
string —get_order_quantity_of_relevant_products()
Return the total quantity of relevant products in the order.
public
get_order_quantity_of_relevant_products(WC_Order $order) : int
Parameters
 $order : WC_Order

The order object.
Return values
int —get_settings()
Get the settings for this discount type.
public
static get_settings() : array<stringint, mixed>
Tags
Return values
array<stringint, mixed> —get_slug()
Get the slug for this discount type.
public
static get_slug() : string
Tags
Return values
string —get_tooltip()
Get the tooltip for this discount type.
public
static get_tooltip() : string
Tags
Return values
string —get_total_discounted_products()
Return the total number of discounted products in the cartorder.
public
get_total_discounted_products() : int
Return values
int —get_total_order_discount()
Return the total discount that needs to be applied to the order.
public
get_total_order_discount() : float
Return values
float —increase_total_discounted_products()
Increase the total number of discounted products in the cartorder.
public
increase_total_discounted_products(int $amount) : self
Parameters
 $amount : int

The amount to increase the total number of discounted products by.
Return values
self —The discount type.
increase_total_order_discount()
Increase the total discount that needs to be applied to the order.
public
increase_total_order_discount(float $amount) : self
Parameters
 $amount : float

The amount to increase the total discount by.
Return values
self —The discount type.
is_applicable_to_cart()
Determine if the discount is applicable to the cart as a whole.
public
is_applicable_to_cart(WC_Cart $cart) : bool
Parameters
 $cart : WC_Cart

The cart object.
Tags
Return values
bool —True if the discount is applicable to the cart as a whole.
is_applicable_to_order()
Determine if the discount is applicable to the order as a whole.
public
is_applicable_to_order(WC_Order $order) : bool
Parameters
 $order : WC_Order

The order object.
Tags
Return values
bool —True if the discount is applicable to the order as a whole.
is_processing_order()
Return whether the discount type is being applied to a WooCommerce order.
public
is_processing_order() : bool
Return values
bool —make()
Make a new discount type.
public
static make(Discount $discount) : static
Parameters
 $discount : Discount

The discount object.
Return values
static —The new discount type.
order_meets_products_selection_and_quantity()
Check whether the order meets the minimum required quantity for the discount to apply.
public
order_meets_products_selection_and_quantity(WC_Order $order, Discount $discount) : bool
 If the discount is applicable to all products, the order must contain the minimum required quantity of any product.
 If the discount is applicable to specific products, the order must contain the minimum required quantity of any of the selected products.
 If the discount is applicable to specific categories, the order must contain the minimum required quantity of any product in the selected categories.
Parameters
 $order : WC_Order
 $discount : Discount
Return values
bool —reset_total_discounted_products()
Reset the total number of discounted products in the cartorder.
public
reset_total_discounted_products() : self
Return values
self —The discount type.
reset_total_order_discount()
Reset the total discount that needs to be applied to the order.
public
reset_total_order_discount() : self
Return values
self —The discount type.
run_cart_actions()
Forces products to be discounted and match the fixed price.
public
run_cart_actions(WC_Cart &$cart) : void
This is used to ensure that the total price of the cart/order is equal to the fixed price as set in the discount settings.
 If the discount applies to all products, then all products will be discounted so that the subtotal of the cart is equal to the fixed price.
 If the discount applies to specific products, then only those products will be discounted so that the subtotal of those products combined is equal to the fixed price.
 If the discount applies to specific categories, then only products in those categories will be discounted so that the subtotal of those products combined is equal to the fixed price.
Parameters
 $cart : WC_Cart

The cart.
Return values
void —run_order_actions()
Apply a percentage discount to all order items in the order so that the total price is equal to the fixed price as set in the discount settings.
public
run_order_actions(WC_Order &$order) : void
Parameters
 $order : WC_Order

The order.
Return values
void —set_discount()
Set the discount object.
public
set_discount(Discount $discount) : self
Parameters
 $discount : Discount

The discount object.
Return values
self —set_proccesing_order()
Flag whether the discount type is being applied to a WooCommerce order.
public
set_proccesing_order(bool $processing_order) : self
Parameters
 $processing_order : bool

Whether the discount type is processing a WooCommerce order.
Return values
self —The discount type.
set_total_discounted_products()
Set the total number of discounted products in the cartorder.
public
set_total_discounted_products(int $total_discounted_products) : self
Parameters
 $total_discounted_products : int

The total number of discounted products in the cartorder.
Return values
self —The discount type.
set_total_order_discount()
Set the total discount that needs to be applied to the order.
public
set_total_order_discount(float $total_order_discount) : self
Parameters
 $total_order_discount : float

The total discount that needs to be applied to the order.
Return values
self —The discount type.
cart_has_product_with_required_qty()
Check if the cart has a product with the required quantity.
private
cart_has_product_with_required_qty(array<stringint, mixed> $products[, boolint $custom_additional_qty = false ][, bool $skip_additional_qty = false ]) : bool
Parameters
 $products : array<stringint, mixed>

Array of products in the cart.
 $custom_additional_qty : boolint = false

Whether to use the custom additional quantity or not.
 $skip_additional_qty : bool = false

Whether to skip the additional quantity or not.
Return values
bool —True if the cart has a product with the required quantity, false otherwise.
get_cart_order_cheapest_product_with_required_qty()
Get the cheapest product with the required quantity.
private
get_cart_order_cheapest_product_with_required_qty(array<stringint, mixed> $products, int $required_qty[, boolWC_Cart $cart = false ][, boolWC_Order $order = false ]) : mixed
The $products array is expected to be sorted by price ascending.
Additionally the $products array may contain cart items or order items.
Parameters
 $products : array<stringint, mixed>

Array of cart items or order items.
 $required_qty : int

The required quantity.
 $cart : boolWC_Cart = false

The cart.
 $order : boolWC_Order = false

The order.
Return values
mixed —get_cart_subtotal()
Get the appropriate subtotal used to determine the dynamic discount amount generated by the fixed price.
private
get_cart_subtotal(WC_Cart $cart) : float
 If the discount applies to all products, then the subtotal of the cart is used.
 If the discount applies to specific products, then the subtotal of those products combined is used.
 If the discount applies to specific categories, then the subtotal of the products in those categories combined is used.
The subtotal also needs to take into account whether prices include tax.
Parameters
 $cart : WC_Cart

The cart.
Return values
float —The subtotal.
get_order_subtotal()
Get the appropriate subtotal used to determine the dynamic discount amount generated by the fixed price.
private
get_order_subtotal(WC_Order $order) : float
 If the discount applies to all products, then the subtotal of the order is used.
 If the discount applies to specific products, then the subtotal of those products combined is used.
 If the discount applies to specific categories, then the subtotal of the products in those categories combined is used.
The subtotal also needs to take into account whether prices include tax.
Parameters
 $order : WC_Order

The order.
Return values
float —The subtotal.
maybe_discount_all_items()
Maybe discount all items.
private
maybe_discount_all_items(array<stringint, mixed> $items[, boolWC_Cart $cart = false ][, boolWC_Order $order = false ]) : void
Parameters
 $items : array<stringint, mixed>

Array of cart items or order items.
 $cart : boolWC_Cart = false

The cart.
 $order : boolWC_Order = false

The order.
Return values
void —maybe_discount_item()
Maybe discount an item.
private
maybe_discount_item(mixed $item[, boolWC_Cart $cart = false ][, boolWC_Order $order = false ]) : void
Parameters
 $item : mixed

The cart item or order item.
 $cart : boolWC_Cart = false

The cart.
 $order : boolWC_Order = false

The order.
Return values
void —order_has_product_with_required_qty()
Check if the order has a product with the required quantity.
private
order_has_product_with_required_qty(array<stringint, mixed> $products[, boolint $custom_additional_qty = false ][, bool $skip_additional_qty = false ]) : bool
Parameters
 $products : array<stringint, mixed>

Array of products in the order.
 $custom_additional_qty : boolint = false

Whether to use the custom additional quantity or not.
 $skip_additional_qty : bool = false
Return values
bool —True if the order has a product with the required quantity, false otherwise.