| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151 |
- <?php
- /**
- * Cart fees API.
- *
- * Developers can add fees to the cart via WC()->cart->fees_api() which will reference this class.
- *
- * We suggest using the action woocommerce_cart_calculate_fees hook for adding fees.
- *
- * @package WooCommerce/Classes
- * @version 3.2.0
- */
- defined( 'ABSPATH' ) || exit;
- /**
- * WC_Cart_Fees class.
- *
- * @since 3.2.0
- */
- final class WC_Cart_Fees {
- /**
- * An array of fee objects.
- *
- * @var object[]
- */
- private $fees = array();
- /**
- * Reference to cart object.
- *
- * @since 3.2.0
- * @var WC_Cart
- */
- private $cart;
- /**
- * New fees are made out of these props.
- *
- * @var array
- */
- private $default_fee_props = array(
- 'id' => '',
- 'name' => '',
- 'tax_class' => '',
- 'taxable' => false,
- 'amount' => 0,
- 'total' => 0,
- );
- /**
- * Constructor. Reference to the cart.
- *
- * @since 3.2.0
- * @throws Exception If missing WC_Cart object.
- * @param WC_Cart $cart Cart object.
- */
- public function __construct( &$cart ) {
- if ( ! is_a( $cart, 'WC_Cart' ) ) {
- throw new Exception( 'A valid WC_Cart object is required' );
- }
- $this->cart = $cart;
- }
- /**
- * Register methods for this object on the appropriate WordPress hooks.
- */
- public function init() {}
- /**
- * Add a fee. Fee IDs must be unique.
- *
- * @since 3.2.0
- * @param array $args Array of fee properties.
- * @return object Either a fee object if added, or a WP_Error if it failed.
- */
- public function add_fee( $args = array() ) {
- $fee_props = (object) wp_parse_args( $args, $this->default_fee_props );
- $fee_props->name = $fee_props->name ? $fee_props->name : __( 'Fee', 'woocommerce' );
- $fee_props->tax_class = in_array( $fee_props->tax_class, array_merge( WC_Tax::get_tax_classes(), WC_Tax::get_tax_class_slugs() ), true ) ? $fee_props->tax_class : '';
- $fee_props->taxable = wc_string_to_bool( $fee_props->taxable );
- $fee_props->amount = wc_format_decimal( $fee_props->amount );
- if ( empty( $fee_props->id ) ) {
- $fee_props->id = $this->generate_id( $fee_props );
- }
- if ( array_key_exists( $fee_props->id, $this->fees ) ) {
- return new WP_Error( 'fee_exists', __( 'Fee has already been added.', 'woocommerce' ) );
- }
- $this->fees[ $fee_props->id ] = $fee_props;
- return $this->fees[ $fee_props->id ];
- }
- /**
- * Get fees.
- *
- * @return array
- */
- public function get_fees() {
- uasort( $this->fees, array( $this, 'sort_fees_callback' ) );
- return $this->fees;
- }
- /**
- * Set fees.
- *
- * @param object[] $raw_fees Array of fees.
- */
- public function set_fees( $raw_fees = array() ) {
- $this->fees = array();
- foreach ( $raw_fees as $raw_fee ) {
- $this->add_fee( $raw_fee );
- }
- }
- /**
- * Remove all fees.
- *
- * @since 3.2.0
- */
- public function remove_all_fees() {
- $this->set_fees();
- }
- /**
- * Sort fees by amount.
- *
- * @param WC_Coupon $a Coupon object.
- * @param WC_Coupon $b Coupon object.
- * @return int
- */
- protected function sort_fees_callback( $a, $b ) {
- return ( $a->amount > $b->amount ) ? -1 : 1;
- }
- /**
- * Generate a unique ID for the fee being added.
- *
- * @param string $fee Fee object.
- * @return string fee key.
- */
- private function generate_id( $fee ) {
- return sanitize_title( $fee->name );
- }
- }
|