2011-08-09 15:16:18 +00:00
< ? php
/**
2011-08-10 17:11:11 +00:00
* WooCommerce cart
2011-08-09 15:16:18 +00:00
*
2011-08-10 17:11:11 +00:00
* The WooCommerce cart class stores cart data and active coupons as well as handling customer sessions and some cart related urls .
2012-01-30 19:24:52 +00:00
* The cart class also has a price calculation function which calls upon other classes to calculate totals .
2011-08-09 15:16:18 +00:00
*
2012-03-20 13:22:35 +00:00
* @ class WC_Cart
* @ package WooCommerce
* @ category Class
* @ author WooThemes
2011-08-09 15:16:18 +00:00
*/
2012-01-27 16:38:39 +00:00
class WC_Cart {
2011-11-06 13:45:18 +00:00
var $cart_contents ;
var $applied_coupons ;
2011-09-06 11:11:22 +00:00
var $cart_contents_total ;
var $cart_contents_weight ;
var $cart_contents_count ;
var $cart_contents_tax ;
var $total ;
var $subtotal ;
var $subtotal_ex_tax ;
var $tax_total ;
2011-12-28 23:59:33 +00:00
var $taxes ;
2012-01-27 15:00:03 +00:00
var $shipping_taxes ;
2011-11-25 19:31:06 +00:00
var $discount_cart ;
2011-09-06 11:11:22 +00:00
var $discount_total ;
var $shipping_total ;
var $shipping_tax_total ;
2012-01-13 11:15:01 +00:00
var $shipping_label ;
2011-11-19 20:59:16 +00:00
var $tax ;
2011-11-06 13:45:18 +00:00
/**
* Constructor
2012-03-20 13:22:35 +00:00
*
* Gets options from DB , loads the tax class , and queues the cart init
2011-11-06 13:45:18 +00:00
*/
2011-08-09 15:16:18 +00:00
function __construct () {
2012-01-27 16:38:39 +00:00
$this -> tax = new WC_Tax ();
2012-03-20 13:22:35 +00:00
$this -> prices_include_tax = ( get_option ( 'woocommerce_prices_include_tax' ) == 'yes' ) ? true : false ;
$this -> display_totals_ex_tax = ( get_option ( 'woocommerce_display_totals_excluding_tax' ) == 'yes' ) ? true : false ;
$this -> display_cart_ex_tax = ( get_option ( 'woocommerce_display_cart_prices_excluding_tax' ) == 'yes' ) ? true : false ;
2012-03-20 19:22:10 +00:00
add_action ( 'init' , array ( & $this , 'init' ), 5 ); // Get cart on init
2011-08-09 15:16:18 +00:00
}
2011-11-06 13:45:18 +00:00
/**
* Loads the cart data from the session during WordPress init
*/
function init () {
2011-09-06 11:11:22 +00:00
$this -> get_cart_from_session ();
2012-01-13 11:15:01 +00:00
2011-11-09 17:26:45 +00:00
add_action ( 'woocommerce_check_cart_items' , array ( & $this , 'check_cart_items' ), 1 );
2012-03-14 11:16:26 +00:00
add_action ( 'woocommerce_after_checkout_validation' , array ( & $this , 'check_customer_coupons' ), 1 );
2011-08-09 15:16:18 +00:00
}
2011-12-08 12:50:50 +00:00
/*-----------------------------------------------------------------------------------*/
/* Cart Session Handling */
/*-----------------------------------------------------------------------------------*/
2011-08-09 15:16:18 +00:00
2011-12-08 12:50:50 +00:00
/**
* Get the cart data from the PHP session
*/
function get_cart_from_session () {
2012-02-24 21:05:15 +00:00
global $woocommerce ;
2012-01-13 11:15:01 +00:00
// Load the coupons
2012-03-20 13:22:35 +00:00
if ( get_option ( 'woocommerce_enable_coupons' ) == 'yes' )
$this -> applied_coupons = ( empty ( $_SESSION [ 'coupons' ] ) ) ? array () : array_unique ( array_filter ( ( array ) $_SESSION [ 'coupons' ] ) );
2012-01-13 11:15:01 +00:00
// Load the cart
2012-03-20 13:22:35 +00:00
if ( isset ( $_SESSION [ 'cart' ] ) && is_array ( $_SESSION [ 'cart' ] ) ) {
2011-12-08 12:50:50 +00:00
$cart = $_SESSION [ 'cart' ];
2012-03-20 13:22:35 +00:00
foreach ( $cart as $key => $values ) {
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
if ( $values [ 'variation_id' ] > 0 )
$_product = new WC_Product_Variation ( $values [ 'variation_id' ] );
else
$_product = new WC_Product ( $values [ 'product_id' ] );
2011-12-08 12:50:50 +00:00
2012-04-20 10:17:40 +00:00
if ( $_product -> exists () && $values [ 'quantity' ] > 0 ) {
2011-12-08 12:50:50 +00:00
// Put session data into array. Run through filter so other plugins can load their own session data
2012-03-20 13:22:35 +00:00
$this -> cart_contents [ $key ] = apply_filters ( 'woocommerce_get_cart_item_from_session' , array (
2011-12-08 12:50:50 +00:00
'product_id' => $values [ 'product_id' ],
'variation_id' => $values [ 'variation_id' ],
'variation' => $values [ 'variation' ],
'quantity' => $values [ 'quantity' ],
'data' => $_product
2012-06-06 11:27:19 +00:00
), $values , $key );
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
}
}
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
if ( ! is_array ( $this -> cart_contents ) )
2012-01-13 11:15:01 +00:00
$this -> cart_contents = array ();
2012-03-20 13:22:35 +00:00
} else {
2011-12-08 12:50:50 +00:00
$this -> cart_contents = array ();
2012-03-20 13:22:35 +00:00
}
2011-12-08 12:50:50 +00:00
2012-02-24 21:05:15 +00:00
// Cookie
2012-03-20 13:22:35 +00:00
if ( sizeof ( $this -> cart_contents ) > 0 )
2012-02-24 21:05:15 +00:00
$woocommerce -> cart_has_contents_cookie ( true );
else
$woocommerce -> cart_has_contents_cookie ( false );
2012-03-12 13:11:08 +00:00
2012-01-13 11:15:01 +00:00
// Load totals
2012-03-20 13:22:35 +00:00
$this -> cart_contents_total = isset ( $_SESSION [ 'cart_contents_total' ] ) ? $_SESSION [ 'cart_contents_total' ] : 0 ;
$this -> cart_contents_weight = isset ( $_SESSION [ 'cart_contents_weight' ] ) ? $_SESSION [ 'cart_contents_weight' ] : 0 ;
$this -> cart_contents_count = isset ( $_SESSION [ 'cart_contents_count' ] ) ? $_SESSION [ 'cart_contents_count' ] : 0 ;
$this -> cart_contents_tax = isset ( $_SESSION [ 'cart_contents_tax' ] ) ? $_SESSION [ 'cart_contents_tax' ] : 0 ;
$this -> total = isset ( $_SESSION [ 'total' ] ) ? $_SESSION [ 'total' ] : 0 ;
$this -> subtotal = isset ( $_SESSION [ 'subtotal' ] ) ? $_SESSION [ 'subtotal' ] : 0 ;
$this -> subtotal_ex_tax = isset ( $_SESSION [ 'subtotal_ex_tax' ] ) ? $_SESSION [ 'subtotal_ex_tax' ] : 0 ;
$this -> tax_total = isset ( $_SESSION [ 'tax_total' ] ) ? $_SESSION [ 'tax_total' ] : 0 ;
$this -> taxes = isset ( $_SESSION [ 'taxes' ] ) ? $_SESSION [ 'taxes' ] : array ();
$this -> shipping_taxes = isset ( $_SESSION [ 'shipping_taxes' ] ) ? $_SESSION [ 'shipping_taxes' ] : array ();
$this -> discount_cart = isset ( $_SESSION [ 'discount_cart' ] ) ? $_SESSION [ 'discount_cart' ] : 0 ;
$this -> discount_total = isset ( $_SESSION [ 'discount_total' ] ) ? $_SESSION [ 'discount_total' ] : 0 ;
$this -> shipping_total = isset ( $_SESSION [ 'shipping_total' ] ) ? $_SESSION [ 'shipping_total' ] : 0 ;
$this -> shipping_tax_total = isset ( $_SESSION [ 'shipping_tax_total' ] ) ? $_SESSION [ 'shipping_tax_total' ] : 0 ;
$this -> shipping_label = isset ( $_SESSION [ 'shipping_label' ] ) ? $_SESSION [ 'shipping_label' ] : '' ;
2012-01-13 11:15:01 +00:00
2012-03-12 09:26:43 +00:00
// Queue re-calc if subtotal is not set
2012-03-20 13:22:35 +00:00
if ( ! $this -> subtotal && sizeof ( $this -> cart_contents ) > 0 )
$this -> set_session ();
2011-12-08 12:50:50 +00:00
}
/**
2012-01-13 11:15:01 +00:00
* Sets the php session data for the cart and coupons and re - calculates totals
2011-12-08 12:50:50 +00:00
*/
function set_session () {
2012-03-12 13:11:08 +00:00
2012-01-13 11:15:01 +00:00
// Re-calc totals
2011-12-08 12:50:50 +00:00
$this -> calculate_totals ();
2012-01-13 11:15:01 +00:00
// Set cart and coupon session data
2012-03-07 20:12:14 +00:00
$cart_session = array ();
2012-03-20 13:22:35 +00:00
if ( $this -> cart_contents ) {
foreach ( $this -> cart_contents as $key => $values ) {
$cart_session [ $key ] = $values ;
// Unset product object
unset ( $cart_session [ $key ][ 'data' ] );
}
2012-03-07 20:12:14 +00:00
}
$_SESSION [ 'cart' ] = $cart_session ;
2012-01-13 11:15:01 +00:00
$_SESSION [ 'coupons' ] = $this -> applied_coupons ;
// Store totals to avoid re-calc on page load
$_SESSION [ 'cart_contents_total' ] = $this -> cart_contents_total ;
$_SESSION [ 'cart_contents_weight' ] = $this -> cart_contents_weight ;
$_SESSION [ 'cart_contents_count' ] = $this -> cart_contents_count ;
$_SESSION [ 'cart_contents_tax' ] = $this -> cart_contents_tax ;
$_SESSION [ 'total' ] = $this -> total ;
$_SESSION [ 'subtotal' ] = $this -> subtotal ;
$_SESSION [ 'subtotal_ex_tax' ] = $this -> subtotal_ex_tax ;
$_SESSION [ 'tax_total' ] = $this -> tax_total ;
2012-01-27 15:00:03 +00:00
$_SESSION [ 'shipping_taxes' ] = $this -> shipping_taxes ;
2012-01-13 11:15:01 +00:00
$_SESSION [ 'taxes' ] = $this -> taxes ;
$_SESSION [ 'discount_cart' ] = $this -> discount_cart ;
$_SESSION [ 'discount_total' ] = $this -> discount_total ;
$_SESSION [ 'shipping_total' ] = $this -> shipping_total ;
$_SESSION [ 'shipping_tax_total' ] = $this -> shipping_tax_total ;
$_SESSION [ 'shipping_label' ] = $this -> shipping_label ;
2012-03-04 12:37:41 +00:00
2012-03-20 13:22:35 +00:00
if ( get_current_user_id ())
$this -> persistent_cart_update ();
2012-03-04 12:37:41 +00:00
do_action ( 'woocommerce_cart_updated' );
2011-12-08 12:50:50 +00:00
}
/**
2012-03-20 13:22:35 +00:00
* Empties the cart and optionally the persistent cart too
*
* @ access public
* @ param bool $clear_persistent_cart ( default : true )
2011-12-08 12:50:50 +00:00
*/
2012-03-04 12:37:41 +00:00
function empty_cart ( $clear_persistent_cart = true ) {
2011-12-08 12:50:50 +00:00
$this -> cart_contents = array ();
2012-01-04 23:01:47 +00:00
$this -> reset ();
2012-03-04 12:37:41 +00:00
2012-03-11 12:49:51 +00:00
unset ( $_SESSION [ 'coupons' ], $_SESSION [ 'cart' ] );
2012-03-04 12:37:41 +00:00
2012-03-20 13:22:35 +00:00
if ( $clear_persistent_cart && get_current_user_id () )
$this -> persistent_cart_destroy ();
2012-03-04 12:37:41 +00:00
do_action ( 'woocommerce_cart_emptied' );
2011-12-08 12:50:50 +00:00
}
2012-03-04 12:37:41 +00:00
/*-----------------------------------------------------------------------------------*/
/* Persistent cart handling */
/*-----------------------------------------------------------------------------------*/
/**
* Save the persistent cart when updated
*/
function persistent_cart_update () {
update_user_meta ( get_current_user_id (), '_woocommerce_persistent_cart' , array (
'cart' => $_SESSION [ 'cart' ],
));
}
/**
* Delete the persistent cart
*/
function persistent_cart_destroy () {
delete_user_meta ( get_current_user_id (), '_woocommerce_persistent_cart' );
}
2011-12-08 12:50:50 +00:00
/*-----------------------------------------------------------------------------------*/
/* Cart Data Functions */
/*-----------------------------------------------------------------------------------*/
2011-08-09 15:16:18 +00:00
2011-12-08 12:50:50 +00:00
/**
* Check cart items for errors
*/
function check_cart_items () {
global $woocommerce ;
2012-04-16 14:39:40 +00:00
2012-02-27 18:22:54 +00:00
// Check item stock
2011-12-08 12:50:50 +00:00
$result = $this -> check_cart_item_stock ();
2012-03-20 13:22:35 +00:00
if ( is_wp_error ( $result ))
$woocommerce -> add_error ( $result -> get_error_message () );
2011-12-08 12:50:50 +00:00
}
2012-03-28 17:42:35 +00:00
/**
* Get cart items quantities - merged so we can do accurate stock checks
*
* @ access public
* @ return array
*/
function get_cart_item_quantities () {
$quantities = array ();
foreach ( $this -> get_cart () as $cart_item_key => $values ) {
if ( $values [ 'data' ] -> managing_stock () ) {
if ( $values [ 'variation_id' ] > 0 ) {
if ( $values [ 'data' ] -> variation_has_stock ) {
// Variation has stock levels defined so its handled individually
$quantities [ $values [ 'variation_id' ] ] = isset ( $quantities [ $values [ 'variation_id' ] ] ) ? $quantities [ $values [ 'variation_id' ] ] + $values [ 'quantity' ] : $values [ 'quantity' ];
} else {
// Variation has no stock levels defined so use parents
$quantities [ $values [ 'product_id' ] ] = isset ( $quantities [ $values [ 'product_id' ] ] ) ? $quantities [ $values [ 'product_id' ] ] + $values [ 'quantity' ] : $values [ 'quantity' ];
}
} else {
$quantities [ $values [ 'product_id' ] ] = isset ( $quantities [ $values [ 'product_id' ] ] ) ? $quantities [ $values [ 'product_id' ] ] + $values [ 'quantity' ] : $values [ 'quantity' ];
}
}
}
return $quantities ;
}
2012-03-14 11:16:26 +00:00
/**
* Check for user coupons ( now we have billing email )
2012-03-20 13:22:35 +00:00
*
* @ access public
* @ param array $posted
*/
2012-03-14 11:16:26 +00:00
function check_customer_coupons ( $posted ) {
global $woocommerce ;
2012-03-20 13:22:35 +00:00
if ( ! empty ( $this -> applied_coupons ) ) {
foreach ( $this -> applied_coupons as $key => $code ) {
$coupon = new WC_Coupon ( $code );
2012-03-14 11:16:26 +00:00
2012-03-20 13:22:35 +00:00
if ( is_array ( $coupon -> customer_email ) && sizeof ( $coupon -> customer_email ) > 0 ) {
2012-03-20 18:36:25 +00:00
2012-03-20 13:22:35 +00:00
if ( is_user_logged_in () ) {
$current_user = wp_get_current_user ();
$check_emails [] = $current_user -> user_email ;
}
$check_emails [] = $posted [ 'billing_email' ];
2012-03-20 18:36:25 +00:00
$check_emails = array_map ( 'strtolower' , $check_emails );
if ( sizeof ( array_intersect ( $check_emails , $coupon -> customer_email ) ) == 0 ) {
2012-03-20 13:22:35 +00:00
$woocommerce -> add_error ( sprintf ( __ ( 'Sorry, it seems the coupon "%s" is not yours - it has now been removed from your order.' , 'woocommerce' ), $code ) );
// Remove the coupon
unset ( $this -> applied_coupons [ $key ] );
$_SESSION [ 'coupons' ] = $this -> applied_coupons ;
$_SESSION [ 'refresh_totals' ] = true ;
}
2012-03-14 11:16:26 +00:00
}
}
}
}
2012-03-20 13:22:35 +00:00
/**
* Looks through the cart to check each item is in stock
*
* @ access public
* @ return bool
2011-12-08 12:50:50 +00:00
*/
function check_cart_item_stock () {
$error = new WP_Error ();
2012-03-14 15:34:45 +00:00
2012-03-28 17:42:35 +00:00
$product_qty_in_cart = $this -> get_cart_item_quantities ();
2012-03-14 15:34:45 +00:00
// First stock check loop
2012-03-20 13:22:35 +00:00
foreach ( $this -> get_cart () as $cart_item_key => $values ) {
2012-03-14 15:34:45 +00:00
2011-12-08 12:50:50 +00:00
$_product = $values [ 'data' ];
2012-03-14 15:34:45 +00:00
/**
* Check stock based on inventory
*/
2012-03-20 13:22:35 +00:00
if ( $_product -> managing_stock () ) {
2012-03-14 15:34:45 +00:00
/**
* Check the stock for this item individually
*/
2012-03-20 13:22:35 +00:00
if ( ! $_product -> is_in_stock () || ! $_product -> has_enough_stock ( $values [ 'quantity' ] ) ) {
2012-01-05 11:31:22 +00:00
$error -> add ( 'out-of-stock' , sprintf ( __ ( 'Sorry, we do not have enough "%s" in stock to fulfill your order (%s in stock). Please edit your cart and try again. We apologise for any inconvenience caused.' , 'woocommerce' ), $_product -> get_title (), $_product -> stock ) );
2011-12-08 12:50:50 +00:00
return $error ;
2012-03-14 15:34:45 +00:00
}
/**
2012-03-28 17:42:35 +00:00
* Next check entire cart quantities
2012-03-14 15:34:45 +00:00
*/
2012-03-20 13:22:35 +00:00
if ( $values [ 'variation_id' ] && $_product -> variation_has_stock && isset ( $product_qty_in_cart [ $values [ 'variation_id' ]] ) ) {
2012-03-14 15:34:45 +00:00
2012-03-20 13:22:35 +00:00
if ( ! $_product -> has_enough_stock ( $product_qty_in_cart [ $values [ 'variation_id' ]] ) ) {
2012-03-14 15:34:45 +00:00
$error -> add ( 'out-of-stock' , sprintf ( __ ( 'Sorry, we do not have enough "%s" in stock to fulfill your order (%s in stock). Please edit your cart and try again. We apologise for any inconvenience caused.' , 'woocommerce' ), $_product -> get_title (), $_product -> stock ) );
return $error ;
}
2012-03-20 13:22:35 +00:00
} elseif ( isset ( $product_qty_in_cart [ $values [ 'product_id' ]] ) ) {
2012-03-14 15:34:45 +00:00
2012-03-20 13:22:35 +00:00
if ( ! $_product -> has_enough_stock ( $product_qty_in_cart [ $values [ 'product_id' ]] ) ) {
2012-03-14 15:34:45 +00:00
$error -> add ( 'out-of-stock' , sprintf ( __ ( 'Sorry, we do not have enough "%s" in stock to fulfill your order (%s in stock). Please edit your cart and try again. We apologise for any inconvenience caused.' , 'woocommerce' ), $_product -> get_title (), $_product -> stock ) );
return $error ;
}
}
2012-03-28 17:42:35 +00:00
/**
* Check stock based on stock - status
*/
} else {
if ( ! $_product -> is_in_stock () ) {
$error -> add ( 'out-of-stock' , sprintf ( __ ( 'Sorry, we do not have enough "%s" in stock to fulfill your order. Please edit your cart and try again. We apologise for any inconvenience caused.' , 'woocommerce' ), $_product -> get_title () ) );
return $error ;
}
2012-03-14 15:34:45 +00:00
}
}
2011-12-08 12:50:50 +00:00
return true ;
}
/**
* Gets and formats a list of cart item data + variations for display on the frontend
2012-03-20 13:22:35 +00:00
*
* @ access public
* @ param array $cart_item
* @ param bool $flat ( default : false )
* @ return string
2011-12-08 12:50:50 +00:00
*/
function get_item_data ( $cart_item , $flat = false ) {
global $woocommerce ;
2012-01-03 17:23:42 +00:00
$has_data = false ;
2012-03-20 13:22:35 +00:00
if ( ! $flat ) $return = '<dl class="variation">' ;
2011-08-09 15:16:18 +00:00
2011-12-08 12:50:50 +00:00
// Variation data
2012-03-20 13:22:35 +00:00
if ( $cart_item [ 'data' ] instanceof WC_Product_Variation && is_array ( $cart_item [ 'variation' ] ) ) {
2011-08-09 15:16:18 +00:00
2011-12-08 12:50:50 +00:00
$variation_list = array ();
2012-03-20 13:22:35 +00:00
foreach ( $cart_item [ 'variation' ] as $name => $value ) {
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
if ( ! $value ) continue ;
2011-12-08 12:50:50 +00:00
// If this is a term slug, get the term's nice name
2012-03-20 13:22:35 +00:00
if ( taxonomy_exists ( esc_attr ( str_replace ( 'attribute_' , '' , $name ) ) ) ) {
$term = get_term_by ( 'slug' , $value , esc_attr ( str_replace ( 'attribute_' , '' , $name ) ) );
if ( ! is_wp_error ( $term ) && $term -> name )
2011-12-08 12:50:50 +00:00
$value = $term -> name ;
2012-03-20 13:22:35 +00:00
} else {
$value = ucfirst ( $value );
}
2011-12-08 12:50:50 +00:00
2012-06-10 17:45:43 +00:00
if ( $flat )
2012-03-20 13:22:35 +00:00
$variation_list [] = $woocommerce -> attribute_label ( str_replace ( 'attribute_' , '' , $name ) ) . ': ' . $value ;
else
2012-06-10 17:45:43 +00:00
$variation_list [] = '<dt>' . $woocommerce -> attribute_label ( str_replace ( 'attribute_' , '' , $name ) ) . ':</dt><dd>' . $value . '</dd>' ;
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
}
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
if ( $flat )
2012-06-10 18:07:19 +00:00
$return .= implode ( " , \n " , $variation_list );
2012-03-20 13:22:35 +00:00
else
$return .= implode ( '' , $variation_list );
2012-01-03 17:23:42 +00:00
$has_data = true ;
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
}
2011-12-08 12:50:50 +00:00
// Other data - returned as array with name/value values
2012-03-20 13:22:35 +00:00
$other_data = apply_filters ( 'woocommerce_get_item_data' , array (), $cart_item );
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
if ( $other_data && is_array ( $other_data ) && sizeof ( $other_data ) > 0 ) {
2011-12-08 12:50:50 +00:00
$data_list = array ();
2011-08-09 15:16:18 +00:00
2012-03-20 13:22:35 +00:00
foreach ( $other_data as $data ) {
2011-11-06 13:45:18 +00:00
2012-03-20 13:22:35 +00:00
$display_value = ! empty ( $data [ 'display' ]) ? $data [ 'display' ] : $data [ 'value' ];
2012-03-03 11:44:41 +00:00
2012-03-20 13:22:35 +00:00
if ( $flat )
2012-03-03 11:44:41 +00:00
$data_list [] = $data [ 'name' ] . ': ' . $display_value ;
2012-03-20 13:22:35 +00:00
else
2012-03-03 11:44:41 +00:00
$data_list [] = '<dt>' . $data [ 'name' ] . ':</dt><dd>' . $display_value . '</dd>' ;
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
}
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
if ( $flat )
2011-12-08 12:50:50 +00:00
$return .= implode ( ', ' , $data_list );
2012-03-20 13:22:35 +00:00
else
2011-12-08 12:50:50 +00:00
$return .= implode ( '' , $data_list );
2012-01-03 17:23:42 +00:00
$has_data = true ;
2012-03-20 13:22:35 +00:00
}
2011-08-09 15:16:18 +00:00
2012-03-20 13:22:35 +00:00
if ( ! $flat )
$return .= '</dl>' ;
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
if ( $has_data )
return $return ;
2011-12-08 12:50:50 +00:00
}
2011-08-09 15:16:18 +00:00
2011-12-08 12:50:50 +00:00
/**
* Gets cross sells based on the items in the cart
*
2012-03-20 13:22:35 +00:00
* @ return array cross_sells ( item ids )
2011-12-08 12:50:50 +00:00
*/
function get_cross_sells () {
$cross_sells = array ();
$in_cart = array ();
2012-03-20 13:22:35 +00:00
if ( sizeof ( $this -> cart_contents ) > 0 ) {
foreach ( $this -> cart_contents as $cart_item_key => $values ) {
if ( $values [ 'quantity' ] > 0 ) {
$cross_sells = array_merge ( $values [ 'data' ] -> get_cross_sells (), $cross_sells );
$in_cart [] = $values [ 'product_id' ];
}
}
}
$cross_sells = array_diff ( $cross_sells , $in_cart );
2011-12-08 12:50:50 +00:00
return $cross_sells ;
}
2011-11-06 13:45:18 +00:00
2012-03-20 13:22:35 +00:00
/**
* Gets the url to the cart page
*
* @ return string url to page
*/
2011-12-08 12:50:50 +00:00
function get_cart_url () {
2012-01-06 17:14:31 +00:00
$cart_page_id = woocommerce_get_page_id ( 'cart' );
2012-03-20 13:22:35 +00:00
if ( $cart_page_id ) return apply_filters ( 'woocommerce_get_cart_url' , get_permalink ( $cart_page_id ) );
2011-12-08 12:50:50 +00:00
}
2012-03-20 13:22:35 +00:00
/**
* Gets the url to the checkout page
*
* @ return string url to page
*/
2011-12-08 12:50:50 +00:00
function get_checkout_url () {
2012-01-06 17:14:31 +00:00
$checkout_page_id = woocommerce_get_page_id ( 'checkout' );
2012-03-20 13:22:35 +00:00
if ( $checkout_page_id ) {
if ( is_ssl () )
return str_replace ( 'http:' , 'https:' , get_permalink ( $checkout_page_id ) );
else
return apply_filters ( 'woocommerce_get_checkout_url' , get_permalink ( $checkout_page_id ) );
}
2011-12-08 12:50:50 +00:00
}
2011-08-09 15:16:18 +00:00
2012-03-20 13:22:35 +00:00
/**
* Gets the url to remove an item from the cart
*
* @ return string url to page
*/
2011-12-08 12:50:50 +00:00
function get_remove_url ( $cart_item_key ) {
global $woocommerce ;
2012-01-06 17:14:31 +00:00
$cart_page_id = woocommerce_get_page_id ( 'cart' );
2012-03-20 13:22:35 +00:00
if ( $cart_page_id )
return apply_filters ( 'woocommerce_get_remove_url' , $woocommerce -> nonce_url ( 'cart' , add_query_arg ( 'remove_item' , $cart_item_key , get_permalink ( $cart_page_id ) ) ) );
2011-12-08 12:50:50 +00:00
}
2011-08-27 20:07:16 +00:00
2011-12-08 12:50:50 +00:00
/**
* Returns the contents of the cart
2012-03-20 13:22:35 +00:00
*
* @ return array contents of the cart
2011-12-08 12:50:50 +00:00
*/
function get_cart () {
2012-04-12 18:18:55 +00:00
return array_filter ( ( array ) $this -> cart_contents );
2012-01-27 15:00:03 +00:00
}
/**
* Returns the cart and shipping taxes , merged
2012-03-20 13:22:35 +00:00
*
* @ return array merged taxes
2012-01-27 15:00:03 +00:00
*/
function get_taxes () {
$merged_taxes = array ();
// Merge
2012-03-20 13:22:35 +00:00
foreach ( array_keys ( $this -> taxes + $this -> shipping_taxes ) as $key ) {
$merged_taxes [ $key ] = ( isset ( $this -> shipping_taxes [ $key ] ) ? $this -> shipping_taxes [ $key ] : 0 ) + ( isset ( $this -> taxes [ $key ] ) ? $this -> taxes [ $key ] : 0 );
2012-01-27 15:00:03 +00:00
}
return $merged_taxes ;
2012-05-23 05:24:04 +00:00
}
2012-03-04 12:37:41 +00:00
2012-05-23 05:24:04 +00:00
/**
* Returns the cart and shipping taxes , merged & formatted
*
* @ return array merged taxes
*/
function get_formatted_taxes () {
$taxes = $this -> get_taxes ();
foreach ( $taxes as $key => $tax )
$taxes [ $key ] = woocommerce_price ( $tax );
return apply_filters ( 'woocommerce_cart_formatted_taxes' , $taxes , $this );
}
/*-----------------------------------------------------------------------------------*/
2011-12-08 12:50:50 +00:00
/* Add to cart handling */
/*-----------------------------------------------------------------------------------*/
/**
* Check if product is in the cart and return cart item key
*
* Cart item key will be unique based on the item and its properties , such as variations
2012-03-20 13:22:35 +00:00
*
* @ param mixed id of product to find in the cart
* @ return string cart item key
2011-12-08 12:50:50 +00:00
*/
function find_product_in_cart ( $cart_id = false ) {
2012-03-20 13:22:35 +00:00
if ( $cart_id !== false )
foreach ( $this -> cart_contents as $cart_item_key => $cart_item )
if ( $cart_item_key == $cart_id )
return $cart_item_key ;
2011-12-08 12:50:50 +00:00
}
2011-11-09 12:17:05 +00:00
2011-12-08 12:50:50 +00:00
/**
* Generate a unique ID for the cart item being added
2012-03-20 13:22:35 +00:00
*
* @ param int $product_id - id of the product the key is being generated for
* @ param int $variation_id of the product the key is being generated for
* @ param array $variation data for the cart item
* @ param array $cart_item_data other cart item data passed which affects this items uniqueness in the cart
* @ return string cart item key
2011-12-08 12:50:50 +00:00
*/
2012-04-10 16:56:44 +00:00
function generate_cart_id ( $product_id , $variation_id = '' , $variation = '' , $cart_item_data = array () ) {
2011-12-08 12:50:50 +00:00
$id_parts = array ( $product_id );
2012-03-20 13:22:35 +00:00
if ( $variation_id ) $id_parts [] = $variation_id ;
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
if ( is_array ( $variation ) ) {
2011-12-08 12:50:50 +00:00
$variation_key = '' ;
2012-03-20 13:22:35 +00:00
foreach ( $variation as $key => $value ) {
$variation_key .= trim ( $key ) . trim ( $value );
}
2011-12-08 12:50:50 +00:00
$id_parts [] = $variation_key ;
2012-03-20 13:22:35 +00:00
}
2011-12-08 12:50:50 +00:00
2012-04-10 16:56:44 +00:00
if ( is_array ( $cart_item_data ) && ! empty ( $cart_item_data ) ) {
2011-12-08 12:50:50 +00:00
$cart_item_data_key = '' ;
2012-03-20 13:22:35 +00:00
foreach ( $cart_item_data as $key => $value ) {
if ( is_array ( $value ) ) $value = http_build_query ( $value );
2011-12-08 12:50:50 +00:00
$cart_item_data_key .= trim ( $key ) . trim ( $value );
2012-03-20 13:22:35 +00:00
}
2011-12-08 12:50:50 +00:00
$id_parts [] = $cart_item_data_key ;
2012-03-20 13:22:35 +00:00
}
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
return md5 ( implode ( '_' , $id_parts ) );
2011-12-08 12:50:50 +00:00
}
2011-11-06 13:45:18 +00:00
2011-12-08 12:50:50 +00:00
/**
* Add a product to the cart
*
2012-03-20 13:22:35 +00:00
* @ param string $product_id contains the id of the product to add to the cart
* @ param string $quantity contains the quantity of the item to add
* @ param int $variation_id
* @ param array $variation attribute values
* @ param array $cart_item_data extra cart item data we want to pass into the item
* @ return bool
2011-12-08 12:50:50 +00:00
*/
2012-03-15 12:09:03 +00:00
function add_to_cart ( $product_id , $quantity = 1 , $variation_id = '' , $variation = '' , $cart_item_data = array () ) {
2011-12-08 12:50:50 +00:00
global $woocommerce ;
2011-08-09 15:16:18 +00:00
2012-03-20 13:22:35 +00:00
if ( $quantity < 1 ) return false ;
2011-08-09 15:16:18 +00:00
2011-12-08 12:50:50 +00:00
// Load cart item data - may be added by other plugins
2012-03-20 13:22:35 +00:00
$cart_item_data = ( array ) apply_filters ( 'woocommerce_add_cart_item_data' , $cart_item_data , $product_id );
2011-11-06 13:45:18 +00:00
2011-12-08 12:50:50 +00:00
// Generate a ID based on product ID, variation ID, variation data, and other cart item data
$cart_id = $this -> generate_cart_id ( $product_id , $variation_id , $variation , $cart_item_data );
2011-11-06 13:45:18 +00:00
2011-12-08 12:50:50 +00:00
// See if this product and its options is already in the cart
2012-03-20 13:22:35 +00:00
$cart_item_key = $this -> find_product_in_cart ( $cart_id );
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
if ( $variation_id > 0 )
2012-01-27 16:38:39 +00:00
$product_data = new WC_Product_Variation ( $variation_id );
2012-03-20 13:22:35 +00:00
else
2012-01-27 16:38:39 +00:00
$product_data = new WC_Product ( $product_id );
2011-11-06 13:45:18 +00:00
2012-05-11 11:47:23 +00:00
// Force quantity to 1 if sold individually
if ( $product_data -> is_sold_individually () )
$quantity = 1 ;
2011-12-08 12:50:50 +00:00
// Type/Exists check
2012-03-20 13:22:35 +00:00
if ( $product_data -> is_type ( 'external' ) || ! $product_data -> exists () ) {
2012-01-05 11:31:22 +00:00
$woocommerce -> add_error ( __ ( 'This product cannot be purchased.' , 'woocommerce' ) );
2011-12-08 12:50:50 +00:00
return false ;
2012-03-20 13:22:35 +00:00
}
2011-11-06 13:45:18 +00:00
2011-12-08 12:50:50 +00:00
// Price set check
2012-03-20 13:22:35 +00:00
if ( $product_data -> get_price () === '' ) {
2012-01-05 11:31:22 +00:00
$woocommerce -> add_error ( __ ( 'This product cannot be purchased - the price is not yet set.' , 'woocommerce' ) );
2011-12-08 12:50:50 +00:00
return false ;
2012-03-20 13:22:35 +00:00
}
2011-12-08 12:50:50 +00:00
// Stock check - only check if we're managing stock and backorders are not allowed
2012-03-20 13:22:35 +00:00
if ( ! $product_data -> has_enough_stock ( $quantity ) ) {
2012-01-05 11:31:22 +00:00
$woocommerce -> add_error ( sprintf ( __ ( 'You cannot add that amount to the cart since there is not enough stock. We have %s in stock.' , 'woocommerce' ), $product_data -> get_stock_quantity () ));
2011-12-08 12:50:50 +00:00
return false ;
2012-03-20 13:22:35 +00:00
} elseif ( ! $product_data -> is_in_stock () ) {
2012-01-05 11:31:22 +00:00
$woocommerce -> add_error ( __ ( 'You cannot add that product to the cart since the product is out of stock.' , 'woocommerce' ) );
2011-12-08 12:50:50 +00:00
return false ;
2012-03-20 13:22:35 +00:00
}
2012-06-10 12:53:26 +00:00
2012-02-27 18:22:54 +00:00
// Downloadable/virtual qty check
2012-05-11 11:47:23 +00:00
if ( $product_data -> is_sold_individually () ) {
$in_cart_quantity = ( $cart_item_key ) ? $this -> cart_contents [ $cart_item_key ][ 'quantity' ] + $quantity : $quantity ;
// If its greater than 1, its already in the cart
if ( $in_cart_quantity > 1 ) {
2012-03-23 19:15:31 +00:00
$woocommerce -> add_error ( sprintf ( '<a href="%s" class="button">%s</a> %s' , get_permalink ( woocommerce_get_page_id ( 'cart' )), __ ( 'View Cart →' , 'woocommerce' ), __ ( 'You already have this item in your cart.' , 'woocommerce' ) ) );
2012-02-27 18:22:54 +00:00
return false ;
2012-03-20 13:22:35 +00:00
}
2012-03-28 17:42:35 +00:00
}
// Stock check - this time accounting for whats already in-cart
$product_qty_in_cart = $this -> get_cart_item_quantities ();
if ( $product_data -> managing_stock () ) {
// Variations
if ( $variation_id && $product_data -> variation_has_stock ) {
if ( isset ( $product_qty_in_cart [ $variation_id ] ) && ! $product_data -> has_enough_stock ( $product_qty_in_cart [ $variation_id ] + $quantity ) ) {
$woocommerce -> add_error ( sprintf ( __ ( '<a href="%s" class="button">%s</a> You cannot add that amount to the cart — we have %s in stock and you already have %s in your cart.' , 'woocommerce' ), get_permalink ( woocommerce_get_page_id ( 'cart' )), __ ( 'View Cart →' , 'woocommerce' ), $product_data -> get_stock_quantity (), $product_qty_in_cart [ $variation_id ] ));
return false ;
}
// Products
} else {
if ( isset ( $product_qty_in_cart [ $product_id ] ) && ! $product_data -> has_enough_stock ( $product_qty_in_cart [ $product_id ] + $quantity ) ) {
$woocommerce -> add_error ( sprintf ( __ ( '<a href="%s" class="button">%s</a> You cannot add that amount to the cart — we have %s in stock and you already have %s in your cart.' , 'woocommerce' ), get_permalink ( woocommerce_get_page_id ( 'cart' )), __ ( 'View Cart →' , 'woocommerce' ), $product_data -> get_stock_quantity (), $product_qty_in_cart [ $product_id ] ));
return false ;
}
}
2012-03-20 13:22:35 +00:00
}
2012-03-28 17:42:35 +00:00
// If cart_item_key is set, the item is already in the cart
if ( $cart_item_key ) {
2011-12-08 12:50:50 +00:00
2012-04-10 11:18:41 +00:00
$new_quantity = $quantity + $this -> cart_contents [ $cart_item_key ][ 'quantity' ];
2011-12-08 12:50:50 +00:00
2012-04-10 11:18:41 +00:00
$this -> set_quantity ( $cart_item_key , $new_quantity );
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
} else {
2012-04-03 14:37:04 +00:00
$cart_item_key = $cart_id ;
2011-12-08 12:50:50 +00:00
// Add item after merging with $cart_item_data - hook to allow plugins to modify cart item
2012-04-03 14:37:04 +00:00
$this -> cart_contents [ $cart_item_key ] = apply_filters ( 'woocommerce_add_cart_item' , array_merge ( $cart_item_data , array (
2011-12-08 12:50:50 +00:00
'product_id' => $product_id ,
'variation_id' => $variation_id ,
'variation' => $variation ,
'quantity' => $quantity ,
'data' => $product_data
2012-04-12 15:11:12 +00:00
) ), $cart_item_key );
2011-11-06 13:45:18 +00:00
2012-03-20 13:22:35 +00:00
}
2012-03-01 00:48:32 +00:00
2012-04-10 11:18:41 +00:00
do_action ( 'woocommerce_add_to_cart' , $cart_item_key , $product_id , $quantity , $variation_id , $variation , $cart_item_data );
2012-04-03 14:37:04 +00:00
2012-03-01 00:48:32 +00:00
$woocommerce -> cart_has_contents_cookie ( true );
2011-11-06 13:45:18 +00:00
$this -> set_session ();
2011-12-08 12:50:50 +00:00
2011-11-06 13:45:18 +00:00
return true ;
2011-12-08 12:50:50 +00:00
}
2011-08-09 15:16:18 +00:00
2011-12-08 12:50:50 +00:00
/**
* Set the quantity for an item in the cart
*
* @ param string cart_item_key contains the id of the cart item
* @ param string quantity contains the quantity of the item
*/
function set_quantity ( $cart_item_key , $quantity = 1 ) {
2012-01-02 00:49:00 +00:00
2012-03-20 13:22:35 +00:00
if ( $quantity == 0 || $quantity < 0 ) {
2012-04-23 12:28:47 +00:00
do_action ( 'woocommerce_before_cart_item_quantity_zero' , $cart_item_key );
2012-03-20 13:22:35 +00:00
unset ( $this -> cart_contents [ $cart_item_key ] );
} else {
2011-12-08 12:50:50 +00:00
$this -> cart_contents [ $cart_item_key ][ 'quantity' ] = $quantity ;
2012-04-12 15:11:12 +00:00
do_action ( 'woocommerce_after_cart_item_quantity_update' , $cart_item_key , $quantity );
2012-03-20 13:22:35 +00:00
}
2012-01-02 00:49:00 +00:00
2011-12-08 12:50:50 +00:00
$this -> set_session ();
}
2011-11-23 23:19:23 +00:00
2011-12-08 12:50:50 +00:00
/*-----------------------------------------------------------------------------------*/
/* Cart Calculation Functions */
/*-----------------------------------------------------------------------------------*/
/**
* Reset totals
*/
2012-01-04 23:01:47 +00:00
private function reset () {
2011-12-08 12:50:50 +00:00
$this -> total = 0 ;
$this -> cart_contents_total = 0 ;
$this -> cart_contents_weight = 0 ;
$this -> cart_contents_count = 0 ;
$this -> cart_contents_tax = 0 ;
$this -> tax_total = 0 ;
$this -> shipping_tax_total = 0 ;
2012-01-27 15:00:03 +00:00
$this -> shipping_taxes = array ();
2011-12-08 12:50:50 +00:00
$this -> subtotal = 0 ;
$this -> subtotal_ex_tax = 0 ;
$this -> discount_total = 0 ;
$this -> discount_cart = 0 ;
$this -> shipping_total = 0 ;
2011-12-30 21:11:18 +00:00
$this -> taxes = array ();
2012-03-11 12:49:51 +00:00
unset ( $_SESSION [ 'cart_contents_total' ], $_SESSION [ 'cart_contents_weight' ], $_SESSION [ 'cart_contents_count' ], $_SESSION [ 'cart_contents_tax' ], $_SESSION [ 'total' ], $_SESSION [ 'subtotal' ], $_SESSION [ 'subtotal_ex_tax' ], $_SESSION [ 'tax_total' ], $_SESSION [ 'taxes' ], $_SESSION [ 'shipping_taxes' ], $_SESSION [ 'discount_cart' ], $_SESSION [ 'discount_total' ], $_SESSION [ 'shipping_total' ], $_SESSION [ 'shipping_tax_total' ], $_SESSION [ 'shipping_label' ] );
2011-12-08 12:50:50 +00:00
}
2012-03-20 13:22:35 +00:00
/**
2011-12-08 12:50:50 +00:00
* Function to apply discounts to a product and get the discounted price ( before tax is applied )
2012-03-20 13:22:35 +00:00
*
* @ access public
* @ param mixed $values
* @ param mixed $price
* @ param bool $add_totals ( default : false )
* @ return float price
2011-12-08 12:50:50 +00:00
*/
function get_discounted_price ( $values , $price , $add_totals = false ) {
2012-03-06 17:58:21 +00:00
2012-03-20 13:22:35 +00:00
if ( ! $price ) return $price ;
2012-03-06 17:58:21 +00:00
2012-03-20 13:22:35 +00:00
if ( ! empty ( $this -> applied_coupons ) ) {
foreach ( $this -> applied_coupons as $code ) {
$coupon = new WC_Coupon ( $code );
if ( $coupon -> apply_before_tax () && $coupon -> is_valid () ) {
switch ( $coupon -> type ) {
case " fixed_product " :
case " percent_product " :
$this_item_is_discounted = false ;
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
$product_cats = wp_get_post_terms ( $values [ 'product_id' ], 'product_cat' , array ( " fields " => " ids " ) );
// Specific products get the discount
if ( sizeof ( $coupon -> product_ids ) > 0 ) {
if ( in_array ( $values [ 'product_id' ], $coupon -> product_ids ) || in_array ( $values [ 'variation_id' ], $coupon -> product_ids ) || in_array ( $values [ 'data' ] -> get_parent (), $coupon -> product_ids ) )
$this_item_is_discounted = true ;
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
// Category discounts
} elseif ( sizeof ( $coupon -> product_categories ) > 0 ) {
if ( sizeof ( array_intersect ( $product_cats , $coupon -> product_categories ) ) > 0 )
$this_item_is_discounted = true ;
} else {
// No product ids - all items discounted
2011-12-08 12:50:50 +00:00
$this_item_is_discounted = true ;
2012-03-06 17:27:02 +00:00
2012-03-20 13:22:35 +00:00
}
// Specific product ID's excluded from the discount
if ( sizeof ( $coupon -> exclude_product_ids ) > 0 )
if ( in_array ( $values [ 'product_id' ], $coupon -> exclude_product_ids ) || in_array ( $values [ 'variation_id' ], $coupon -> exclude_product_ids ) || in_array ( $values [ 'data' ] -> get_parent (), $coupon -> exclude_product_ids ) )
$this_item_is_discounted = false ;
2012-03-06 17:27:02 +00:00
2012-03-20 13:22:35 +00:00
// Specific categories excluded from the discount
if ( sizeof ( $coupon -> exclude_product_categories ) > 0 )
if ( sizeof ( array_intersect ( $product_cats , $coupon -> exclude_product_categories ) ) > 0 )
$this_item_is_discounted = false ;
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
// Apply filter
$this_item_is_discounted = apply_filters ( 'woocommerce_item_is_discounted' , $this_item_is_discounted , $values , $before_tax = true );
2011-11-19 20:59:16 +00:00
2012-03-20 13:22:35 +00:00
// Apply the discount
if ( $this_item_is_discounted ) {
if ( $coupon -> type == 'fixed_product' ) {
if ( $price < $coupon -> amount ) {
$discount_amount = $price ;
} else {
$discount_amount = $coupon -> amount ;
}
$price = $price - $coupon -> amount ;
if ( $price < 0 ) $price = 0 ;
if ( $add_totals ) {
$this -> discount_cart = $this -> discount_cart + ( $discount_amount * $values [ 'quantity' ] );
}
} elseif ( $coupon -> type == 'percent_product' ) {
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
$percent_discount = ( $values [ 'data' ] -> get_price_excluding_tax () / 100 ) * $coupon -> amount ;
if ( $add_totals ) $this -> discount_cart = $this -> discount_cart + ( $percent_discount * $values [ 'quantity' ] );
$price = $price - $percent_discount ;
}
}
break ;
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
case " fixed_cart " :
2012-03-06 17:58:21 +00:00
2012-03-20 13:22:35 +00:00
/**
* This is the most complex discount - we need to divide the discount between rows based on their price in
* proportion to the subtotal . This is so rows with different tax rates get a fair discount , and so rows
* with no price ( free ) don ' t get discount too .
*/
// Get item discount by dividing item cost by subtotal to get a %
if ( $this -> subtotal_ex_tax )
$discount_percent = ( $values [ 'data' ] -> get_price_excluding_tax () * $values [ 'quantity' ] ) / $this -> subtotal_ex_tax ;
else
$discount_percent = 0 ;
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
// Use pence to help prevent rounding errors
$coupon_amount_pence = $coupon -> amount * 100 ;
// Work out the discount for the row
$item_discount = $coupon_amount_pence * $discount_percent ;
// Work out discount per item
$item_discount = $item_discount / $values [ 'quantity' ];
// Pence
$price = ( $price * 100 );
// Check if discount is more than price
if ( $price < $item_discount )
$discount_amount = $price ;
else
$discount_amount = $item_discount ;
// Take discount off of price (in pence)
$price = $price - $discount_amount ;
// Back to pounds
$price = $price / 100 ;
// Cannot be below 0
if ( $price < 0 ) $price = 0 ;
// Add coupon to discount total (once, since this is a fixed cart discount and we don't want rounding issues)
if ( $add_totals ) $this -> discount_cart = $this -> discount_cart + ( ( $discount_amount * $values [ 'quantity' ] ) / 100 );
break ;
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
case " percent " :
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
$percent_discount = ( $values [ 'data' ] -> get_price ( ) / 100 ) * $coupon -> amount ;
if ( $add_totals ) $this -> discount_cart = $this -> discount_cart + ( $percent_discount * $values [ 'quantity' ] );
$price = $price - $percent_discount ;
break ;
}
}
}
}
2011-12-08 12:50:50 +00:00
2012-03-06 17:58:21 +00:00
return apply_filters ( 'woocommerce_get_discounted_price' , $price , $values , $this );
2011-12-08 12:50:50 +00:00
}
2012-03-20 13:22:35 +00:00
/**
2011-12-08 12:50:50 +00:00
* Function to apply product discounts after tax
2012-03-20 13:22:35 +00:00
*
* @ access public
* @ param mixed $values
* @ param mixed $price
2011-12-08 12:50:50 +00:00
*/
function apply_product_discounts_after_tax ( $values , $price ) {
2012-03-20 13:22:35 +00:00
if ( ! empty ( $this -> applied_coupons ) ) {
foreach ( $this -> applied_coupons as $code ) {
$coupon = new WC_Coupon ( $code );
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
do_action ( 'woocommerce_product_discount_after_tax_' . $coupon -> type , $coupon );
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
if ( $coupon -> type != 'fixed_product' && $coupon -> type != 'percent_product' ) continue ;
if ( ! $coupon -> apply_before_tax () && $coupon -> is_valid () ) {
2012-03-23 20:46:17 +00:00
$product_cats = wp_get_post_terms ( $values [ 'product_id' ], 'product_cat' , array ( " fields " => " ids " ) );
2012-03-20 13:22:35 +00:00
$this_item_is_discounted = false ;
// Specific products get the discount
if ( sizeof ( $coupon -> product_ids ) > 0 ) {
if ( in_array ( $values [ 'product_id' ], $coupon -> product_ids ) || in_array ( $values [ 'variation_id' ], $coupon -> product_ids ) || in_array ( $values [ 'data' ] -> get_parent (), $coupon -> product_ids ))
$this_item_is_discounted = true ;
2012-03-06 17:27:02 +00:00
2012-03-20 13:22:35 +00:00
// Category discounts
} elseif ( sizeof ( $coupon -> product_categories ) > 0 ) {
if ( sizeof ( array_intersect ( $product_cats , $coupon -> product_categories ) ) > 0 )
$this_item_is_discounted = true ;
} else {
// No product ids - all items discounted
2012-03-06 17:27:02 +00:00
$this_item_is_discounted = true ;
2012-03-20 13:22:35 +00:00
}
// Specific product ID's excluded from the discount
if ( sizeof ( $coupon -> exclude_product_ids ) > 0 )
if ( in_array ( $values [ 'product_id' ], $coupon -> exclude_product_ids ) || in_array ( $values [ 'variation_id' ], $coupon -> exclude_product_ids ) || in_array ( $values [ 'data' ] -> get_parent (), $coupon -> exclude_product_ids ) )
$this_item_is_discounted = false ;
2011-11-19 20:59:16 +00:00
2012-03-20 13:22:35 +00:00
// Specific categories excluded from the discount
if ( sizeof ( $coupon -> exclude_product_categories ) > 0 )
if ( sizeof ( array_intersect ( $product_cats , $coupon -> exclude_product_categories ) ) > 0 )
$this_item_is_discounted = false ;
2011-12-05 15:41:13 +00:00
2012-03-20 13:22:35 +00:00
// Apply filter
$this_item_is_discounted = apply_filters ( 'woocommerce_item_is_discounted' , $this_item_is_discounted , $values , $before_tax = false );
// Apply the discount
if ( $this_item_is_discounted ) {
if ( $coupon -> type == 'fixed_product' ) {
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
if ( $price < $coupon -> amount )
$discount_amount = $price ;
else
$discount_amount = $coupon -> amount ;
$this -> discount_total = $this -> discount_total + ( $discount_amount * $values [ 'quantity' ] );
} elseif ( $coupon -> type == 'percent_product' ) {
2012-05-13 18:17:39 +00:00
$this -> discount_total = $this -> discount_total + round ( ( $price / 100 ) * $coupon -> amount , 2 );
2012-03-20 13:22:35 +00:00
}
}
}
}
}
2012-05-13 18:17:39 +00:00
2011-12-08 12:50:50 +00:00
}
2011-11-19 20:59:16 +00:00
2012-03-20 13:22:35 +00:00
/**
2011-12-08 12:50:50 +00:00
* Function to apply cart discounts after tax
2012-03-20 13:22:35 +00:00
*
* @ access public
2011-12-08 12:50:50 +00:00
*/
function apply_cart_discounts_after_tax () {
2011-11-19 20:59:16 +00:00
2012-03-20 13:22:35 +00:00
if ( $this -> applied_coupons ) {
foreach ( $this -> applied_coupons as $code ) {
$coupon = new WC_Coupon ( $code );
2011-11-20 00:55:23 +00:00
2012-03-20 13:22:35 +00:00
do_action ( 'woocommerce_cart_discount_after_tax_' . $coupon -> type , $coupon );
2011-11-23 23:19:23 +00:00
2012-03-20 13:22:35 +00:00
if ( ! $coupon -> apply_before_tax () && $coupon -> is_valid () ) {
2011-11-23 23:19:23 +00:00
2012-03-20 13:22:35 +00:00
switch ( $coupon -> type ) {
case " fixed_cart " :
$this -> discount_total = $this -> discount_total + $coupon -> amount ;
break ;
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
case " percent " :
$percent_discount = ( round ( $this -> cart_contents_total + $this -> tax_total , 2 ) / 100 ) * $coupon -> amount ;
2012-05-13 18:17:39 +00:00
$this -> discount_total = $this -> discount_total + round ( $percent_discount , 2 );
2012-03-20 13:22:35 +00:00
break ;
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
}
}
}
}
2011-12-08 12:50:50 +00:00
}
2011-11-02 20:32:35 +00:00
2012-03-20 13:22:35 +00:00
/**
2011-12-08 12:50:50 +00:00
* calculate totals for the items in the cart
2012-03-20 13:22:35 +00:00
*
* @ access public
2011-12-08 12:50:50 +00:00
*/
function calculate_totals () {
global $woocommerce ;
2011-11-19 20:59:16 +00:00
2012-01-04 23:01:47 +00:00
$this -> reset ();
2012-03-12 13:11:08 +00:00
2011-12-14 19:02:41 +00:00
do_action ( 'woocommerce_before_calculate_totals' , $this );
2012-03-12 13:11:08 +00:00
2011-12-08 12:50:50 +00:00
// Get count of all items + weights + subtotal (we may need this for discounts)
2012-03-20 13:22:35 +00:00
if ( sizeof ( $this -> cart_contents ) > 0 ) {
foreach ( $this -> cart_contents as $cart_item_key => $values ) {
$_product = $values [ 'data' ];
$this -> cart_contents_weight = $this -> cart_contents_weight + ( $_product -> get_weight () * $values [ 'quantity' ]);
$this -> cart_contents_count = $this -> cart_contents_count + $values [ 'quantity' ];
// Base Price (inlusive of tax for now)
$row_base_price = $_product -> get_price () * $values [ 'quantity' ];
$base_tax_rates = $this -> tax -> get_shop_base_rate ( $_product -> tax_class );
$tax_amount = 0 ;
2011-10-28 15:04:39 +00:00
2012-03-20 13:22:35 +00:00
if ( $this -> prices_include_tax ) {
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
if ( $_product -> is_taxable () ) {
$tax_rates = $this -> tax -> get_rates ( $_product -> get_tax_class () );
// ADJUST BASE if tax rate is different (different region or modified tax class)
if ( $tax_rates !== $base_tax_rates ) {
2012-05-23 11:30:26 +00:00
2012-06-05 11:21:52 +00:00
$base_taxes = $this -> tax -> calc_tax ( $row_base_price , $base_tax_rates , true , true );
2012-03-20 13:22:35 +00:00
$modded_taxes = $this -> tax -> calc_tax ( $row_base_price - array_sum ( $base_taxes ), $tax_rates , false );
$row_base_price = ( $row_base_price - array_sum ( $base_taxes ) ) + array_sum ( $modded_taxes );
}
$taxes = $this -> tax -> calc_tax ( $row_base_price , $tax_rates , true );
$tax_amount = $this -> tax -> get_tax_total ( $taxes );
}
// Sub total is based on base prices (without discounts)
$this -> subtotal = $this -> subtotal + $row_base_price ;
2011-11-19 20:59:16 +00:00
2012-03-20 13:22:35 +00:00
$this -> subtotal_ex_tax = $this -> subtotal_ex_tax + ( $row_base_price - $tax_amount );
} else {
2011-11-19 20:59:16 +00:00
2012-03-20 13:22:35 +00:00
if ( $_product -> is_taxable () ) {
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
$tax_rates = $this -> tax -> get_rates ( $_product -> get_tax_class () );
$taxes = $this -> tax -> calc_tax ( $row_base_price , $tax_rates , false );
$tax_amount = $this -> tax -> get_tax_total ( $taxes );
}
2011-11-26 16:15:25 +00:00
2012-03-20 13:22:35 +00:00
// Sub total is based on base prices (without discounts)
$this -> subtotal = $this -> subtotal + $row_base_price + $tax_amount ;
$this -> subtotal_ex_tax = $this -> subtotal_ex_tax + $row_base_price ;
2011-11-26 16:15:25 +00:00
2012-03-20 13:22:35 +00:00
}
}
}
2011-11-23 23:19:23 +00:00
2011-12-08 12:50:50 +00:00
// Now calc the main totals, including discounts
2012-03-20 13:22:35 +00:00
if ( $this -> prices_include_tax ) {
2011-11-23 23:19:23 +00:00
2011-11-21 11:33:46 +00:00
/**
2011-12-08 12:50:50 +00:00
* Calculate totals for items
2011-11-21 11:33:46 +00:00
*/
2012-03-20 13:22:35 +00:00
if ( sizeof ( $this -> cart_contents ) > 0 ) {
foreach ( $this -> cart_contents as $cart_item_key => $values ) {
2011-11-21 11:33:46 +00:00
2012-03-20 13:22:35 +00:00
/**
* Prices include tax
*
* To prevent rounding issues we need to work with the inclusive price where possible
* otherwise we ' ll see errors such as when working with a 9.99 inc price , 20 % VAT which would
* be 8.325 leading to totals being 1 p off
*
* Pre tax coupons come off the price the customer thinks they are paying - tax is calculated
* afterwards .
*
* e . g . $ 100 bike with $ 10 coupon = customer pays $ 90 and tax worked backwards from that
*
* Used this excellent article for reference :
* http :// developer . practicalecommerce . com / articles / 1473 - Coding - for - Tax - Calculations - Everything - You - Never - Wanted - to - Know - Part - 2
2011-12-08 12:50:50 +00:00
*/
2012-03-20 13:22:35 +00:00
$_product = $values [ 'data' ];
2012-01-22 02:36:26 +00:00
2012-03-20 13:22:35 +00:00
// Base Price (inlusive of tax for now)
$base_price = $_product -> get_price ();
// Base Price Adjustment
if ( $_product -> is_taxable () ) {
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
// Get rates
2012-06-05 11:21:52 +00:00
$tax_rates = $this -> tax -> get_rates ( $_product -> get_tax_class () );
2012-03-20 13:22:35 +00:00
/**
2012-06-05 11:21:52 +00:00
* ADJUST TAX - Calculations when customer is OUTSIDE the shop base country / state and prices INCLUDE tax
2012-03-20 13:22:35 +00:00
* OR
2012-06-05 11:21:52 +00:00
* ADJUST TAX - Calculations when a tax class is modified
2012-03-20 13:22:35 +00:00
*/
2012-05-09 17:29:22 +00:00
if ( ( $woocommerce -> customer -> is_customer_outside_base () && ( defined ( 'WOOCOMMERCE_CHECKOUT' ) || $woocommerce -> customer -> has_calculated_shipping () ) ) || ( $_product -> get_tax_class () !== $_product -> tax_class ) ) {
2012-03-20 13:22:35 +00:00
// Get tax rate for the store base, ensuring we use the unmodified tax_class for the product
$base_tax_rates = $this -> tax -> get_shop_base_rate ( $_product -> tax_class );
// Work out new price based on region
$row_base_price = $base_price * $values [ 'quantity' ];
2012-06-05 11:21:52 +00:00
$base_taxes = $this -> tax -> calc_tax ( $row_base_price , $base_tax_rates , true , true ); // Unrounded
2012-03-20 13:22:35 +00:00
$taxes = $this -> tax -> calc_tax ( $row_base_price - array_sum ( $base_taxes ), $tax_rates , false );
// Tax amount
$tax_amount = array_sum ( $taxes );
// Line subtotal + tax
$line_subtotal_tax = ( get_option ( 'woocommerce_tax_round_at_subtotal' ) == 'no' ) ? round ( $tax_amount , 2 ) : $tax_amount ;
$line_subtotal = $row_base_price - $this -> tax -> get_tax_total ( $base_taxes );
// Adjusted price
$adjusted_price = ( $row_base_price - array_sum ( $base_taxes ) + array_sum ( $taxes ) ) / $values [ 'quantity' ];
// Apply discounts
$discounted_price = $this -> get_discounted_price ( $values , $adjusted_price , true );
$discounted_taxes = $this -> tax -> calc_tax ( $discounted_price * $values [ 'quantity' ], $tax_rates , true );
$discounted_tax_amount = array_sum ( $discounted_taxes ); // Sum taxes
/**
* Regular tax calculation ( customer inside base and the tax class is unmodified
*/
} else {
// Base tax for line before discount - we will store this in the order data
$tax_amount = array_sum ( $this -> tax -> calc_tax ( $base_price * $values [ 'quantity' ], $tax_rates , true ) );
// Line subtotal + tax
$line_subtotal_tax = ( get_option ( 'woocommerce_tax_round_at_subtotal' ) == 'no' ) ? round ( $tax_amount , 2 ) : $tax_amount ;
$line_subtotal = ( $base_price * $values [ 'quantity' ] ) - round ( $line_subtotal_tax , 2 );
// Calc prices and tax (discounted)
$discounted_price = $this -> get_discounted_price ( $values , $base_price , true );
$discounted_taxes = $this -> tax -> calc_tax ( $discounted_price * $values [ 'quantity' ], $tax_rates , true );
$discounted_tax_amount = array_sum ( $discounted_taxes ); // Sum taxes
}
2012-01-22 02:36:26 +00:00
2012-03-20 13:22:35 +00:00
// Tax rows - merge the totals we just got
foreach ( array_keys ( $this -> taxes + $discounted_taxes ) as $key ) {
$this -> taxes [ $key ] = ( isset ( $discounted_taxes [ $key ] ) ? $discounted_taxes [ $key ] : 0 ) + ( isset ( $this -> taxes [ $key ] ) ? $this -> taxes [ $key ] : 0 );
}
2012-01-04 23:01:47 +00:00
2012-03-20 13:22:35 +00:00
} else {
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
// Discounted Price (price with any pre-tax discounts applied)
$discounted_price = $this -> get_discounted_price ( $values , $base_price , true );
$discounted_tax_amount = 0 ;
$tax_amount = 0 ;
$line_subtotal_tax = 0 ;
$line_subtotal = ( $base_price * $values [ 'quantity' ] );
2011-12-28 23:59:33 +00:00
2012-03-20 13:22:35 +00:00
}
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
// Line prices
$line_tax = ( get_option ( 'woocommerce_tax_round_at_subtotal' ) == 'no' ) ? round ( $discounted_tax_amount , 2 ) : $discounted_tax_amount ;
2012-06-05 11:21:52 +00:00
$line_total = round ( ( $discounted_price * $values [ 'quantity' ] ) - round ( $line_tax , 2 ), 2 );
2012-03-20 13:22:35 +00:00
// Add any product discounts (after tax)
$this -> apply_product_discounts_after_tax ( $values , $line_total + $discounted_tax_amount );
// Cart contents total is based on discounted prices and is used for the final total calculation
$this -> cart_contents_total = $this -> cart_contents_total + $line_total ;
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
// Store costs + taxes for lines
$this -> cart_contents [ $cart_item_key ][ 'line_total' ] = $line_total ;
$this -> cart_contents [ $cart_item_key ][ 'line_tax' ] = $line_tax ;
$this -> cart_contents [ $cart_item_key ][ 'line_subtotal' ] = $line_subtotal ;
$this -> cart_contents [ $cart_item_key ][ 'line_subtotal_tax' ] = $line_subtotal_tax ;
}
}
2011-11-19 20:59:16 +00:00
2012-03-20 13:22:35 +00:00
} else {
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
if ( sizeof ( $this -> cart_contents ) > 0 ) {
foreach ( $this -> cart_contents as $cart_item_key => $values ) {
2011-12-29 01:18:59 +00:00
2012-03-20 13:22:35 +00:00
/**
* Prices exclude tax
*
* This calculation is simpler - work with the base , untaxed price .
*/
$_product = $values [ 'data' ];
// Base Price (i.e. no tax, regardless of region)
$base_price = $_product -> get_price ();
2012-01-04 23:01:47 +00:00
2012-03-20 13:22:35 +00:00
// Discounted Price (base price with any pre-tax discounts applied
$discounted_price = $this -> get_discounted_price ( $values , $base_price , true );
// Tax Amount (For the line, based on discounted, ex.tax price)
if ( $_product -> is_taxable () ) {
2012-01-04 23:01:47 +00:00
2012-03-20 13:22:35 +00:00
// Get tax rates
$tax_rates = $this -> tax -> get_rates ( $_product -> get_tax_class () );
// Base tax for line before discount - we will store this in the order data
$tax_amount = array_sum ( $this -> tax -> calc_tax ( $base_price * $values [ 'quantity' ], $tax_rates , false ) );
// Now calc product rates
$discounted_taxes = $this -> tax -> calc_tax ( $discounted_price * $values [ 'quantity' ], $tax_rates , false );
$discounted_tax_amount = array_sum ( $discounted_taxes );
// Tax rows - merge the totals we just got
foreach ( array_keys ( $this -> taxes + $discounted_taxes ) as $key ) {
$this -> taxes [ $key ] = ( isset ( $discounted_taxes [ $key ] ) ? $discounted_taxes [ $key ] : 0 ) + ( isset ( $this -> taxes [ $key ] ) ? $this -> taxes [ $key ] : 0 );
}
} else {
$discounted_tax_amount = 0 ;
$tax_amount = 0 ;
2011-12-30 21:11:18 +00:00
}
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
// Line prices
$line_subtotal_tax = $tax_amount ;
$line_tax = $discounted_tax_amount ;
$line_subtotal = $base_price * $values [ 'quantity' ];
$line_total = $discounted_price * $values [ 'quantity' ];
// Add any product discounts (after tax)
$this -> apply_product_discounts_after_tax ( $values , $line_total + $line_tax );
// Cart contents total is based on discounted prices and is used for the final total calculation
$this -> cart_contents_total = $this -> cart_contents_total + $line_total ;
// Store costs + taxes for lines
$this -> cart_contents [ $cart_item_key ][ 'line_total' ] = $line_total ;
$this -> cart_contents [ $cart_item_key ][ 'line_tax' ] = $line_tax ;
$this -> cart_contents [ $cart_item_key ][ 'line_subtotal' ] = $line_subtotal ;
$this -> cart_contents [ $cart_item_key ][ 'line_subtotal_tax' ] = $line_subtotal_tax ;
2012-01-04 23:01:47 +00:00
2012-03-20 13:22:35 +00:00
}
}
2011-11-19 20:59:16 +00:00
2012-03-20 13:22:35 +00:00
}
2011-11-19 20:59:16 +00:00
2012-01-02 00:49:00 +00:00
// Set tax total to sum of all tax rows
2012-03-20 13:22:35 +00:00
$this -> tax_total = $this -> tax -> get_tax_total ( $this -> taxes );
2011-09-14 14:55:03 +00:00
2012-01-09 18:00:52 +00:00
// VAT exemption done at this point - so all totals are correct before exemption
2012-03-20 13:22:35 +00:00
if ( $woocommerce -> customer -> is_vat_exempt () || ( is_cart () && get_option ( 'woocommerce_display_cart_taxes' ) == 'no' ) ) {
2012-01-09 18:00:52 +00:00
$this -> shipping_tax_total = $this -> tax_total = 0 ;
2012-01-27 15:00:03 +00:00
$this -> taxes = $this -> shipping_taxes = array ();
2012-03-20 13:22:35 +00:00
}
2012-01-09 18:00:52 +00:00
2011-12-08 12:50:50 +00:00
// Cart Discounts (after tax)
$this -> apply_cart_discounts_after_tax ();
// Only go beyond this point if on the cart/checkout
2012-03-20 13:22:35 +00:00
if ( ! is_checkout () && ! is_cart () && ! defined ( 'WOOCOMMERCE_CHECKOUT' ) && ! defined ( 'WOOCOMMERCE_CART' ) ) return ;
2011-12-08 12:50:50 +00:00
// Cart Shipping
$this -> calculate_shipping ();
2012-01-27 15:00:03 +00:00
// VAT exemption for shipping
2012-03-20 13:22:35 +00:00
if ( $woocommerce -> customer -> is_vat_exempt () ) {
2012-01-27 15:00:03 +00:00
$this -> shipping_tax_total = 0 ;
$this -> shipping_taxes = array ();
2012-03-20 13:22:35 +00:00
}
2012-01-27 15:00:03 +00:00
// Round cart/shipping tax rows
2012-03-20 13:22:35 +00:00
$this -> taxes = array_map ( array ( & $this -> tax , 'round' ), $this -> taxes );
$this -> shipping_taxes = array_map ( array ( & $this -> tax , 'round' ), $this -> shipping_taxes );
2011-12-08 12:50:50 +00:00
// Allow plugins to hook and alter totals before final total is calculated
2012-03-20 13:22:35 +00:00
do_action ( 'woocommerce_calculate_totals' , $this );
2012-05-23 05:24:04 +00:00
2011-12-08 12:50:50 +00:00
/**
* Grand Total
*
* Based on discounted product prices , discounted tax , shipping cost + tax , and any discounts to be added after tax ( e . g . store credit )
*/
2012-03-20 13:22:35 +00:00
$this -> total = apply_filters ( 'woocommerce_calculated_total' , number_format ( $this -> cart_contents_total + $this -> tax_total + $this -> shipping_tax_total + $this -> shipping_total - $this -> discount_total , 2 , '.' , '' ), $this );
2011-12-08 12:50:50 +00:00
if ( $this -> total < 0 ) $this -> total = 0 ;
}
2011-11-19 20:59:16 +00:00
/**
2011-12-08 12:50:50 +00:00
* looks at the totals to see if payment is actually required
2012-03-20 13:22:35 +00:00
*
* @ return bool
2011-11-19 20:59:16 +00:00
*/
2011-12-08 12:50:50 +00:00
function needs_payment () {
if ( $this -> total > 0 ) return true ; else return false ;
}
2011-11-06 13:45:18 +00:00
2011-12-08 12:50:50 +00:00
/*-----------------------------------------------------------------------------------*/
/* Shipping related functions */
/*-----------------------------------------------------------------------------------*/
2012-04-13 11:16:24 +00:00
/**
* calculate_shipping function .
*
* Uses the shipping class to calculate shipping then gets the totals when its finished .
*
* @ access public
* @ return void
2011-12-08 12:50:50 +00:00
*/
function calculate_shipping () {
global $woocommerce ;
2012-04-11 12:08:04 +00:00
if ( $this -> needs_shipping () && $this -> show_shipping () ) {
2012-04-13 11:16:24 +00:00
$woocommerce -> shipping -> calculate_shipping ( $this -> get_shipping_packages () );
2012-03-20 13:22:35 +00:00
} else {
2011-12-08 12:50:50 +00:00
$woocommerce -> shipping -> reset_shipping ();
2012-03-20 13:22:35 +00:00
}
2011-12-08 12:50:50 +00:00
2012-04-13 11:16:24 +00:00
// Get totals for the chosen shipping method
2011-12-08 12:50:50 +00:00
$this -> shipping_total = $woocommerce -> shipping -> shipping_total ; // Shipping Total
$this -> shipping_label = $woocommerce -> shipping -> shipping_label ; // Shipping Label
2012-01-27 15:00:03 +00:00
$this -> shipping_taxes = $woocommerce -> shipping -> shipping_taxes ; // Shipping Taxes
$this -> shipping_tax_total = $this -> tax -> get_tax_total ( $this -> shipping_taxes ); // Shipping tax amount
2011-12-08 12:50:50 +00:00
}
2011-11-06 13:45:18 +00:00
2012-04-13 11:16:24 +00:00
/**
* get_shipping_packages function .
*
* Get packages to calculate shipping for - this lets us calculate costs
* for carts that are shipped to multiple locations .
*
* Shipping methods are responsble for looping through these packages .
*
* By default we pass the cart itself as a package - plugins can change this
* through the filter and break it up .
*
* @ since 1.5 . 4
* @ access public
* @ return array of cart items
*/
function get_shipping_packages () {
global $woocommerce ;
// Packages array for storing 'carts'
$packages = array ();
$packages [ 0 ][ 'contents' ] = $this -> get_cart (); // Items in the package
$packages [ 0 ][ 'contents_cost' ] = 0 ; // Cost of items in the package
2012-05-01 19:24:22 +00:00
$packages [ 0 ][ 'applied_coupons' ] = $this -> applied_coupons ; // Applied coupons - some, like free shipping, affect costs
2012-04-13 11:16:24 +00:00
$packages [ 0 ][ 'destination' ][ 'country' ] = $woocommerce -> customer -> get_shipping_country ();
$packages [ 0 ][ 'destination' ][ 'state' ] = $woocommerce -> customer -> get_shipping_state ();
$packages [ 0 ][ 'destination' ][ 'postcode' ] = $woocommerce -> customer -> get_shipping_postcode ();
foreach ( $this -> get_cart () as $item )
if ( $item [ 'data' ] -> needs_shipping () )
$packages [ 0 ][ 'contents_cost' ] += $item [ 'line_total' ];
return apply_filters ( 'woocommerce_cart_shipping_packages' , $packages );
}
2011-12-08 12:50:50 +00:00
/**
* looks through the cart to see if shipping is actually required
2012-03-20 13:22:35 +00:00
*
* @ return bool whether or not the cart needs shipping
2011-12-08 12:50:50 +00:00
*/
function needs_shipping () {
2012-03-20 13:22:35 +00:00
if ( get_option ( 'woocommerce_calc_shipping' ) == 'no' ) return false ;
if ( ! is_array ( $this -> cart_contents ) ) return false ;
2011-11-06 13:45:18 +00:00
2011-12-08 12:50:50 +00:00
$needs_shipping = false ;
2012-03-20 13:22:35 +00:00
foreach ( $this -> cart_contents as $cart_item_key => $values ) {
2011-12-08 12:50:50 +00:00
$_product = $values [ 'data' ];
2012-03-20 13:22:35 +00:00
if ( $_product -> needs_shipping () ) {
2011-12-08 12:50:50 +00:00
$needs_shipping = true ;
2012-03-20 13:22:35 +00:00
}
}
2011-12-08 12:50:50 +00:00
2012-02-14 09:11:19 +00:00
return apply_filters ( 'woocomerce_cart_needs_shipping' , $needs_shipping );
2011-12-08 12:50:50 +00:00
}
2011-11-06 13:45:18 +00:00
2012-04-11 12:08:04 +00:00
/**
* show_shipping
*
* Sees if the customer has entered enough data to calc the shipping yet
*
* @ return bool
*/
function show_shipping () {
global $woocommerce ;
if ( get_option ( 'woocommerce_calc_shipping' ) == 'no' ) return false ;
if ( ! is_array ( $this -> cart_contents ) ) return false ;
if ( get_option ( 'woocommerce_shipping_cost_requires_address' ) == 'yes' ) {
2012-05-09 17:29:22 +00:00
if ( ! $woocommerce -> customer -> has_calculated_shipping () ) {
2012-04-11 12:08:04 +00:00
if ( ! $woocommerce -> customer -> get_shipping_country () || ! $woocommerce -> customer -> get_shipping_state () ) return false ;
}
}
$show_shipping = true ;
return apply_filters ( 'woocomerce_cart_ready_to_calc_shipping' , $show_shipping );
}
2011-12-08 12:50:50 +00:00
/**
* Sees if we need a shipping address
2012-03-20 13:22:35 +00:00
*
* @ return bool
2011-12-08 12:50:50 +00:00
*/
function ship_to_billing_address_only () {
2012-03-20 13:22:35 +00:00
if ( get_option ( 'woocommerce_ship_to_billing_address_only' ) == 'yes' ) return true ; else return false ;
2011-12-08 12:50:50 +00:00
}
2011-11-19 20:59:16 +00:00
2011-12-08 12:50:50 +00:00
/**
* gets the shipping total ( after calculation )
2012-03-20 13:22:35 +00:00
*
* @ return mixed price or string for the shipping total
2011-12-08 12:50:50 +00:00
*/
function get_cart_shipping_total () {
global $woocommerce ;
2012-03-20 13:22:35 +00:00
if ( isset ( $this -> shipping_label ) ) {
if ( $this -> shipping_total > 0 ) {
2011-12-08 12:50:50 +00:00
// Display ex tax if the option is set, or prices exclude tax
2012-03-20 13:22:35 +00:00
if ( $this -> display_totals_ex_tax || ! $this -> prices_include_tax ) {
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
$return = woocommerce_price ( $this -> shipping_total );
if ( $this -> shipping_tax_total > 0 && $this -> prices_include_tax ) {
$return .= ' <small>' . $woocommerce -> countries -> ex_tax_or_vat () . '</small>' ;
}
2011-12-08 12:50:50 +00:00
return $return ;
2012-03-20 13:22:35 +00:00
} else {
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
$return = woocommerce_price ( $this -> shipping_total + $this -> shipping_tax_total );
if ( $this -> shipping_tax_total > 0 && ! $this -> prices_include_tax ) {
$return .= ' <small>' . $woocommerce -> countries -> inc_tax_or_vat () . '</small>' ;
}
2011-12-08 12:50:50 +00:00
return $return ;
2012-03-20 13:22:35 +00:00
}
2011-11-06 13:45:18 +00:00
2012-03-20 13:22:35 +00:00
} else {
2012-01-05 11:31:22 +00:00
return __ ( 'Free!' , 'woocommerce' );
2012-03-20 13:22:35 +00:00
}
}
2011-12-08 12:50:50 +00:00
}
2011-11-06 13:45:18 +00:00
2011-12-08 12:50:50 +00:00
/**
* gets title of the chosen shipping method
2012-03-20 13:22:35 +00:00
*
* @ return string shipping method title
2011-12-08 12:50:50 +00:00
*/
function get_cart_shipping_title () {
2012-03-20 13:22:35 +00:00
if ( isset ( $this -> shipping_label ) ) {
2012-01-05 11:31:22 +00:00
return __ ( 'via' , 'woocommerce' ) . ' ' . $this -> shipping_label ;
2012-03-20 13:22:35 +00:00
}
2011-12-08 12:50:50 +00:00
return false ;
}
/*-----------------------------------------------------------------------------------*/
/* Coupons/Discount related functions */
/*-----------------------------------------------------------------------------------*/
/**
2012-03-20 13:22:35 +00:00
* returns whether or not a discount has been applied
*
* @ return bool
2011-12-08 12:50:50 +00:00
*/
function has_discount ( $code ) {
2012-03-20 13:22:35 +00:00
if ( in_array ( $code , $this -> applied_coupons ) ) return true ;
2011-12-08 12:50:50 +00:00
return false ;
}
/**
* Applies a coupon code
*
2012-03-20 13:22:35 +00:00
* @ param string $coupon_code - The code to apply
* @ return bool True if the coupon is applied , false if it does not exist or cannot be applied
2011-12-08 12:50:50 +00:00
*/
function add_discount ( $coupon_code ) {
global $woocommerce ;
2012-03-12 09:25:06 +00:00
// Coupons are globally disabled
2012-03-20 13:22:35 +00:00
if ( get_option ( 'woocommerce_enable_coupons' ) == 'no' ) return false ;
2012-03-12 09:25:06 +00:00
2012-01-27 16:38:39 +00:00
$the_coupon = new WC_Coupon ( $coupon_code );
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
if ( $the_coupon -> id ) {
2011-11-06 13:45:18 +00:00
2011-12-08 12:50:50 +00:00
// Check it can be used with cart
2012-06-10 18:07:19 +00:00
$return = $the_coupon -> is_valid ();
if ( ! $return || is_wp_error ( $return ) ) {
$woocommerce -> add_error ( is_wp_error ( $return ) ? $return -> get_error_message () : __ ( 'Invalid coupon.' , 'woocommerce' ) );
2011-12-08 12:50:50 +00:00
return false ;
2012-03-20 13:22:35 +00:00
}
2011-11-06 13:45:18 +00:00
2012-03-06 17:27:02 +00:00
// Check if applied
2012-03-20 13:22:35 +00:00
if ( $woocommerce -> cart -> has_discount ( $coupon_code ) ) {
2012-03-06 17:27:02 +00:00
$woocommerce -> add_error ( __ ( 'Discount code already applied!' , 'woocommerce' ) );
return false ;
2012-03-20 13:22:35 +00:00
}
2012-03-06 17:27:02 +00:00
2011-12-08 12:50:50 +00:00
// If its individual use then remove other coupons
2012-03-20 13:22:35 +00:00
if ( $the_coupon -> individual_use == 'yes' ) {
2011-12-08 12:50:50 +00:00
$this -> applied_coupons = array ();
2012-03-20 13:22:35 +00:00
}
2011-11-06 13:45:18 +00:00
2012-03-20 13:22:35 +00:00
foreach ( $this -> applied_coupons as $code ) {
2012-01-27 16:38:39 +00:00
$coupon = new WC_Coupon ( $code );
2012-03-20 13:22:35 +00:00
if ( $coupon -> individual_use == 'yes' ) {
2011-12-08 12:50:50 +00:00
$this -> applied_coupons = array ();
2012-03-20 13:22:35 +00:00
}
}
2011-12-08 12:50:50 +00:00
$this -> applied_coupons [] = $coupon_code ;
2012-03-12 13:11:08 +00:00
2011-12-08 12:50:50 +00:00
$this -> set_session ();
2012-03-12 13:11:08 +00:00
2012-01-05 11:31:22 +00:00
$woocommerce -> add_message ( __ ( 'Discount code applied successfully.' , 'woocommerce' ) );
2011-12-08 12:50:50 +00:00
return true ;
2011-11-06 13:45:18 +00:00
2012-03-20 13:22:35 +00:00
} else {
2012-01-05 11:31:22 +00:00
$woocommerce -> add_error ( __ ( 'Coupon does not exist!' , 'woocommerce' ) );
2011-12-08 12:50:50 +00:00
return false ;
2012-03-20 13:22:35 +00:00
}
2011-12-08 12:50:50 +00:00
return false ;
}
/**
* gets the array of applied coupon codes
2012-03-20 13:22:35 +00:00
*
* @ return array of applied coupons
2011-12-08 12:50:50 +00:00
*/
function get_applied_coupons () {
return ( array ) $this -> applied_coupons ;
}
2011-11-06 13:45:18 +00:00
2011-12-08 12:50:50 +00:00
/**
2012-03-20 13:22:35 +00:00
* Remove coupons from the cart
*
* @ params int type - 0 for all , 1 for before tax , 2 for after tax
2011-12-08 12:50:50 +00:00
*/
function remove_coupons ( $type = 0 ) {
2011-11-06 13:45:18 +00:00
2012-03-20 13:22:35 +00:00
if ( $type == 1 ) {
if ( $this -> applied_coupons ) {
foreach ( $this -> applied_coupons as $index => $code ) {
$coupon = new WC_Coupon ( $code );
if ( $coupon -> apply_before_tax () ) unset ( $this -> applied_coupons [ $index ]);
}
}
2011-12-08 12:50:50 +00:00
$_SESSION [ 'coupons' ] = $this -> applied_coupons ;
2012-03-20 13:22:35 +00:00
} elseif ( $type == 2 ) {
if ( $this -> applied_coupons ) {
foreach ( $this -> applied_coupons as $index => $code ) {
$coupon = new WC_Coupon ( $code );
if ( ! $coupon -> apply_before_tax () ) unset ( $this -> applied_coupons [ $index ]);
}
}
2011-12-08 12:50:50 +00:00
$_SESSION [ 'coupons' ] = $this -> applied_coupons ;
2012-03-20 13:22:35 +00:00
} else {
2011-12-08 12:50:50 +00:00
unset ( $_SESSION [ 'coupons' ]);
$this -> applied_coupons = array ();
2012-03-20 13:22:35 +00:00
}
2011-12-08 12:50:50 +00:00
}
/*-----------------------------------------------------------------------------------*/
/* Get Formatted Totals */
/*-----------------------------------------------------------------------------------*/
/**
* Get the total of all order discounts ( after tax discounts )
2012-03-20 13:22:35 +00:00
*
* @ return float
2011-12-08 12:50:50 +00:00
*/
function get_order_discount_total () {
return $this -> discount_total ;
}
2011-11-06 13:45:18 +00:00
2011-12-08 12:50:50 +00:00
/**
* Get the total of all cart discounts ( before tax discounts )
2012-03-20 13:22:35 +00:00
*
* @ return float
2011-12-08 12:50:50 +00:00
*/
function get_cart_discount_total () {
return $this -> discount_cart ;
}
/**
* gets the total ( after calculation )
2012-03-20 13:22:35 +00:00
*
* @ return string formatted price
2011-12-08 12:50:50 +00:00
*/
function get_total () {
2012-05-23 11:30:26 +00:00
return apply_filters ( 'woocommerce_cart_total' , woocommerce_price ( $this -> total ) );
2011-12-08 12:50:50 +00:00
}
2012-01-09 18:00:52 +00:00
/**
* gets the total excluding taxes
2012-03-20 13:22:35 +00:00
*
* @ return string formatted price
2012-01-09 18:00:52 +00:00
*/
function get_total_ex_tax () {
2012-01-09 18:08:56 +00:00
$total = $this -> total - $this -> tax_total - $this -> shipping_tax_total ;
2012-03-20 13:22:35 +00:00
if ( $total < 0 ) $total = 0 ;
2012-05-23 11:30:26 +00:00
return apply_filters ( 'woocommerce_cart_total_ex_tax' , woocommerce_price ( $total ) );
2012-01-09 18:00:52 +00:00
}
2011-12-08 12:50:50 +00:00
/**
* gets the cart contents total ( after calculation )
2012-03-20 13:22:35 +00:00
*
* @ return string formatted price
2011-12-08 12:50:50 +00:00
*/
function get_cart_total () {
2012-03-20 13:22:35 +00:00
if ( ! $this -> prices_include_tax ) {
2012-05-24 05:58:19 +00:00
$cart_contents_total = woocommerce_price ( $this -> cart_contents_total );
2012-03-20 13:22:35 +00:00
} else {
2012-05-24 05:58:19 +00:00
$cart_contents_total = woocommerce_price ( $this -> cart_contents_total + $this -> tax_total );
2012-03-20 13:22:35 +00:00
}
2012-05-24 05:58:19 +00:00
return apply_filters ( 'woocommerce_cart_contents_total' , $cart_contents_total );
2011-12-08 12:50:50 +00:00
}
/**
* gets the sub total ( after calculation )
2012-03-20 13:22:35 +00:00
*
* @ params bool whether to include compound taxes
* @ return string formatted price
2011-12-08 12:50:50 +00:00
*/
2011-12-30 19:36:44 +00:00
function get_cart_subtotal ( $compound = false ) {
2011-12-08 12:50:50 +00:00
global $woocommerce ;
2011-11-06 13:45:18 +00:00
2011-12-29 01:18:59 +00:00
// If the cart has compound tax, we want to show the subtotal as
// cart + shipping + non-compound taxes (after discount)
2012-03-20 13:22:35 +00:00
if ( $compound ) {
2011-11-06 13:45:18 +00:00
2012-05-23 02:03:41 +00:00
$cart_subtotal = woocommerce_price ( $this -> cart_contents_total + $this -> shipping_total + $this -> get_taxes_total ( false ) );
2011-12-29 01:18:59 +00:00
// Otherwise we show cart items totals only (before discount)
2012-03-20 13:22:35 +00:00
} else {
2011-12-29 01:18:59 +00:00
// Display ex tax if the option is set, or prices exclude tax
2012-06-10 14:48:52 +00:00
if ( $this -> display_totals_ex_tax || ! $this -> prices_include_tax || $woocommerce -> customer -> is_vat_exempt () ) {
2012-05-23 02:03:41 +00:00
$cart_subtotal = woocommerce_price ( $this -> subtotal_ex_tax );
2011-12-29 01:18:59 +00:00
2012-06-10 14:48:52 +00:00
if ( $this -> tax_total > 0 && $this -> prices_include_tax ) {
2012-05-23 02:03:41 +00:00
$cart_subtotal .= ' <small>' . $woocommerce -> countries -> ex_tax_or_vat () . '</small>' ;
2012-03-20 13:22:35 +00:00
}
2011-12-29 01:18:59 +00:00
2012-03-20 13:22:35 +00:00
} else {
2011-12-29 01:18:59 +00:00
2012-05-23 02:03:41 +00:00
$cart_subtotal = woocommerce_price ( $this -> subtotal );
2011-12-29 01:18:59 +00:00
2012-06-10 14:48:52 +00:00
if ( $this -> tax_total > 0 && ! $this -> prices_include_tax ) {
2012-05-23 02:03:41 +00:00
$cart_subtotal .= ' <small>' . $woocommerce -> countries -> inc_tax_or_vat () . '</small>' ;
2012-03-20 13:22:35 +00:00
}
}
}
2012-05-23 02:03:41 +00:00
return apply_filters ( 'woocommerce_cart_subtotal' , $cart_subtotal , $compound , $this );
2011-12-08 12:50:50 +00:00
}
2011-08-09 15:16:18 +00:00
2011-12-08 12:50:50 +00:00
/**
* Get the product row subtotal
*
* Gets the tax etc to avoid rounding issues .
*
* When on the checkout ( review order ), this will get the subtotal based on the customer ' s tax rate rather than the base rate
2012-03-20 13:22:35 +00:00
*
* @ params object product
* @ params int quantity
* @ return string formatted price
2011-12-08 12:50:50 +00:00
*/
function get_product_subtotal ( $_product , $quantity ) {
global $woocommerce ;
2011-12-29 01:18:59 +00:00
2011-12-08 12:50:50 +00:00
$price = $_product -> get_price ();
$taxable = $_product -> is_taxable ();
2011-12-29 01:18:59 +00:00
$base_tax_rates = $this -> tax -> get_shop_base_rate ( $_product -> tax_class );
$tax_rates = $this -> tax -> get_rates ( $_product -> get_tax_class () ); // This will get the base rate unless we're on the checkout page
2011-08-09 15:16:18 +00:00
2011-12-08 12:50:50 +00:00
// Taxable
2012-03-20 13:22:35 +00:00
if ( $taxable ) {
2011-08-09 15:16:18 +00:00
2012-06-10 14:48:52 +00:00
if ( ( $this -> display_cart_ex_tax || $woocommerce -> customer -> is_vat_exempt () ) && $this -> prices_include_tax ) {
2011-12-08 12:50:50 +00:00
2011-12-29 01:18:59 +00:00
$base_taxes = $this -> tax -> calc_tax ( $price * $quantity , $base_tax_rates , true );
2011-12-30 19:36:44 +00:00
$base_tax_amount = array_sum ( $base_taxes );
2012-01-02 15:25:07 +00:00
2011-12-08 12:50:50 +00:00
$row_price = ( $price * $quantity ) - $base_tax_amount ;
2012-05-23 02:05:55 +00:00
$product_subtotal = woocommerce_price ( $row_price );
$product_subtotal .= ' <small class="tax_label">' . $woocommerce -> countries -> ex_tax_or_vat () . '</small>' ;
2011-11-22 14:22:35 +00:00
2012-03-20 13:22:35 +00:00
} elseif ( ! $this -> display_cart_ex_tax && $tax_rates !== $base_tax_rates && $this -> prices_include_tax ) {
2011-12-29 01:18:59 +00:00
2012-06-05 11:21:52 +00:00
$base_taxes = $this -> tax -> calc_tax ( $price * $quantity , $base_tax_rates , true , true );
2011-12-30 19:36:44 +00:00
$modded_taxes = $this -> tax -> calc_tax ( ( $price * $quantity ) - array_sum ( $base_taxes ), $tax_rates , false );
$row_price = (( $price * $quantity ) - array_sum ( $base_taxes )) + array_sum ( $modded_taxes );
2011-12-08 12:50:50 +00:00
2012-05-23 02:05:55 +00:00
$product_subtotal = woocommerce_price ( $row_price );
2012-03-20 13:22:35 +00:00
if ( ! $this -> prices_include_tax ) {
2012-05-23 02:05:55 +00:00
$product_subtotal .= ' <small class="tax_label">' . $woocommerce -> countries -> inc_tax_or_vat () . '</small>' ;
2012-03-20 13:22:35 +00:00
}
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
} else {
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
$row_price = $price * $quantity ;
2012-05-23 02:05:55 +00:00
$product_subtotal = woocommerce_price ( $row_price );
2011-12-08 12:50:50 +00:00
2012-03-20 13:22:35 +00:00
}
2011-11-26 16:15:25 +00:00
2011-12-08 12:50:50 +00:00
// Non taxable
2012-03-20 13:22:35 +00:00
} else {
2011-11-26 16:15:25 +00:00
2012-03-20 13:22:35 +00:00
$row_price = $price * $quantity ;
2012-05-23 02:05:55 +00:00
$product_subtotal = woocommerce_price ( $row_price );
2011-11-26 16:15:25 +00:00
2012-03-20 13:22:35 +00:00
}
2011-11-23 23:19:23 +00:00
2012-05-23 02:05:55 +00:00
return apply_filters ( 'woocommerce_cart_product_subtotal' , $product_subtotal , $_product , $quantity , $this );
2011-12-08 12:50:50 +00:00
}
2011-11-22 13:18:33 +00:00
2011-12-08 12:50:50 +00:00
/**
* gets the cart tax ( after calculation )
2012-03-20 13:22:35 +00:00
*
* @ return string formatted price
2011-12-08 12:50:50 +00:00
*/
function get_cart_tax () {
2011-12-23 18:15:46 +00:00
$return = false ;
2011-12-08 12:50:50 +00:00
$cart_total_tax = $this -> tax_total + $this -> shipping_tax_total ;
2012-03-20 13:22:35 +00:00
if ( $cart_total_tax > 0 ) $return = woocommerce_price ( $cart_total_tax );
return apply_filters ( 'woocommerce_get_cart_tax' , $return );
2011-12-30 21:11:18 +00:00
}
/**
* Get tax row amounts with or without compound taxes includes
2012-03-20 13:22:35 +00:00
*
* @ return float price
2011-12-30 21:11:18 +00:00
*/
function get_taxes_total ( $compound = true ) {
$total = 0 ;
2012-03-20 13:22:35 +00:00
foreach ( $this -> taxes as $key => $tax ) {
if ( ! $compound && $this -> tax -> is_compound ( $key ) ) continue ;
2011-12-30 21:11:18 +00:00
$total += $tax ;
2012-03-20 13:22:35 +00:00
}
foreach ( $this -> shipping_taxes as $key => $tax ) {
if ( ! $compound && $this -> tax -> is_compound ( $key ) ) continue ;
2012-01-27 15:00:03 +00:00
$total += $tax ;
2012-03-20 13:22:35 +00:00
}
2011-12-30 21:11:18 +00:00
return $total ;
}
2011-11-22 13:18:33 +00:00
2011-12-08 12:50:50 +00:00
/**
* gets the total ( product ) discount amount - these are applied before tax
2012-03-20 13:22:35 +00:00
*
* @ return mixed formatted price or false if there are none
2011-12-08 12:50:50 +00:00
*/
function get_discounts_before_tax () {
2012-03-20 13:22:35 +00:00
if ( $this -> discount_cart ) {
2012-05-23 02:15:04 +00:00
$discounts_before_tax = woocommerce_price ( $this -> discount_cart );
} else {
$discounts_before_tax = false ;
2012-03-20 13:22:35 +00:00
}
2012-05-23 02:15:04 +00:00
return apply_filters ( 'woocommerce_cart_discounts_before_tax' , $discounts_before_tax , $this );
2011-12-08 12:50:50 +00:00
}
2011-11-22 13:18:33 +00:00
2011-12-08 12:50:50 +00:00
/**
* gets the order discount amount - these are applied after tax
2012-03-20 13:22:35 +00:00
*
* @ return mixed formatted price or false if there are none
2011-12-08 12:50:50 +00:00
*/
function get_discounts_after_tax () {
2012-03-20 13:22:35 +00:00
if ( $this -> discount_total ) {
2012-05-23 02:15:04 +00:00
$discounts_after_tax = woocommerce_price ( $this -> discount_total );
} else {
$discounts_after_tax = false ;
2012-03-20 13:22:35 +00:00
}
2012-05-23 02:15:04 +00:00
return apply_filters ( 'woocommerce_cart_discounts_after_tax' , $discounts_after_tax , $this );
2011-12-08 12:50:50 +00:00
}
2011-09-06 11:11:22 +00:00
2011-12-08 12:50:50 +00:00
/**
* gets the total discount amount - both kinds
2012-03-20 13:22:35 +00:00
*
* @ return mixed formatted price or false if there are none
2011-12-08 12:50:50 +00:00
*/
function get_total_discount () {
2012-03-20 13:22:35 +00:00
if ( $this -> discount_total || $this -> discount_cart ) {
2012-05-23 02:15:04 +00:00
$total_discount = woocommerce_price ( $this -> discount_total + $this -> discount_cart );
} else {
$total_discount = false ;
2012-03-20 13:22:35 +00:00
}
2012-05-23 02:15:04 +00:00
return apply_filters ( 'woocommerce_cart_total_discount' , $total_discount , $this );
}
2012-01-27 16:38:39 +00:00
}
2012-03-20 13:22:35 +00:00
/**
* woocommerce_cart class .
*
* @ extends WC_Cart
* @ deprecated 1.4
*/
2012-01-27 16:38:39 +00:00
class woocommerce_cart extends WC_Cart {
public function __construct () {
_deprecated_function ( 'woocommerce_cart' , '1.4' , 'WC_Cart()' );
parent :: __construct ();
}
2011-08-09 15:16:18 +00:00
}