Merge pull request #12403 from woocommerce/order-item-data-store
Order Item Data Store
This commit is contained in:
commit
8d551c01e6
|
@ -27,7 +27,8 @@ abstract class WC_Abstract_Legacy_Order extends WC_Data {
|
|||
public function add_coupon( $code = array(), $discount = 0, $discount_tax = 0 ) {
|
||||
_deprecated_function( 'WC_Order::add_coupon', '2.7', 'Create new WC_Order_Item_Coupon object and add to order with WC_Order::add_item()' );
|
||||
|
||||
$item = new WC_Order_Item_Coupon( array(
|
||||
$item = new WC_Order_Item_Coupon();
|
||||
$item->set_props( array(
|
||||
'code' => $code,
|
||||
'discount' => $discount,
|
||||
'discount_tax' => $discount_tax,
|
||||
|
@ -50,7 +51,8 @@ abstract class WC_Abstract_Legacy_Order extends WC_Data {
|
|||
public function add_tax( $tax_rate_id, $tax_amount = 0, $shipping_tax_amount = 0 ) {
|
||||
_deprecated_function( 'WC_Order::add_tax', '2.7', 'Create new WC_Order_Item_Tax object and add to order with WC_Order::add_item()' );
|
||||
|
||||
$item = new WC_Order_Item_Tax( array(
|
||||
$item = new WC_Order_Item_Tax();
|
||||
$item->set_props( array(
|
||||
'rate_id' => $tax_rate_id,
|
||||
'tax_total' => $tax_amount,
|
||||
'shipping_tax_total' => $shipping_tax_amount,
|
||||
|
@ -72,7 +74,8 @@ abstract class WC_Abstract_Legacy_Order extends WC_Data {
|
|||
public function add_shipping( $shipping_rate ) {
|
||||
_deprecated_function( 'WC_Order::add_shipping', '2.7', 'Create new WC_Order_Item_Shipping object and add to order with WC_Order::add_item()' );
|
||||
|
||||
$item = new WC_Order_Item_Shipping( array(
|
||||
$item = new WC_Order_Item_Shipping();
|
||||
$item->set_props( array(
|
||||
'method_title' => $shipping_rate->label,
|
||||
'method_id' => $shipping_rate->id,
|
||||
'total' => wc_format_decimal( $shipping_rate->cost ),
|
||||
|
@ -96,7 +99,8 @@ abstract class WC_Abstract_Legacy_Order extends WC_Data {
|
|||
public function add_fee( $fee ) {
|
||||
_deprecated_function( 'WC_Order::add_fee', '2.7', 'Create new WC_Order_Item_Fee object and add to order with WC_Order::add_item()' );
|
||||
|
||||
$item = new WC_Order_Item_Fee( array(
|
||||
$item = new WC_Order_Item_Fee();
|
||||
$item->set_props( array(
|
||||
'name' => $fee->name,
|
||||
'tax_class' => $fee->taxable ? $fee->tax_class : 0,
|
||||
'total' => $fee->amount,
|
||||
|
|
|
@ -905,7 +905,8 @@ abstract class WC_Abstract_Order extends WC_Abstract_Legacy_Order {
|
|||
}
|
||||
}
|
||||
|
||||
$item = new WC_Order_Item_Product( $args );
|
||||
$item = new WC_Order_Item_Product();
|
||||
$item->set_props( $args );
|
||||
$item->set_backorder_meta();
|
||||
$item->set_order_id( $this->get_id() );
|
||||
$item->save();
|
||||
|
|
|
@ -905,35 +905,35 @@ class WC_API_Orders extends WC_API_Resource {
|
|||
}
|
||||
|
||||
if ( $creating ) {
|
||||
$item = new WC_Order_Item_Product();
|
||||
$line_item = new WC_Order_Item_Product();
|
||||
} else {
|
||||
$item = new WC_Order_Item_Product( $item['id'] );
|
||||
$line_item = new WC_Order_Item_Product( $item['id'] );
|
||||
}
|
||||
|
||||
$item->set_product( $product );
|
||||
$item->set_order_id( $order->get_id() );
|
||||
$line_item->set_product( $product );
|
||||
$line_item->set_order_id( $order->get_id() );
|
||||
|
||||
if ( isset( $item['quantity'] ) ) {
|
||||
$item->set_quantity( $item['quantity'] );
|
||||
$line_item->set_quantity( $item['quantity'] );
|
||||
}
|
||||
if ( isset( $item['total'] ) ) {
|
||||
$item->set_total( floatval( $item['total'] ) );
|
||||
$line_item->set_total( floatval( $item['total'] ) );
|
||||
}
|
||||
if ( isset( $item['total_tax'] ) ) {
|
||||
$item->set_total_tax( floatval( $item['total_tax'] ) );
|
||||
$line_item->set_total_tax( floatval( $item['total_tax'] ) );
|
||||
}
|
||||
if ( isset( $item['subtotal'] ) ) {
|
||||
$item->set_subtotal( floatval( $item['subtotal'] ) );
|
||||
$line_item->set_subtotal( floatval( $item['subtotal'] ) );
|
||||
}
|
||||
if ( isset( $item['subtotal_tax'] ) ) {
|
||||
$item->set_subtotal_tax( floatval( $item['subtotal_tax'] ) );
|
||||
$line_item->set_subtotal_tax( floatval( $item['subtotal_tax'] ) );
|
||||
}
|
||||
if ( $variation_id ) {
|
||||
$item->set_variation_id( $variation_id );
|
||||
$item->set_variation( $item['variations'] );
|
||||
$line_item->set_variation_id( $variation_id );
|
||||
$line_item->set_variation( $item['variations'] );
|
||||
}
|
||||
|
||||
$item_id = $item->save();
|
||||
$item_id = $line_item->save();
|
||||
|
||||
if ( ! $item_id ) {
|
||||
throw new WC_API_Exception( 'woocommerce_cannot_create_line_item', __( 'Cannot create line item, try again.', 'woocommerce' ), 500 );
|
||||
|
@ -1142,7 +1142,8 @@ class WC_API_Orders extends WC_API_Resource {
|
|||
throw new WC_API_Exception( 'woocommerce_invalid_coupon_coupon', __( 'Coupon code is required.', 'woocommerce' ), 400 );
|
||||
}
|
||||
|
||||
$item = new WC_Order_Item_Coupon( array(
|
||||
$item = new WC_Order_Item_Coupon();
|
||||
$item->set_props( array(
|
||||
'code' => $coupon['code'],
|
||||
'discount' => isset( $coupon['amount'] ) ? floatval( $coupon['amount'] ) : 0,
|
||||
'discount_tax' => 0,
|
||||
|
|
|
@ -954,35 +954,35 @@ class WC_API_Orders extends WC_API_Resource {
|
|||
|
||||
// quantity
|
||||
if ( $creating ) {
|
||||
$item = new WC_Order_Item_Product();
|
||||
$line_item = new WC_Order_Item_Product();
|
||||
} else {
|
||||
$item = new WC_Order_Item_Product( $item['id'] );
|
||||
$line_item = new WC_Order_Item_Product( $item['id'] );
|
||||
}
|
||||
|
||||
$item->set_product( $product );
|
||||
$item->set_order_id( $order->get_id() );
|
||||
$line_item->set_product( $product );
|
||||
$line_item->set_order_id( $order->get_id() );
|
||||
|
||||
if ( isset( $item['quantity'] ) ) {
|
||||
$item->set_quantity( $item['quantity'] );
|
||||
$line_item->set_quantity( $item['quantity'] );
|
||||
}
|
||||
if ( isset( $item['total'] ) ) {
|
||||
$item->set_total( floatval( $item['total'] ) );
|
||||
$line_item->set_total( floatval( $item['total'] ) );
|
||||
}
|
||||
if ( isset( $item['total_tax'] ) ) {
|
||||
$item->set_total_tax( floatval( $item['total_tax'] ) );
|
||||
$line_item->set_total_tax( floatval( $item['total_tax'] ) );
|
||||
}
|
||||
if ( isset( $item['subtotal'] ) ) {
|
||||
$item->set_subtotal( floatval( $item['subtotal'] ) );
|
||||
$line_item->set_subtotal( floatval( $item['subtotal'] ) );
|
||||
}
|
||||
if ( isset( $item['subtotal_tax'] ) ) {
|
||||
$item->set_subtotal_tax( floatval( $item['subtotal_tax'] ) );
|
||||
$line_item->set_subtotal_tax( floatval( $item['subtotal_tax'] ) );
|
||||
}
|
||||
if ( $variation_id ) {
|
||||
$item->set_variation_id( $variation_id );
|
||||
$item->set_variation( $item['variations'] );
|
||||
$line_item->set_variation_id( $variation_id );
|
||||
$line_item->set_variation( $item['variations'] );
|
||||
}
|
||||
|
||||
$item_id = $item->save();
|
||||
$item_id = $line_item->save();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -1188,7 +1188,8 @@ class WC_API_Orders extends WC_API_Resource {
|
|||
throw new WC_API_Exception( 'woocommerce_invalid_coupon_coupon', __( 'Coupon code is required.', 'woocommerce' ), 400 );
|
||||
}
|
||||
|
||||
$item = new WC_Order_Item_Coupon( array(
|
||||
$item = new WC_Order_Item_Coupon();
|
||||
$item->set_props( array(
|
||||
'code' => $coupon['code'],
|
||||
'discount' => isset( $coupon['amount'] ) ? floatval( $coupon['amount'] ) : 0,
|
||||
'discount_tax' => 0,
|
||||
|
|
|
@ -929,7 +929,8 @@ class WC_AJAX {
|
|||
// Add new shipping
|
||||
$item = new WC_Order_Item_Shipping();
|
||||
$item->set_shipping_rate( new WC_Shipping_Rate() );
|
||||
$order->add_item( $item );
|
||||
$item->set_order_id( $order_id );
|
||||
$item_id = $item->save();
|
||||
|
||||
ob_start();
|
||||
include( 'admin/meta-boxes/views/html-order-shipping.php' );
|
||||
|
@ -2013,7 +2014,7 @@ class WC_AJAX {
|
|||
|
||||
foreach ( $variations as $variation_id ) {
|
||||
$variation = wc_get_product( $variation_id );
|
||||
$variation->save_regular_price( wc_clean( $data['value'] ) );
|
||||
$variation->set_regular_price( wc_clean( $data['value'] ) );
|
||||
$variation->save();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -230,7 +230,8 @@ class WC_Checkout {
|
|||
// Add line items.
|
||||
foreach ( WC()->cart->get_cart() as $cart_item_key => $values ) {
|
||||
$product = $values['data'];
|
||||
$item = new WC_Order_Item_Product( array(
|
||||
$item = new WC_Order_Item_Product();
|
||||
$item->set_props( array(
|
||||
'quantity' => $values['quantity'],
|
||||
'name' => $product ? $product->get_name() : '',
|
||||
'tax_class' => $product ? $product->get_tax_class() : '',
|
||||
|
@ -243,7 +244,6 @@ class WC_Checkout {
|
|||
'total_tax' => $values['line_tax'],
|
||||
'taxes' => $values['line_tax_data'],
|
||||
) );
|
||||
|
||||
$item->set_backorder_meta();
|
||||
// Set this to pass to legacy actions.
|
||||
$item->legacy_values = $values;
|
||||
|
@ -254,7 +254,8 @@ class WC_Checkout {
|
|||
|
||||
// Add fees
|
||||
foreach ( WC()->cart->get_fees() as $fee_key => $fee ) {
|
||||
$item = new WC_Order_Item_Fee( array(
|
||||
$item = new WC_Order_Item_Fee();
|
||||
$item->set_props( array(
|
||||
'name' => $fee->name,
|
||||
'tax_class' => $fee->taxable ? $fee->tax_class : 0,
|
||||
'total' => $fee->amount,
|
||||
|
@ -275,7 +276,8 @@ class WC_Checkout {
|
|||
foreach ( WC()->shipping->get_packages() as $package_key => $package ) {
|
||||
if ( isset( $package['rates'][ $this->shipping_methods[ $package_key ] ] ) ) {
|
||||
$shipping_rate = $package['rates'][ $this->shipping_methods[ $package_key ] ];
|
||||
$item = new WC_Order_Item_Shipping( array(
|
||||
$item = new WC_Order_Item_Shipping();
|
||||
$item->set_props( array(
|
||||
'method_title' => $shipping_rate->label,
|
||||
'method_id' => $shipping_rate->id,
|
||||
'total' => wc_format_decimal( $shipping_rate->cost ),
|
||||
|
@ -293,20 +295,23 @@ class WC_Checkout {
|
|||
// Store tax rows
|
||||
foreach ( array_keys( WC()->cart->taxes + WC()->cart->shipping_taxes ) as $tax_rate_id ) {
|
||||
if ( $tax_rate_id && apply_filters( 'woocommerce_cart_remove_taxes_zero_rate_id', 'zero-rated' ) !== $tax_rate_id ) {
|
||||
$order->add_item( new WC_Order_Item_Tax( array(
|
||||
$item = new WC_Order_Item_Tax();
|
||||
$item->set_props( array(
|
||||
'rate_id' => $tax_rate_id,
|
||||
'tax_total' => WC()->cart->get_tax_amount( $tax_rate_id ),
|
||||
'shipping_tax_total' => WC()->cart->get_shipping_tax_amount( $tax_rate_id ),
|
||||
'rate_code' => WC_Tax::get_rate_code( $tax_rate_id ),
|
||||
'label' => WC_Tax::get_rate_label( $tax_rate_id ),
|
||||
'compound' => WC_Tax::is_compound( $tax_rate_id ),
|
||||
) ) );
|
||||
) );
|
||||
$order->add_item( $item );
|
||||
}
|
||||
}
|
||||
|
||||
// Store coupons
|
||||
foreach ( WC()->cart->get_coupons() as $code => $coupon ) {
|
||||
$item = new WC_Order_Item_Coupon( array(
|
||||
$item = new WC_Order_Item_Coupon();
|
||||
$item->set_props( array(
|
||||
'code' => $code,
|
||||
'discount' => WC()->cart->get_coupon_discount_amount( $code ),
|
||||
'discount_tax' => WC()->cart->get_coupon_discount_tax_amount( $code ),
|
||||
|
|
|
@ -28,18 +28,24 @@ class WC_Data_Store {
|
|||
* Ran through `woocommerce_data_stores`.
|
||||
*/
|
||||
private $stores = array(
|
||||
'coupon' => 'WC_Coupon_Data_Store_CPT',
|
||||
'customer' => 'WC_Customer_Data_Store',
|
||||
'customer-download' => 'WC_Customer_Download_Data_Store',
|
||||
'customer-session' => 'WC_Customer_Data_Store_Session',
|
||||
'order' => 'WC_Order_Data_Store_CPT',
|
||||
'order-refund' => 'WC_Order_Refund_Data_Store_CPT',
|
||||
'payment-token' => 'WC_Payment_Token_Data_Store',
|
||||
'product' => 'WC_Product_Data_Store_CPT',
|
||||
'product_grouped' => 'WC_Product_Grouped_Data_Store_CPT',
|
||||
'product_variable' => 'WC_Product_Variable_Data_Store_CPT',
|
||||
'product_variation' => 'WC_Product_Variation_Data_Store_CPT',
|
||||
'shipping-zone' => 'WC_Shipping_Zone_Data_Store',
|
||||
'coupon' => 'WC_Coupon_Data_Store_CPT',
|
||||
'customer' => 'WC_Customer_Data_Store',
|
||||
'customer-download' => 'WC_Customer_Download_Data_Store',
|
||||
'customer-session' => 'WC_Customer_Data_Store_Session',
|
||||
'order' => 'WC_Order_Data_Store_CPT',
|
||||
'order-refund' => 'WC_Order_Refund_Data_Store_CPT',
|
||||
'order-item' => 'WC_Order_Item_Data_Store',
|
||||
'order-item-coupon' => 'WC_Order_Item_Coupon_Data_Store',
|
||||
'order-item-fee' => 'WC_Order_Item_Fee_Data_Store',
|
||||
'order-item-product' => 'WC_Order_Item_Product_Data_Store',
|
||||
'order-item-shipping' => 'WC_Order_Item_Shipping_Data_Store',
|
||||
'order-item-tax' => 'WC_Order_Item_Tax_Data_Store',
|
||||
'payment-token' => 'WC_Payment_Token_Data_Store',
|
||||
'product' => 'WC_Product_Data_Store_CPT',
|
||||
'product_grouped' => 'WC_Product_Grouped_Data_Store_CPT',
|
||||
'product_variable' => 'WC_Product_Variable_Data_Store_CPT',
|
||||
'product_variation' => 'WC_Product_Variation_Data_Store_CPT',
|
||||
'shipping-zone' => 'WC_Shipping_Zone_Data_Store',
|
||||
);
|
||||
|
||||
/**
|
||||
|
|
|
@ -1,7 +1,6 @@
|
|||
<?php
|
||||
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit; // Exit if accessed directly
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -13,7 +12,7 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|||
* @version 2.7.0
|
||||
* @package WooCommerce/Classes
|
||||
* @category Class
|
||||
* @author WooThemes
|
||||
* @author WooCommerce
|
||||
*/
|
||||
class WC_Order_Factory {
|
||||
|
||||
|
@ -61,38 +60,48 @@ class WC_Order_Factory {
|
|||
global $wpdb;
|
||||
|
||||
if ( is_numeric( $item_id ) ) {
|
||||
$item_data = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}woocommerce_order_items WHERE order_item_id = %d LIMIT 1;", $item_id ) );
|
||||
$item_data = $wpdb->get_row( $wpdb->prepare( "SELECT order_item_type FROM {$wpdb->prefix}woocommerce_order_items WHERE order_item_id = %d LIMIT 1;", $item_id ) );
|
||||
$item_type = $item_data->order_item_type;
|
||||
$id = $item_id;
|
||||
} elseif ( $item_id instanceof WC_Order_Item ) {
|
||||
$item_data = $item_id->get_data();
|
||||
$item_type = $item_data->get_type();
|
||||
$item_type = $item_id->get_type();
|
||||
$id = $item_id->get_id();
|
||||
} elseif ( is_object( $item_id ) && ! empty( $item_id->order_item_type ) ) {
|
||||
$item_data = $item_id;
|
||||
$id = $item_id->order_item_id;
|
||||
$item_type = $item_id->order_item_type;
|
||||
} else {
|
||||
$item_data = false;
|
||||
$item_type = false;
|
||||
$id = false;
|
||||
}
|
||||
|
||||
if ( $item_data && $item_type ) {
|
||||
if ( $id && $item_type ) {
|
||||
$classname = false;
|
||||
switch ( $item_type ) {
|
||||
case 'line_item' :
|
||||
case 'product' :
|
||||
return new WC_Order_Item_Product( $item_data );
|
||||
$classname = 'WC_Order_Item_Product';
|
||||
break;
|
||||
case 'coupon' :
|
||||
return new WC_Order_Item_Coupon( $item_data );
|
||||
$classname = 'WC_Order_Item_Coupon';
|
||||
break;
|
||||
case 'fee' :
|
||||
return new WC_Order_Item_Fee( $item_data );
|
||||
$classname = 'WC_Order_Item_Fee';
|
||||
break;
|
||||
case 'shipping' :
|
||||
return new WC_Order_Item_Shipping( $item_data );
|
||||
$classname = 'WC_Order_Item_Shipping';
|
||||
break;
|
||||
case 'tax' :
|
||||
return new WC_Order_Item_Tax( $item_data );
|
||||
$classname = 'WC_Order_Item_Tax';
|
||||
break;
|
||||
}
|
||||
if ( $classname ) {
|
||||
try {
|
||||
return new $classname( $id );
|
||||
} catch ( Exception $e ) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -9,7 +9,7 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|||
* @version 2.7.0
|
||||
* @since 2.7.0
|
||||
* @package WooCommerce/Classes
|
||||
* @author WooThemes
|
||||
* @author WooCommerce
|
||||
*/
|
||||
class WC_Order_Item_Coupon extends WC_Order_Item {
|
||||
|
||||
|
@ -18,14 +18,120 @@ class WC_Order_Item_Coupon extends WC_Order_Item {
|
|||
* @since 2.7.0
|
||||
* @var array
|
||||
*/
|
||||
protected $_data = array(
|
||||
'order_id' => 0,
|
||||
'id' => 0,
|
||||
protected $extra_data = array(
|
||||
'code' => '',
|
||||
'discount' => 0,
|
||||
'discount_tax' => 0,
|
||||
);
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Setters
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Set order item name.
|
||||
*
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_name( $value ) {
|
||||
return $this->set_code( $value );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set code.
|
||||
*
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_code( $value ) {
|
||||
$this->set_prop( 'code', wc_clean( $value ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set discount amount.
|
||||
*
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_discount( $value ) {
|
||||
$this->set_prop( 'discount', wc_format_decimal( $value ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set discounted tax amount.
|
||||
*
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_discount_tax( $value ) {
|
||||
$this->set_prop( 'discount_tax', wc_format_decimal( $value ) );
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Getters
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Get order item type.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_type() {
|
||||
return 'coupon';
|
||||
}
|
||||
|
||||
/**
|
||||
* Get order item name.
|
||||
*
|
||||
* @param string $context
|
||||
* @return string
|
||||
*/
|
||||
public function get_name( $context = 'view' ) {
|
||||
return $this->get_code( $context );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get coupon code.
|
||||
*
|
||||
* @param string $context
|
||||
* @return string
|
||||
*/
|
||||
public function get_code( $context = 'view' ) {
|
||||
return $this->get_prop( 'code', $context );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get discount amount.
|
||||
*
|
||||
* @param string $context
|
||||
* @return string
|
||||
*/
|
||||
public function get_discount( $context = 'view' ) {
|
||||
return $this->get_prop( 'discount', $context );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get discounted tax amount.
|
||||
* @return string
|
||||
*/
|
||||
public function get_discount_tax( $context = 'view' ) {
|
||||
return $this->get_prop( 'discount_tax', $context );
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Array Access Methods
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| For backwards compat with legacy arrays.
|
||||
|
|
||||
*/
|
||||
|
||||
/**
|
||||
* offsetGet for ArrayAccess/Backwards compatibility.
|
||||
* @deprecated Add deprecation notices in future release.
|
||||
|
@ -68,36 +174,6 @@ class WC_Order_Item_Coupon extends WC_Order_Item {
|
|||
return parent::offsetExists( $offset );
|
||||
}
|
||||
|
||||
/**
|
||||
* Read/populate data properties specific to this order item.
|
||||
*/
|
||||
public function read( $id ) {
|
||||
parent::read( $id );
|
||||
|
||||
if ( ! $this->get_id() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->set_props( array(
|
||||
'discount' => get_metadata( 'order_item', $this->get_id(), 'discount_amount', true ),
|
||||
'discount_tax' => get_metadata( 'order_item', $this->get_id(), 'discount_amount_tax', true ),
|
||||
) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Save properties specific to this order item.
|
||||
* @return int Item ID
|
||||
*/
|
||||
public function save() {
|
||||
parent::save();
|
||||
if ( $this->get_id() ) {
|
||||
wc_update_order_item_meta( $this->get_id(), 'discount_amount', $this->get_discount() );
|
||||
wc_update_order_item_meta( $this->get_id(), 'discount_amount_tax', $this->get_discount_tax() );
|
||||
}
|
||||
|
||||
return $this->get_id();
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal meta keys we don't want exposed as part of meta_data.
|
||||
* @return array()
|
||||
|
@ -105,92 +181,4 @@ class WC_Order_Item_Coupon extends WC_Order_Item {
|
|||
protected function get_internal_meta_keys() {
|
||||
return array( 'discount_amount', 'discount_amount_tax' );
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Setters
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Set order item name.
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_name( $value ) {
|
||||
return $this->set_code( $value );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set code.
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_code( $value ) {
|
||||
$this->_data['code'] = wc_clean( $value );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set discount amount.
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_discount( $value ) {
|
||||
$this->_data['discount'] = wc_format_decimal( $value );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set discounted tax amount.
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_discount_tax( $value ) {
|
||||
$this->_data['discount_tax'] = wc_format_decimal( $value );
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Getters
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Get order item type.
|
||||
* @return string
|
||||
*/
|
||||
public function get_type() {
|
||||
return 'coupon';
|
||||
}
|
||||
|
||||
/**
|
||||
* Get order item name.
|
||||
* @return string
|
||||
*/
|
||||
public function get_name() {
|
||||
return $this->get_code();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get coupon code.
|
||||
* @return string
|
||||
*/
|
||||
public function get_code() {
|
||||
return $this->_data['code'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get discount amount.
|
||||
* @return string
|
||||
*/
|
||||
public function get_discount() {
|
||||
return wc_format_decimal( $this->_data['discount'] );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get discounted tax amount.
|
||||
* @return string
|
||||
*/
|
||||
public function get_discount_tax() {
|
||||
return wc_format_decimal( $this->_data['discount_tax'] );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,10 +18,7 @@ class WC_Order_Item_Fee extends WC_Order_Item {
|
|||
* @since 2.7.0
|
||||
* @var array
|
||||
*/
|
||||
protected $_data = array(
|
||||
'order_id' => 0,
|
||||
'id' => 0,
|
||||
'name' => '',
|
||||
protected $extra_data = array(
|
||||
'tax_class' => '',
|
||||
'tax_status' => 'taxable',
|
||||
'total' => '',
|
||||
|
@ -31,6 +28,167 @@ class WC_Order_Item_Fee extends WC_Order_Item {
|
|||
),
|
||||
);
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Setters
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Set tax class.
|
||||
*
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_tax_class( $value ) {
|
||||
if ( $value && ! in_array( $value, WC_Tax::get_tax_classes() ) ) {
|
||||
$this->error( 'order_item_fee_invalid_tax_class', __( 'Invalid tax class', 'woocommerce' ) );
|
||||
}
|
||||
$this->set_prop( 'tax_class', $value );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set tax_status.
|
||||
*
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_tax_status( $value ) {
|
||||
if ( in_array( $value, array( 'taxable', 'none' ) ) ) {
|
||||
$this->set_prop( 'tax_status', $value );
|
||||
} else {
|
||||
$this->set_prop( 'tax_status', 'taxable' );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set total.
|
||||
*
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_total( $value ) {
|
||||
$this->set_prop( 'total', wc_format_decimal( $value ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set total tax.
|
||||
*
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
protected function set_total_tax( $value ) {
|
||||
$this->set_prop( 'total_tax', wc_format_decimal( $value ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set taxes.
|
||||
*
|
||||
* This is an array of tax ID keys with total amount values.
|
||||
* @param array $raw_tax_data
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_taxes( $raw_tax_data ) {
|
||||
$raw_tax_data = maybe_unserialize( $raw_tax_data );
|
||||
$tax_data = array(
|
||||
'total' => array(),
|
||||
);
|
||||
if ( ! empty( $raw_tax_data['total'] ) ) {
|
||||
$tax_data['total'] = array_map( 'wc_format_decimal', $raw_tax_data['total'] );
|
||||
}
|
||||
$this->set_prop( 'taxes', $tax_data );
|
||||
$this->set_total_tax( array_sum( $tax_data['total'] ) );
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Getters
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Get order item name.
|
||||
*
|
||||
* @param string $context
|
||||
* @return string
|
||||
*/
|
||||
public function get_name( $context = 'view' ) {
|
||||
$name = $this->get_prop( 'name', $context );
|
||||
if ( 'view' === $context ) {
|
||||
return $name ? $name : __( 'Fee', 'woocommerce' );
|
||||
} else {
|
||||
return $name;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get order item type.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_type() {
|
||||
return 'fee';
|
||||
}
|
||||
|
||||
/**
|
||||
* Get tax class.
|
||||
*
|
||||
* @param string $context
|
||||
* @return string
|
||||
*/
|
||||
public function get_tax_class( $context = 'view' ) {
|
||||
return $this->get_prop( 'tax_class', $context );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get tax status.
|
||||
*
|
||||
* @param string $context
|
||||
* @return string
|
||||
*/
|
||||
public function get_tax_status( $context = 'view' ) {
|
||||
return $this->get_prop( 'tax_status', $context );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get total fee.
|
||||
*
|
||||
* @param string $context
|
||||
* @return string
|
||||
*/
|
||||
public function get_total( $context = 'view' ) {
|
||||
return $this->get_prop( 'total', $context );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get total tax.
|
||||
*
|
||||
* @param string $context
|
||||
* @return string
|
||||
*/
|
||||
public function get_total_tax( $context = 'view' ) {
|
||||
return $this->get_prop( 'total_tax', $context );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get fee taxes.
|
||||
*
|
||||
* @param string $context
|
||||
* @return array
|
||||
*/
|
||||
public function get_taxes( $context = 'view' ) {
|
||||
return $this->get_prop( 'taxes', $context );
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Array Access Methods
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| For backwards compat with legacy arrays.
|
||||
|
|
||||
*/
|
||||
|
||||
/**
|
||||
* offsetGet for ArrayAccess/Backwards compatibility.
|
||||
* @deprecated Add deprecation notices in future release.
|
||||
|
@ -77,41 +235,6 @@ class WC_Order_Item_Fee extends WC_Order_Item {
|
|||
return parent::offsetExists( $offset );
|
||||
}
|
||||
|
||||
/**
|
||||
* Read/populate data properties specific to this order item.
|
||||
*/
|
||||
public function read( $id ) {
|
||||
parent::read( $id );
|
||||
|
||||
if ( ! $this->get_id() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->set_props( array(
|
||||
'tax_class' => get_metadata( 'order_item', $this->get_id(), '_tax_class', true ),
|
||||
'tax_status' => get_metadata( 'order_item', $this->get_id(), '_tax_status', true ),
|
||||
'total' => get_metadata( 'order_item', $this->get_id(), '_line_total', true ),
|
||||
'taxes' => get_metadata( 'order_item', $this->get_id(), '_line_tax_data', true ),
|
||||
) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Save properties specific to this order item.
|
||||
* @return int Item ID
|
||||
*/
|
||||
public function save() {
|
||||
parent::save();
|
||||
if ( $this->get_id() ) {
|
||||
wc_update_order_item_meta( $this->get_id(), '_tax_class', $this->get_tax_class() );
|
||||
wc_update_order_item_meta( $this->get_id(), '_tax_status', $this->get_tax_status() );
|
||||
wc_update_order_item_meta( $this->get_id(), '_line_total', $this->get_total() );
|
||||
wc_update_order_item_meta( $this->get_id(), '_line_tax', $this->get_total_tax() );
|
||||
wc_update_order_item_meta( $this->get_id(), '_line_tax_data', $this->get_taxes() );
|
||||
}
|
||||
|
||||
return $this->get_id();
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal meta keys we don't want exposed as part of meta_data.
|
||||
* @return array()
|
||||
|
@ -119,134 +242,4 @@ class WC_Order_Item_Fee extends WC_Order_Item {
|
|||
protected function get_internal_meta_keys() {
|
||||
return array( '_tax_class', '_tax_status', '_line_subtotal', '_line_subtotal_tax', '_line_total', '_line_tax', '_line_tax_data' );
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Setters
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Set tax class.
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_tax_class( $value ) {
|
||||
if ( $value && ! in_array( $value, WC_Tax::get_tax_classes() ) ) {
|
||||
$this->error( 'order_item_fee_invalid_tax_class', __( 'Invalid tax class', 'woocommerce' ) );
|
||||
}
|
||||
$this->_data['tax_class'] = $value;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set tax_status.
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_tax_status( $value ) {
|
||||
if ( in_array( $value, array( 'taxable', 'none' ) ) ) {
|
||||
$this->_data['tax_status'] = $value;
|
||||
} else {
|
||||
$this->_data['tax_status'] = 'taxable';
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set total.
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_total( $value ) {
|
||||
$this->_data['total'] = wc_format_decimal( $value );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set total tax.
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
protected function set_total_tax( $value ) {
|
||||
$this->_data['total_tax'] = wc_format_decimal( $value );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set taxes.
|
||||
*
|
||||
* This is an array of tax ID keys with total amount values.
|
||||
* @param array $raw_tax_data
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_taxes( $raw_tax_data ) {
|
||||
$raw_tax_data = maybe_unserialize( $raw_tax_data );
|
||||
$tax_data = array(
|
||||
'total' => array(),
|
||||
);
|
||||
if ( ! empty( $raw_tax_data['total'] ) ) {
|
||||
$tax_data['total'] = array_map( 'wc_format_decimal', $raw_tax_data['total'] );
|
||||
}
|
||||
$this->_data['taxes'] = $tax_data;
|
||||
$this->set_total_tax( array_sum( $tax_data['total'] ) );
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Getters
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Get order item name.
|
||||
* @return string
|
||||
*/
|
||||
public function get_name() {
|
||||
return $this->_data['name'] ? $this->_data['name'] : __( 'Fee', 'woocommerce' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get order item type.
|
||||
* @return string
|
||||
*/
|
||||
public function get_type() {
|
||||
return 'fee';
|
||||
}
|
||||
|
||||
/**
|
||||
* Get tax class.
|
||||
* @return string
|
||||
*/
|
||||
public function get_tax_class() {
|
||||
return $this->_data['tax_class'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get tax status.
|
||||
* @return string
|
||||
*/
|
||||
public function get_tax_status() {
|
||||
return $this->_data['tax_status'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get total fee.
|
||||
* @return string
|
||||
*/
|
||||
public function get_total() {
|
||||
return wc_format_decimal( $this->_data['total'] );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get total tax.
|
||||
* @return string
|
||||
*/
|
||||
public function get_total_tax() {
|
||||
return wc_format_decimal( $this->_data['total_tax'] );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get fee taxes.
|
||||
* @return array
|
||||
*/
|
||||
public function get_taxes() {
|
||||
return $this->_data['taxes'];
|
||||
}
|
||||
}
|
||||
|
|
|
@ -19,10 +19,7 @@ class WC_Order_Item_Product extends WC_Order_Item {
|
|||
* @since 2.7.0
|
||||
* @var array
|
||||
*/
|
||||
protected $_data = array(
|
||||
'order_id' => 0,
|
||||
'id' => 0,
|
||||
'name' => '',
|
||||
protected $extra_data = array(
|
||||
'product_id' => 0,
|
||||
'variation_id' => 0,
|
||||
'quantity' => 1,
|
||||
|
@ -37,118 +34,285 @@ class WC_Order_Item_Product extends WC_Order_Item {
|
|||
),
|
||||
);
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Setters
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* offsetGet for ArrayAccess/Backwards compatibility.
|
||||
* Set quantity.
|
||||
*
|
||||
* @deprecated Add deprecation notices in future release.
|
||||
* @param string $offset
|
||||
* @return mixed
|
||||
* @param int $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function offsetGet( $offset ) {
|
||||
if ( 'line_subtotal' === $offset ) {
|
||||
$offset = 'subtotal';
|
||||
} elseif ( 'line_subtotal_tax' === $offset ) {
|
||||
$offset = 'subtotal_tax';
|
||||
} elseif ( 'line_total' === $offset ) {
|
||||
$offset = 'total';
|
||||
} elseif ( 'line_tax' === $offset ) {
|
||||
$offset = 'total_tax';
|
||||
} elseif ( 'line_tax_data' === $offset ) {
|
||||
$offset = 'taxes';
|
||||
public function set_quantity( $value ) {
|
||||
if ( 0 > $value ) {
|
||||
$this->error( 'order_item_product_invalid_quantity', __( 'Quantity must be positive', 'woocommerce' ) );
|
||||
}
|
||||
return parent::offsetGet( $offset );
|
||||
$this->set_prop( 'quantity', wc_stock_amount( $value ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* offsetSet for ArrayAccess/Backwards compatibility.
|
||||
* Set tax class.
|
||||
*
|
||||
* @deprecated Add deprecation notices in future release.
|
||||
* @param string $offset
|
||||
* @param mixed $value
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function offsetSet( $offset, $value ) {
|
||||
if ( 'line_subtotal' === $offset ) {
|
||||
$offset = 'subtotal';
|
||||
} elseif ( 'line_subtotal_tax' === $offset ) {
|
||||
$offset = 'subtotal_tax';
|
||||
} elseif ( 'line_total' === $offset ) {
|
||||
$offset = 'total';
|
||||
} elseif ( 'line_tax' === $offset ) {
|
||||
$offset = 'total_tax';
|
||||
} elseif ( 'line_tax_data' === $offset ) {
|
||||
$offset = 'taxes';
|
||||
public function set_tax_class( $value ) {
|
||||
if ( $value && ! in_array( $value, WC_Tax::get_tax_classes() ) ) {
|
||||
$this->error( 'order_item_product_invalid_tax_class', __( 'Invalid tax class', 'woocommerce' ) );
|
||||
}
|
||||
parent::offsetSet( $offset, $value );
|
||||
$this->set_prop( 'tax_class', $value );
|
||||
}
|
||||
|
||||
/**
|
||||
* offsetExists for ArrayAccess.
|
||||
* Set Product ID
|
||||
*
|
||||
* @param string $offset
|
||||
* @return bool
|
||||
* @param int $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function offsetExists( $offset ) {
|
||||
if ( in_array( $offset, array( 'line_subtotal', 'line_subtotal_tax', 'line_total', 'line_tax', 'line_tax_data', 'item_meta_array', 'item_meta' ) ) ) {
|
||||
return true;
|
||||
public function set_product_id( $value ) {
|
||||
if ( $value > 0 && 'product' !== get_post_type( absint( $value ) ) ) {
|
||||
$this->error( 'order_item_product_invalid_product_id', __( 'Invalid product ID', 'woocommerce' ) );
|
||||
}
|
||||
return parent::offsetExists( $offset );
|
||||
$this->set_prop( 'product_id', absint( $value ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Read/populate data properties specific to this order item.
|
||||
* Set variation ID.
|
||||
*
|
||||
* @param int $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function read( $id ) {
|
||||
parent::read( $id );
|
||||
|
||||
if ( ! $this->get_id() ) {
|
||||
return;
|
||||
public function set_variation_id( $value ) {
|
||||
if ( $value > 0 && 'product_variation' !== get_post_type( $value ) ) {
|
||||
$this->error( 'order_item_product_invalid_variation_id', __( 'Invalid variation ID', 'woocommerce' ) );
|
||||
}
|
||||
|
||||
$this->set_props( array(
|
||||
'product_id' => get_metadata( 'order_item', $this->get_id(), '_product_id', true ),
|
||||
'variation_id' => get_metadata( 'order_item', $this->get_id(), '_variation_id', true ),
|
||||
'quantity' => get_metadata( 'order_item', $this->get_id(), '_qty', true ),
|
||||
'tax_class' => get_metadata( 'order_item', $this->get_id(), '_tax_class', true ),
|
||||
'subtotal' => get_metadata( 'order_item', $this->get_id(), '_line_subtotal', true ),
|
||||
'total' => get_metadata( 'order_item', $this->get_id(), '_line_total', true ),
|
||||
'taxes' => get_metadata( 'order_item', $this->get_id(), '_line_tax_data', true ),
|
||||
) );
|
||||
$this->set_prop( 'variation_id', absint( $value ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Save properties specific to this order item.
|
||||
* Line subtotal (before discounts).
|
||||
*
|
||||
* @return int Item ID
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function save() {
|
||||
parent::save();
|
||||
if ( $this->get_id() ) {
|
||||
wc_update_order_item_meta( $this->get_id(), '_product_id', $this->get_product_id() );
|
||||
wc_update_order_item_meta( $this->get_id(), '_variation_id', $this->get_variation_id() );
|
||||
wc_update_order_item_meta( $this->get_id(), '_qty', $this->get_quantity() );
|
||||
wc_update_order_item_meta( $this->get_id(), '_tax_class', $this->get_tax_class() );
|
||||
wc_update_order_item_meta( $this->get_id(), '_line_subtotal', $this->get_subtotal() );
|
||||
wc_update_order_item_meta( $this->get_id(), '_line_subtotal_tax', $this->get_subtotal_tax() );
|
||||
wc_update_order_item_meta( $this->get_id(), '_line_total', $this->get_total() );
|
||||
wc_update_order_item_meta( $this->get_id(), '_line_tax', $this->get_total_tax() );
|
||||
wc_update_order_item_meta( $this->get_id(), '_line_tax_data', $this->get_taxes() );
|
||||
}
|
||||
|
||||
return $this->get_id();
|
||||
public function set_subtotal( $value ) {
|
||||
$this->set_prop( 'subtotal', wc_format_decimal( $value ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal meta keys we don't want exposed as part of meta_data.
|
||||
* Line total (after discounts).
|
||||
*
|
||||
* @return array()
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
protected function get_internal_meta_keys() {
|
||||
return array( '_product_id', '_variation_id', '_qty', '_tax_class', '_line_subtotal', '_line_subtotal_tax', '_line_total', '_line_tax', '_line_tax_data' );
|
||||
public function set_total( $value ) {
|
||||
$this->set_prop( 'total', wc_format_decimal( $value ) );
|
||||
|
||||
// Subtotal cannot be less than total
|
||||
if ( ! $this->get_subtotal() || $this->get_subtotal() < $this->get_total() ) {
|
||||
$this->set_subtotal( $value );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Line subtotal tax (before discounts).
|
||||
*
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_subtotal_tax( $value ) {
|
||||
$this->set_prop( 'subtotal_tax', wc_format_decimal( $value ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Line total tax (after discounts).
|
||||
*
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_total_tax( $value ) {
|
||||
$this->set_prop( 'total_tax', wc_format_decimal( $value ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set line taxes and totals for passed in taxes.
|
||||
*
|
||||
* @param array $raw_tax_data
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_taxes( $raw_tax_data ) {
|
||||
$raw_tax_data = maybe_unserialize( $raw_tax_data );
|
||||
$tax_data = array(
|
||||
'total' => array(),
|
||||
'subtotal' => array(),
|
||||
);
|
||||
if ( ! empty( $raw_tax_data['total'] ) && ! empty( $raw_tax_data['subtotal'] ) ) {
|
||||
$tax_data['subtotal'] = array_map( 'wc_format_decimal', $raw_tax_data['subtotal'] );
|
||||
$tax_data['total'] = array_map( 'wc_format_decimal', $raw_tax_data['total'] );
|
||||
|
||||
// Subtotal cannot be less than total!
|
||||
if ( array_sum( $tax_data['subtotal'] ) < array_sum( $tax_data['total'] ) ) {
|
||||
$tax_data['subtotal'] = $tax_data['total'];
|
||||
}
|
||||
}
|
||||
$this->set_prop( 'taxes', $tax_data );
|
||||
$this->set_total_tax( array_sum( $tax_data['total'] ) );
|
||||
$this->set_subtotal_tax( array_sum( $tax_data['subtotal'] ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set variation data (stored as meta data - write only).
|
||||
*
|
||||
* @param array $data Key/Value pairs
|
||||
*/
|
||||
public function set_variation( $data ) {
|
||||
foreach ( $data as $key => $value ) {
|
||||
$this->add_meta_data( str_replace( 'attribute_', '', $key ), $value, true );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set properties based on passed in product object.
|
||||
*
|
||||
* @param WC_Product $product
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_product( $product ) {
|
||||
if ( ! is_a( $product, 'WC_Product' ) ) {
|
||||
$this->error( 'order_item_product_invalid_product', __( 'Invalid product', 'woocommerce' ) );
|
||||
}
|
||||
if ( $product->is_type( 'variation' ) ) {
|
||||
$this->set_product_id( $product->get_parent_id() );
|
||||
$this->set_variation_id( $product->get_id() );
|
||||
$this->set_variation( is_callable( array( $product, 'get_variation_attributes' ) ) ? $product->get_variation_attributes() : array() );
|
||||
} else {
|
||||
$this->set_product_id( $product->get_id() );
|
||||
}
|
||||
$this->set_name( $product->get_name() );
|
||||
$this->set_tax_class( $product->get_tax_class() );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set meta data for backordered products.
|
||||
*/
|
||||
public function set_backorder_meta() {
|
||||
if ( $this->get_product()->backorders_require_notification() && $this->get_product()->is_on_backorder( $this->get_quantity() ) ) {
|
||||
$this->add_meta_data( apply_filters( 'woocommerce_backordered_item_meta_name', __( 'Backordered', 'woocommerce' ) ), $this->get_quantity() - max( 0, $this->get_product()->get_stock_quantity() ), true );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Getters
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Get order item type.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_type() {
|
||||
return 'line_item';
|
||||
}
|
||||
|
||||
/**
|
||||
* Get product ID.
|
||||
*
|
||||
* @param string $context
|
||||
* @return int
|
||||
*/
|
||||
public function get_product_id( $context = 'view' ) {
|
||||
return $this->get_prop( 'product_id', $context );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get variation ID.
|
||||
*
|
||||
* @param string $context
|
||||
* @return int
|
||||
*/
|
||||
public function get_variation_id( $context = 'view' ) {
|
||||
return $this->get_prop( 'variation_id', $context );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get quantity.
|
||||
*
|
||||
* @param string $context
|
||||
* @return int
|
||||
*/
|
||||
public function get_quantity( $context = 'view' ) {
|
||||
return $this->get_prop( 'quantity', $context );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get tax class.
|
||||
*
|
||||
* @param string $context
|
||||
* @return string
|
||||
*/
|
||||
public function get_tax_class( $context = 'view' ) {
|
||||
return $this->get_prop( 'tax_class', $context );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get subtotal.
|
||||
*
|
||||
* @param string $context
|
||||
* @return string
|
||||
*/
|
||||
public function get_subtotal( $context = 'view' ) {
|
||||
return $this->get_prop( 'subtotal', $context );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get subtotal tax.
|
||||
*
|
||||
* @param string $context
|
||||
* @return string
|
||||
*/
|
||||
public function get_subtotal_tax( $context = 'view' ) {
|
||||
return $this->get_prop( 'subtotal_tax', $context );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get total.
|
||||
*
|
||||
* @param string $context
|
||||
* @return string
|
||||
*/
|
||||
public function get_total( $context = 'view' ) {
|
||||
return $this->get_prop( 'total', $context );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get total tax.
|
||||
*
|
||||
* @param string $context
|
||||
* @return string
|
||||
*/
|
||||
public function get_total_tax( $context = 'view' ) {
|
||||
return $this->get_prop( 'total_tax', $context );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get fee taxes.
|
||||
*
|
||||
* @param string $context
|
||||
* @return array
|
||||
*/
|
||||
public function get_taxes( $context = 'view' ) {
|
||||
return $this->get_prop( 'taxes', $context );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the associated product.
|
||||
*
|
||||
* @param string $context
|
||||
* @return WC_Product|bool
|
||||
*/
|
||||
public function get_product() {
|
||||
|
@ -217,7 +381,6 @@ class WC_Order_Item_Product extends WC_Order_Item {
|
|||
|
||||
/**
|
||||
* Get tax status.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_tax_status() {
|
||||
|
@ -225,269 +388,78 @@ class WC_Order_Item_Product extends WC_Order_Item {
|
|||
return $product ? $product->get_tax_status() : 'taxable';
|
||||
}
|
||||
|
||||
/**
|
||||
* Set meta data for backordered products.
|
||||
*/
|
||||
public function set_backorder_meta() {
|
||||
if ( $this->get_product()->backorders_require_notification() && $this->get_product()->is_on_backorder( $this->get_quantity() ) ) {
|
||||
$this->add_meta_data( apply_filters( 'woocommerce_backordered_item_meta_name', __( 'Backordered', 'woocommerce' ) ), $this->get_quantity() - max( 0, $this->get_product()->get_stock_quantity() ), true );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Setters
|
||||
| Array Access Methods
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| For backwards compat with legacy arrays.
|
||||
|
|
||||
*/
|
||||
|
||||
/**
|
||||
* Set quantity.
|
||||
* offsetGet for ArrayAccess/Backwards compatibility.
|
||||
*
|
||||
* @param int $value
|
||||
* @throws WC_Data_Exception
|
||||
* @deprecated Add deprecation notices in future release.
|
||||
* @param string $offset
|
||||
* @return mixed
|
||||
*/
|
||||
public function set_quantity( $value ) {
|
||||
if ( 0 > $value ) {
|
||||
$this->error( 'order_item_product_invalid_quantity', __( 'Quantity must be positive', 'woocommerce' ) );
|
||||
public function offsetGet( $offset ) {
|
||||
if ( 'line_subtotal' === $offset ) {
|
||||
$offset = 'subtotal';
|
||||
} elseif ( 'line_subtotal_tax' === $offset ) {
|
||||
$offset = 'subtotal_tax';
|
||||
} elseif ( 'line_total' === $offset ) {
|
||||
$offset = 'total';
|
||||
} elseif ( 'line_tax' === $offset ) {
|
||||
$offset = 'total_tax';
|
||||
} elseif ( 'line_tax_data' === $offset ) {
|
||||
$offset = 'taxes';
|
||||
}
|
||||
$this->_data['quantity'] = wc_stock_amount( $value );
|
||||
return parent::offsetGet( $offset );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set tax class.
|
||||
* offsetSet for ArrayAccess/Backwards compatibility.
|
||||
*
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
* @deprecated Add deprecation notices in future release.
|
||||
* @param string $offset
|
||||
* @param mixed $value
|
||||
*/
|
||||
public function set_tax_class( $value ) {
|
||||
if ( $value && ! in_array( $value, WC_Tax::get_tax_classes() ) ) {
|
||||
$this->error( 'order_item_product_invalid_tax_class', __( 'Invalid tax class', 'woocommerce' ) );
|
||||
public function offsetSet( $offset, $value ) {
|
||||
if ( 'line_subtotal' === $offset ) {
|
||||
$offset = 'subtotal';
|
||||
} elseif ( 'line_subtotal_tax' === $offset ) {
|
||||
$offset = 'subtotal_tax';
|
||||
} elseif ( 'line_total' === $offset ) {
|
||||
$offset = 'total';
|
||||
} elseif ( 'line_tax' === $offset ) {
|
||||
$offset = 'total_tax';
|
||||
} elseif ( 'line_tax_data' === $offset ) {
|
||||
$offset = 'taxes';
|
||||
}
|
||||
$this->_data['tax_class'] = $value;
|
||||
parent::offsetSet( $offset, $value );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set Product ID.
|
||||
* offsetExists for ArrayAccess
|
||||
*
|
||||
* @param int $value
|
||||
* @throws WC_Data_Exception
|
||||
* @param string $offset
|
||||
* @return bool
|
||||
*/
|
||||
public function set_product_id( $value ) {
|
||||
if ( $value > 0 && 'product' !== get_post_type( absint( $value ) ) ) {
|
||||
$this->error( 'order_item_product_invalid_product_id', __( 'Invalid product ID', 'woocommerce' ) );
|
||||
public function offsetExists( $offset ) {
|
||||
if ( in_array( $offset, array( 'line_subtotal', 'line_subtotal_tax', 'line_total', 'line_tax', 'line_tax_data', 'item_meta_array', 'item_meta' ) ) ) {
|
||||
return true;
|
||||
}
|
||||
$this->_data['product_id'] = absint( $value );
|
||||
return parent::offsetExists( $offset );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set variation ID.
|
||||
*
|
||||
* @param int $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_variation_id( $value ) {
|
||||
if ( $value > 0 && 'product_variation' !== get_post_type( $value ) ) {
|
||||
$this->error( 'order_item_product_invalid_variation_id', __( 'Invalid variation ID', 'woocommerce' ) );
|
||||
}
|
||||
$this->_data['variation_id'] = absint( $value );
|
||||
}
|
||||
|
||||
/**
|
||||
* Line subtotal (before discounts).
|
||||
*
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_subtotal( $value ) {
|
||||
$this->_data['subtotal'] = wc_format_decimal( $value );
|
||||
}
|
||||
|
||||
/**
|
||||
* Line total (after discounts).
|
||||
*
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_total( $value ) {
|
||||
$this->_data['total'] = wc_format_decimal( $value );
|
||||
|
||||
// Subtotal cannot be less than total
|
||||
if ( ! $this->get_subtotal() || $this->get_subtotal() < $this->get_total() ) {
|
||||
$this->set_subtotal( $value );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Line subtotal tax (before discounts).
|
||||
*
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
protected function set_subtotal_tax( $value ) {
|
||||
$this->_data['subtotal_tax'] = wc_format_decimal( $value );
|
||||
}
|
||||
|
||||
/**
|
||||
* Line total tax (after discounts).
|
||||
*
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
protected function set_total_tax( $value ) {
|
||||
$this->_data['total_tax'] = wc_format_decimal( $value );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set line taxes and totals for passed in taxes.
|
||||
*
|
||||
* @param array $raw_tax_data
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_taxes( $raw_tax_data ) {
|
||||
$raw_tax_data = maybe_unserialize( $raw_tax_data );
|
||||
$tax_data = array(
|
||||
'total' => array(),
|
||||
'subtotal' => array(),
|
||||
);
|
||||
if ( ! empty( $raw_tax_data['total'] ) && ! empty( $raw_tax_data['subtotal'] ) ) {
|
||||
$tax_data['subtotal'] = array_map( 'wc_format_decimal', $raw_tax_data['subtotal'] );
|
||||
$tax_data['total'] = array_map( 'wc_format_decimal', $raw_tax_data['total'] );
|
||||
|
||||
// Subtotal cannot be less than total!
|
||||
if ( array_sum( $tax_data['subtotal'] ) < array_sum( $tax_data['total'] ) ) {
|
||||
$tax_data['subtotal'] = $tax_data['total'];
|
||||
}
|
||||
}
|
||||
$this->_data['taxes'] = $tax_data;
|
||||
$this->set_total_tax( array_sum( $tax_data['total'] ) );
|
||||
$this->set_subtotal_tax( array_sum( $tax_data['subtotal'] ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set variation data (stored as meta data - write only).
|
||||
*
|
||||
* @param array $data Key/Value pairs
|
||||
*/
|
||||
public function set_variation( $data ) {
|
||||
foreach ( $data as $key => $value ) {
|
||||
$this->add_meta_data( str_replace( 'attribute_', '', $key ), $value, true );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Set properties based on passed in product object.
|
||||
*
|
||||
* @param WC_Product $product
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_product( $product ) {
|
||||
if ( ! is_a( $product, 'WC_Product' ) ) {
|
||||
$this->error( 'order_item_product_invalid_product', __( 'Invalid product', 'woocommerce' ) );
|
||||
}
|
||||
if ( $product->is_type( 'variation' ) ) {
|
||||
$this->set_product_id( $product->get_parent_id() );
|
||||
$this->set_variation_id( $product->get_id() );
|
||||
$this->set_variation( is_callable( array( $product, 'get_variation_attributes' ) ) ? $product->get_variation_attributes() : array() );
|
||||
} else {
|
||||
$this->set_product_id( $product->get_id() );
|
||||
}
|
||||
$this->set_name( $product->get_name() );
|
||||
$this->set_tax_class( $product->get_tax_class() );
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Getters
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Get order item type.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_type() {
|
||||
return 'line_item';
|
||||
}
|
||||
|
||||
/**
|
||||
* Get product ID.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function get_product_id() {
|
||||
return absint( $this->_data['product_id'] );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get variation ID.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function get_variation_id() {
|
||||
return absint( $this->_data['variation_id'] );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get quantity.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function get_quantity() {
|
||||
return wc_stock_amount( $this->_data['quantity'] );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get tax class.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_tax_class() {
|
||||
return $this->_data['tax_class'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get subtotal.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_subtotal() {
|
||||
return wc_format_decimal( $this->_data['subtotal'] );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get subtotal tax.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_subtotal_tax() {
|
||||
return wc_format_decimal( $this->_data['subtotal_tax'] );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get total.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_total() {
|
||||
return wc_format_decimal( $this->_data['total'] );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get total tax.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_total_tax() {
|
||||
return wc_format_decimal( $this->_data['total_tax'] );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get fee taxes.
|
||||
* Internal meta keys we don't want exposed as part of meta_data.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function get_taxes() {
|
||||
return $this->_data['taxes'];
|
||||
protected function get_internal_meta_keys() {
|
||||
return array( '_product_id', '_variation_id', '_qty', '_tax_class', '_line_subtotal', '_line_subtotal_tax', '_line_total', '_line_tax', '_line_tax_data' );
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,9 +18,7 @@ class WC_Order_Item_Shipping extends WC_Order_Item {
|
|||
* @since 2.7.0
|
||||
* @var array
|
||||
*/
|
||||
protected $_data = array(
|
||||
'order_id' => 0,
|
||||
'id' => 0,
|
||||
protected $extra_data = array(
|
||||
'method_title' => '',
|
||||
'method_id' => '',
|
||||
'total' => 0,
|
||||
|
@ -30,6 +28,184 @@ class WC_Order_Item_Shipping extends WC_Order_Item {
|
|||
),
|
||||
);
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Setters
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Set order item name.
|
||||
*
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_name( $value ) {
|
||||
$this->set_method_title( $value );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set method title.
|
||||
*
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_method_title( $value ) {
|
||||
$this->set_prop( 'method_title', wc_clean( $value ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set shipping method id.
|
||||
*
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_method_id( $value ) {
|
||||
$this->set_prop( 'method_id', wc_clean( $value ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set total.
|
||||
*
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_total( $value ) {
|
||||
$this->set_prop( 'total', wc_format_decimal( $value ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set total tax.
|
||||
*
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
protected function set_total_tax( $value ) {
|
||||
$this->set_prop( 'total_tax', wc_format_decimal( $value ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set taxes.
|
||||
*
|
||||
* This is an array of tax ID keys with total amount values.
|
||||
* @param array $raw_tax_data
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_taxes( $raw_tax_data ) {
|
||||
$raw_tax_data = maybe_unserialize( $raw_tax_data );
|
||||
$tax_data = array(
|
||||
'total' => array(),
|
||||
);
|
||||
if ( ! empty( $raw_tax_data['total'] ) ) {
|
||||
$tax_data['total'] = array_map( 'wc_format_decimal', $raw_tax_data['total'] );
|
||||
}
|
||||
$this->set_prop( 'taxes', $tax_data );
|
||||
$this->set_total_tax( array_sum( $tax_data['total'] ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set properties based on passed in shipping rate object.
|
||||
*
|
||||
* @param WC_Shipping_Rate $tax_rate_id
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_shipping_rate( $shipping_rate ) {
|
||||
$this->set_method_title( $shipping_rate->label );
|
||||
$this->set_method_id( $shipping_rate->id );
|
||||
$this->set_total( $shipping_rate->cost );
|
||||
$this->set_taxes( $shipping_rate->taxes );
|
||||
$this->set_meta_data( $shipping_rate->get_meta_data() );
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Getters
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Get order item type.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_type() {
|
||||
return 'shipping';
|
||||
}
|
||||
|
||||
/**
|
||||
* Get order item name.
|
||||
*
|
||||
* @param string $context
|
||||
* @return string
|
||||
*/
|
||||
public function get_name( $context = 'view' ) {
|
||||
return $this->get_method_title( $context );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get title.
|
||||
*
|
||||
* @param string $context
|
||||
* @return string
|
||||
*/
|
||||
public function get_method_title( $context = 'view' ) {
|
||||
$method_title = $this->get_prop( 'method_title', $context );
|
||||
if ( 'view' === $context ) {
|
||||
return $method_title ? $method_title : __( 'Shipping', 'woocommerce' );
|
||||
} else {
|
||||
return $method_title;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get method ID.
|
||||
*
|
||||
* @param string $context
|
||||
* @return string
|
||||
*/
|
||||
public function get_method_id( $context = 'view' ) {
|
||||
return $this->get_prop( 'method_id', $context );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get total cost.
|
||||
*
|
||||
* @param string $context
|
||||
* @return string
|
||||
*/
|
||||
public function get_total( $context = 'view' ) {
|
||||
return $this->get_prop( 'total', $context );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get total tax.
|
||||
*
|
||||
* @param string $context
|
||||
* @return string
|
||||
*/
|
||||
public function get_total_tax( $context = 'view' ) {
|
||||
return $this->get_prop( 'total_tax', $context );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get taxes.
|
||||
*
|
||||
* @param string $context
|
||||
* @return array
|
||||
*/
|
||||
public function get_taxes( $context = 'view' ) {
|
||||
return $this->get_prop( 'taxes', $context );
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Array Access Methods
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| For backwards compat with legacy arrays.
|
||||
|
|
||||
*/
|
||||
|
||||
/**
|
||||
* offsetGet for ArrayAccess/Backwards compatibility.
|
||||
* @deprecated Add deprecation notices in future release.
|
||||
|
@ -68,39 +244,6 @@ class WC_Order_Item_Shipping extends WC_Order_Item {
|
|||
return parent::offsetExists( $offset );
|
||||
}
|
||||
|
||||
/**
|
||||
* Read/populate data properties specific to this order item.
|
||||
*/
|
||||
public function read( $id ) {
|
||||
parent::read( $id );
|
||||
|
||||
if ( ! $this->get_id() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->set_props( array(
|
||||
'method_id' => get_metadata( 'order_item', $this->get_id(), 'method_id', true ),
|
||||
'total' => get_metadata( 'order_item', $this->get_id(), 'cost', true ),
|
||||
'taxes' => get_metadata( 'order_item', $this->get_id(), 'taxes', true ),
|
||||
) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Save properties specific to this order item.
|
||||
* @return int Item ID
|
||||
*/
|
||||
public function save() {
|
||||
parent::save();
|
||||
if ( $this->get_id() ) {
|
||||
wc_update_order_item_meta( $this->get_id(), 'method_id', $this->get_method_id() );
|
||||
wc_update_order_item_meta( $this->get_id(), 'cost', $this->get_total() );
|
||||
wc_update_order_item_meta( $this->get_id(), 'total_tax', $this->get_total_tax() );
|
||||
wc_update_order_item_meta( $this->get_id(), 'taxes', $this->get_taxes() );
|
||||
}
|
||||
|
||||
return $this->get_id();
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal meta keys we don't want exposed as part of meta_data.
|
||||
* @return array()
|
||||
|
@ -108,149 +251,4 @@ class WC_Order_Item_Shipping extends WC_Order_Item {
|
|||
protected function get_internal_meta_keys() {
|
||||
return array( 'method_id', 'cost', 'total_tax', 'taxes' );
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Setters
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Set order item name.
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_name( $value ) {
|
||||
$this->set_method_title( $value );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set code.
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_method_title( $value ) {
|
||||
$this->_data['method_title'] = wc_clean( $value );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set shipping method id.
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_method_id( $value ) {
|
||||
$this->_data['method_id'] = wc_clean( $value );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set total.
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_total( $value ) {
|
||||
$this->_data['total'] = wc_format_decimal( $value );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set total tax.
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
protected function set_total_tax( $value ) {
|
||||
$this->_data['total_tax'] = wc_format_decimal( $value );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set taxes.
|
||||
*
|
||||
* This is an array of tax ID keys with total amount values.
|
||||
* @param array $raw_tax_data
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_taxes( $raw_tax_data ) {
|
||||
$raw_tax_data = maybe_unserialize( $raw_tax_data );
|
||||
$tax_data = array(
|
||||
'total' => array(),
|
||||
);
|
||||
if ( ! empty( $raw_tax_data['total'] ) ) {
|
||||
$tax_data['total'] = array_map( 'wc_format_decimal', $raw_tax_data['total'] );
|
||||
}
|
||||
$this->_data['taxes'] = $tax_data;
|
||||
$this->set_total_tax( array_sum( $tax_data['total'] ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set properties based on passed in shipping rate object.
|
||||
* @param WC_Shipping_Rate $tax_rate_id
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_shipping_rate( $shipping_rate ) {
|
||||
$this->set_method_title( $shipping_rate->label );
|
||||
$this->set_method_id( $shipping_rate->id );
|
||||
$this->set_total( $shipping_rate->cost );
|
||||
$this->set_taxes( $shipping_rate->taxes );
|
||||
$this->set_meta_data( $shipping_rate->get_meta_data() );
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Getters
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Get order item type.
|
||||
* @return string
|
||||
*/
|
||||
public function get_type() {
|
||||
return 'shipping';
|
||||
}
|
||||
|
||||
/**
|
||||
* Get order item name.
|
||||
* @return string
|
||||
*/
|
||||
public function get_name() {
|
||||
return $this->get_method_title();
|
||||
}
|
||||
|
||||
/**
|
||||
* Get title.
|
||||
* @return string
|
||||
*/
|
||||
public function get_method_title() {
|
||||
return $this->_data['method_title'] ? $this->_data['method_title'] : __( 'Shipping', 'woocommerce' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get method ID.
|
||||
* @return string
|
||||
*/
|
||||
public function get_method_id() {
|
||||
return $this->_data['method_id'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get total cost.
|
||||
* @return string
|
||||
*/
|
||||
public function get_total() {
|
||||
return wc_format_decimal( $this->_data['total'] );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get total tax.
|
||||
* @return string
|
||||
*/
|
||||
public function get_total_tax() {
|
||||
return wc_format_decimal( $this->_data['total_tax'] );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get taxes.
|
||||
* @return array
|
||||
*/
|
||||
public function get_taxes() {
|
||||
return $this->_data['taxes'];
|
||||
}
|
||||
}
|
||||
|
|
|
@ -18,9 +18,7 @@ class WC_Order_Item_Tax extends WC_Order_Item {
|
|||
* @since 2.7.0
|
||||
* @var array
|
||||
*/
|
||||
protected $_data = array(
|
||||
'order_id' => 0,
|
||||
'id' => 0,
|
||||
protected $extra_data = array(
|
||||
'rate_code' => '',
|
||||
'rate_id' => 0,
|
||||
'label' => '',
|
||||
|
@ -29,58 +27,6 @@ class WC_Order_Item_Tax extends WC_Order_Item {
|
|||
'shipping_tax_total' => 0,
|
||||
);
|
||||
|
||||
/**
|
||||
* Read/populate data properties specific to this order item.
|
||||
*/
|
||||
public function read( $id ) {
|
||||
parent::read( $id );
|
||||
|
||||
if ( ! $this->get_id() ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->set_props( array(
|
||||
'rate_id' => get_metadata( 'order_item', $this->get_id(), 'rate_id', true ),
|
||||
'label' => get_metadata( 'order_item', $this->get_id(), 'label', true ),
|
||||
'compound' => get_metadata( 'order_item', $this->get_id(), 'compound', true ),
|
||||
'tax_total' => get_metadata( 'order_item', $this->get_id(), 'tax_amount', true ),
|
||||
'shipping_tax_total' => get_metadata( 'order_item', $this->get_id(), 'shipping_tax_amount', true ),
|
||||
) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Save properties specific to this order item.
|
||||
* @return int Item ID
|
||||
*/
|
||||
public function save() {
|
||||
parent::save();
|
||||
if ( $this->get_id() ) {
|
||||
wc_update_order_item_meta( $this->get_id(), 'rate_id', $this->get_rate_id() );
|
||||
wc_update_order_item_meta( $this->get_id(), 'label', $this->get_label() );
|
||||
wc_update_order_item_meta( $this->get_id(), 'compound', $this->get_compound() );
|
||||
wc_update_order_item_meta( $this->get_id(), 'tax_amount', $this->get_tax_total() );
|
||||
wc_update_order_item_meta( $this->get_id(), 'shipping_tax_amount', $this->get_shipping_tax_total() );
|
||||
}
|
||||
|
||||
return $this->get_id();
|
||||
}
|
||||
|
||||
/**
|
||||
* Internal meta keys we don't want exposed as part of meta_data.
|
||||
* @return array()
|
||||
*/
|
||||
protected function get_internal_meta_keys() {
|
||||
return array( 'rate_id', 'label', 'compound', 'tax_amount', 'shipping_tax_amount' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Is this a compound tax rate?
|
||||
* @return boolean
|
||||
*/
|
||||
public function is_compound() {
|
||||
return $this->get_compound();
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Setters
|
||||
|
@ -89,6 +35,7 @@ class WC_Order_Item_Tax extends WC_Order_Item {
|
|||
|
||||
/**
|
||||
* Set order item name.
|
||||
*
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
|
@ -98,11 +45,12 @@ class WC_Order_Item_Tax extends WC_Order_Item {
|
|||
|
||||
/**
|
||||
* Set item name.
|
||||
*
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_rate_code( $value ) {
|
||||
$this->_data['rate_code'] = wc_clean( $value );
|
||||
$this->set_prop( 'rate_code', wc_clean( $value ) );
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -111,7 +59,7 @@ class WC_Order_Item_Tax extends WC_Order_Item {
|
|||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_label( $value ) {
|
||||
$this->_data['label'] = wc_clean( $value );
|
||||
$this->set_prop( 'label', wc_clean( $value ) );
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -120,7 +68,7 @@ class WC_Order_Item_Tax extends WC_Order_Item {
|
|||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_rate_id( $value ) {
|
||||
$this->_data['rate_id'] = absint( $value );
|
||||
$this->set_prop( 'rate_id', absint( $value ) );
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -129,7 +77,7 @@ class WC_Order_Item_Tax extends WC_Order_Item {
|
|||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_tax_total( $value ) {
|
||||
$this->_data['tax_total'] = wc_format_decimal( $value );
|
||||
$this->set_prop( 'tax_total', wc_format_decimal( $value ) );
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -138,7 +86,7 @@ class WC_Order_Item_Tax extends WC_Order_Item {
|
|||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_shipping_tax_total( $value ) {
|
||||
$this->_data['shipping_tax_total'] = wc_format_decimal( $value );
|
||||
$this->set_prop( 'shipping_tax_total', wc_format_decimal( $value ) );
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -147,7 +95,7 @@ class WC_Order_Item_Tax extends WC_Order_Item {
|
|||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_compound( $value ) {
|
||||
$this->_data['compound'] = (bool) $value;
|
||||
$this->set_prop( 'compound', (bool) $value );
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -170,6 +118,7 @@ class WC_Order_Item_Tax extends WC_Order_Item {
|
|||
|
||||
/**
|
||||
* Get order item type.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_type() {
|
||||
|
@ -178,57 +127,98 @@ class WC_Order_Item_Tax extends WC_Order_Item {
|
|||
|
||||
/**
|
||||
* Get rate code/name.
|
||||
*
|
||||
* @param string $context
|
||||
* @return string
|
||||
*/
|
||||
public function get_name() {
|
||||
return $this->get_rate_code();
|
||||
public function get_name( $context = 'view' ) {
|
||||
return $this->get_rate_code( $context );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get rate code/name.
|
||||
*
|
||||
* @param string $context
|
||||
* @return string
|
||||
*/
|
||||
public function get_rate_code() {
|
||||
return $this->_data['rate_code'];
|
||||
public function get_rate_code( $context = 'view' ) {
|
||||
return $this->get_prop( 'rate_code', $context );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get label.
|
||||
*
|
||||
* @param string $context
|
||||
* @return string
|
||||
*/
|
||||
public function get_label() {
|
||||
return $this->_data['label'] ? $this->_data['label'] : __( 'Tax', 'woocommerce' );
|
||||
public function get_label( $context = 'view' ) {
|
||||
$label = $this->get_prop( 'label', $context );
|
||||
if ( 'view' === $context ) {
|
||||
return $label ? $label : __( 'Tax', 'woocommerce' );
|
||||
} else {
|
||||
return $label;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get tax rate ID.
|
||||
*
|
||||
* @param string $context
|
||||
* @return int
|
||||
*/
|
||||
public function get_rate_id() {
|
||||
return absint( $this->_data['rate_id'] );
|
||||
public function get_rate_id( $context = 'view' ) {
|
||||
return $this->get_prop( 'rate_id', $context );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get tax_total
|
||||
*
|
||||
* @param string $context
|
||||
* @return string
|
||||
*/
|
||||
public function get_tax_total() {
|
||||
return wc_format_decimal( $this->_data['tax_total'] );
|
||||
public function get_tax_total( $context = 'view' ) {
|
||||
return $this->get_prop( 'tax_total', $context );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get shipping_tax_total
|
||||
*
|
||||
* @param string $context
|
||||
* @return string
|
||||
*/
|
||||
public function get_shipping_tax_total() {
|
||||
return wc_format_decimal( $this->_data['shipping_tax_total'] );
|
||||
public function get_shipping_tax_total( $context = 'view' ) {
|
||||
return $this->get_prop( 'shipping_tax_total', $context );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get compound.
|
||||
*
|
||||
* @param string $context
|
||||
* @return bool
|
||||
*/
|
||||
public function get_compound() {
|
||||
return (bool) $this->_data['compound'];
|
||||
public function get_compound( $context = 'view' ) {
|
||||
return $this->get_prop( 'compound', $context );
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Other
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Internal meta keys we don't want exposed as part of meta_data.
|
||||
* @return array()
|
||||
*/
|
||||
protected function get_internal_meta_keys() {
|
||||
return array( 'rate_id', 'label', 'compound', 'tax_amount', 'shipping_tax_amount' );
|
||||
}
|
||||
|
||||
/**
|
||||
* Is this a compound tax rate?
|
||||
* @return boolean
|
||||
*/
|
||||
public function is_compound() {
|
||||
return $this->get_compound();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,7 +24,6 @@ class WC_Order_Item extends WC_Data implements ArrayAccess {
|
|||
protected $data = array(
|
||||
'order_id' => 0,
|
||||
'name' => '',
|
||||
'type' => '',
|
||||
);
|
||||
|
||||
/**
|
||||
|
@ -49,29 +48,60 @@ class WC_Order_Item extends WC_Data implements ArrayAccess {
|
|||
|
||||
/**
|
||||
* Constructor.
|
||||
* @param int|object|array $read ID to load from the DB (optional) or already queried data.
|
||||
* @param int|object|array $item ID to load from the DB, or WC_Order_Item Object
|
||||
*/
|
||||
public function __construct( $read = 0 ) {
|
||||
parent::__construct( $read );
|
||||
public function __construct( $item = 0 ) {
|
||||
$this->data = array_merge( $this->data, $this->extra_data );
|
||||
parent::__construct( $item );
|
||||
|
||||
if ( $read instanceof WC_Order_Item ) {
|
||||
if ( $this->is_type( $read->get_type() ) ) {
|
||||
$this->set_props( $read->get_data() );
|
||||
}
|
||||
} elseif ( is_array( $read ) ) {
|
||||
$this->set_props( $read );
|
||||
if ( $item instanceof WC_Order_Item ) {
|
||||
$this->set_id( $item->get_id() );
|
||||
} elseif ( is_numeric( $item ) && $item > 0 ) {
|
||||
$this->set_id( $item );
|
||||
} else {
|
||||
$this->read( $read );
|
||||
$this->set_object_read( true );
|
||||
}
|
||||
|
||||
$type = 'line_item' === $this->get_type() ? 'product' : $this->get_type();
|
||||
$this->data_store = WC_Data_Store::load( 'order-item-' . $type );
|
||||
if ( $this->get_id() > 0 ) {
|
||||
$this->data_store->read( $this );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Getters
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Type checking
|
||||
* @param string|array $Type
|
||||
* @return boolean
|
||||
* Get order ID this meta belongs to.
|
||||
*
|
||||
* @param string $context
|
||||
* @return int
|
||||
*/
|
||||
public function is_type( $type ) {
|
||||
return is_array( $type ) ? in_array( $this->get_type(), $type ) : $type === $this->get_type();
|
||||
public function get_order_id( $context = 'view' ) {
|
||||
return $this->get_prop( 'order_id', $context );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get order item name.
|
||||
*
|
||||
* @param string $context
|
||||
* @return string
|
||||
*/
|
||||
public function get_name( $context = 'view' ) {
|
||||
return $this->get_prop( 'name', $context );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get order item type. Overridden by child classes.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_type() {
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -93,36 +123,6 @@ class WC_Order_Item extends WC_Data implements ArrayAccess {
|
|||
return $this->order;
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Getters
|
||||
|--------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/**
|
||||
* Get order ID this meta belongs to.
|
||||
* @return int
|
||||
*/
|
||||
public function get_order_id() {
|
||||
return $this->data['order_id'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get order item name.
|
||||
* @return string
|
||||
*/
|
||||
public function get_name() {
|
||||
return $this->data['name'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get order item type.
|
||||
* @return string
|
||||
*/
|
||||
public function get_type() {
|
||||
return $this->data['type'];
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Setters
|
||||
|
@ -131,134 +131,55 @@ class WC_Order_Item extends WC_Data implements ArrayAccess {
|
|||
|
||||
/**
|
||||
* Set order ID.
|
||||
* @param int $value
|
||||
*
|
||||
* @param int $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_order_id( $value ) {
|
||||
$this->data['order_id'] = absint( $value );
|
||||
$this->set_prop( 'order_id', absint( $value ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set order item name.
|
||||
* @param string $value
|
||||
*
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
public function set_name( $value ) {
|
||||
$this->data['name'] = wc_clean( $value );
|
||||
}
|
||||
|
||||
/**
|
||||
* Set order item type.
|
||||
* @param string $value
|
||||
* @throws WC_Data_Exception
|
||||
*/
|
||||
protected function set_type( $value ) {
|
||||
$this->data['type'] = wc_clean( $value );
|
||||
$this->set_prop( 'name', wc_clean( $value ) );
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| CRUD methods
|
||||
| Other Methods
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Methods which create, read, update and delete data from the database.
|
||||
|
|
||||
*/
|
||||
|
||||
/**
|
||||
* Insert data into the database.
|
||||
* @since 2.7.0
|
||||
* Type checking
|
||||
* @param string|array $Type
|
||||
* @return boolean
|
||||
*/
|
||||
public function create() {
|
||||
global $wpdb;
|
||||
|
||||
$wpdb->insert( $wpdb->prefix . 'woocommerce_order_items', array(
|
||||
'order_item_name' => $this->get_name(),
|
||||
'order_item_type' => $this->get_type(),
|
||||
'order_id' => $this->get_order_id(),
|
||||
) );
|
||||
$this->set_id( $wpdb->insert_id );
|
||||
|
||||
do_action( 'woocommerce_new_order_item', $this->get_id(), $this, $this->get_order_id() );
|
||||
public function is_type( $type ) {
|
||||
return is_array( $type ) ? in_array( $this->get_type(), $type ) : $type === $this->get_type();
|
||||
}
|
||||
|
||||
/**
|
||||
* Update data in the database.
|
||||
* @since 2.7.0
|
||||
*/
|
||||
public function update() {
|
||||
global $wpdb;
|
||||
|
||||
$wpdb->update( $wpdb->prefix . 'woocommerce_order_items', array(
|
||||
'order_item_name' => $this->get_name(),
|
||||
'order_item_type' => $this->get_type(),
|
||||
'order_id' => $this->get_order_id(),
|
||||
), array( 'order_item_id' => $this->get_id() ) );
|
||||
|
||||
do_action( 'woocommerce_update_order_item', $this->get_id(), $this, $this->get_order_id() );
|
||||
}
|
||||
|
||||
/**
|
||||
* Read from the database.
|
||||
* @since 2.7.0
|
||||
* @param int|object $item ID of object to read, or already queried object.
|
||||
*/
|
||||
public function read( $item ) {
|
||||
global $wpdb;
|
||||
|
||||
$this->set_defaults();
|
||||
|
||||
if ( is_numeric( $item ) && ! empty( $item ) ) {
|
||||
$data = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}woocommerce_order_items WHERE order_item_id = %d LIMIT 1;", $item ) );
|
||||
} elseif ( ! empty( $item->order_item_id ) ) {
|
||||
$data = $item;
|
||||
} else {
|
||||
$data = false;
|
||||
}
|
||||
|
||||
if ( ! $data ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$this->set_id( $data->order_item_id );
|
||||
$this->set_props( array(
|
||||
'order_id' => $data->order_id,
|
||||
'name' => $data->order_item_name,
|
||||
'type' => $data->order_item_type,
|
||||
) );
|
||||
$this->read_meta_data();
|
||||
}
|
||||
|
||||
/**
|
||||
* Save data to the database.
|
||||
* @since 2.7.0
|
||||
* Save properties specific to this order item.
|
||||
* @return int Item ID
|
||||
*/
|
||||
public function save() {
|
||||
if ( ! $this->get_id() ) {
|
||||
$this->create();
|
||||
} else {
|
||||
$this->update();
|
||||
parent::save();
|
||||
|
||||
if ( $this->data_store ) {
|
||||
$this->data_store->save_item_data( $this );
|
||||
}
|
||||
$this->save_meta_data();
|
||||
|
||||
$this->apply_changes();
|
||||
|
||||
return $this->get_id();
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete data from the database.
|
||||
* @since 2.7.0
|
||||
*/
|
||||
public function delete( $force_delete = false ) {
|
||||
if ( $this->get_id() ) {
|
||||
global $wpdb;
|
||||
do_action( 'woocommerce_before_delete_order_item', $this->get_id() );
|
||||
$wpdb->delete( $wpdb->prefix . 'woocommerce_order_items', array( 'order_item_id' => $this->get_id() ) );
|
||||
$wpdb->delete( $wpdb->prefix . 'woocommerce_order_itemmeta', array( 'order_item_id' => $this->get_id() ) );
|
||||
do_action( 'woocommerce_delete_order_item', $this->get_id() );
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Meta Data Handling
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,93 @@
|
|||
<?php
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* WC Order Item Data Store
|
||||
*
|
||||
* @version 2.7.0
|
||||
* @category Class
|
||||
* @author WooCommerce
|
||||
*/
|
||||
abstract class Abstract_WC_Order_Item_Type_Data_Store implements WC_Object_Data_Store {
|
||||
/**
|
||||
* Create a new order item in the database.
|
||||
*
|
||||
* @since 2.7.0
|
||||
* @param WC_Order_Item $item
|
||||
*/
|
||||
public function create( &$item ) {
|
||||
global $wpdb;
|
||||
|
||||
$wpdb->insert( $wpdb->prefix . 'woocommerce_order_items', array(
|
||||
'order_item_name' => $item->get_name(),
|
||||
'order_item_type' => $item->get_type(),
|
||||
'order_id' => $item->get_order_id(),
|
||||
) );
|
||||
$item->set_id( $wpdb->insert_id );
|
||||
|
||||
do_action( 'woocommerce_new_order_item', $item->get_id(), $item, $item->get_order_id() );
|
||||
}
|
||||
|
||||
/**
|
||||
* Update a order item in the database.
|
||||
*
|
||||
* @since 2.7.0
|
||||
* @param WC_Order_Item $item
|
||||
*/
|
||||
public function update( &$item ) {
|
||||
global $wpdb;
|
||||
|
||||
$wpdb->update( $wpdb->prefix . 'woocommerce_order_items', array(
|
||||
'order_item_name' => $item->get_name(),
|
||||
'order_item_type' => $item->get_type(),
|
||||
'order_id' => $item->get_order_id(),
|
||||
), array( 'order_item_id' => $item->get_id() ) );
|
||||
|
||||
do_action( 'woocommerce_update_order_item', $item->get_id(), $item, $item->get_order_id() );
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove an order item from the database.
|
||||
*
|
||||
* @since 2.7.0
|
||||
* @param WC_Order_Item $item
|
||||
* @param array $args Array of args to pass to the delete method.
|
||||
*/
|
||||
public function delete( &$item, $args = array() ) {
|
||||
if ( $item->get_id() ) {
|
||||
global $wpdb;
|
||||
do_action( 'woocommerce_before_delete_order_item', $item->get_id() );
|
||||
$wpdb->delete( $wpdb->prefix . 'woocommerce_order_items', array( 'order_item_id' => $item->get_id() ) );
|
||||
$wpdb->delete( $wpdb->prefix . 'woocommerce_order_itemmeta', array( 'order_item_id' => $item->get_id() ) );
|
||||
do_action( 'woocommerce_delete_order_item', $item->get_id() );
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Read a order item from the database.
|
||||
*
|
||||
* @since 2.7.0
|
||||
* @param WC_Order_Item $item
|
||||
*/
|
||||
public function read( &$item ) {
|
||||
global $wpdb;
|
||||
|
||||
$item->set_defaults();
|
||||
|
||||
$data = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->prefix}woocommerce_order_items WHERE order_item_id = %d LIMIT 1;", $item->get_id() ) );
|
||||
|
||||
if ( ! $data ) {
|
||||
throw new Exception( __( 'Invalid order item.', 'woocommerce' ) );
|
||||
}
|
||||
|
||||
$item->set_props( array(
|
||||
'order_id' => $data->order_id,
|
||||
'name' => $data->order_item_name,
|
||||
'type' => $data->order_item_type,
|
||||
) );
|
||||
$item->read_meta_data();
|
||||
$item->set_object_read( true );
|
||||
}
|
||||
}
|
|
@ -0,0 +1,39 @@
|
|||
<?php
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* WC Order Item Coupon Data Store
|
||||
*
|
||||
* @version 2.7.0
|
||||
* @category Class
|
||||
* @author WooCommerce
|
||||
*/
|
||||
class WC_Order_Item_Coupon_Data_Store extends Abstract_WC_Order_Item_Type_Data_Store implements WC_Object_Data_Store, WC_Order_Item_Type_Data_Store_Interface {
|
||||
/**
|
||||
* Read/populate data properties specific to this order item.
|
||||
*
|
||||
* @since 2.7.0
|
||||
* @param WC_Order_Item $item
|
||||
*/
|
||||
public function read( &$item ) {
|
||||
parent::read( $item );
|
||||
$item->set_props( array(
|
||||
'discount' => get_metadata( 'order_item', $item->get_id(), 'discount_amount', true ),
|
||||
'discount_tax' => get_metadata( 'order_item', $item->get_id(), 'discount_amount_tax', true ),
|
||||
) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves an item's data to the database / item meta.
|
||||
* Ran after both create and update, so $item->get_id() will be set.
|
||||
*
|
||||
* @since 2.7.0
|
||||
* @param WC_Order_Item $item
|
||||
*/
|
||||
public function save_item_data( &$item ) {
|
||||
wc_update_order_item_meta( $item->get_id(), 'discount_amount', $item->get_discount( 'edit' ) );
|
||||
wc_update_order_item_meta( $item->get_id(), 'discount_amount_tax', $item->get_discount_tax( 'edit' ) );
|
||||
}
|
||||
}
|
|
@ -0,0 +1,122 @@
|
|||
<?php
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* WC Order Item Coupon Data Store: Misc Order Item Data functions.
|
||||
*
|
||||
* @version 2.7.0
|
||||
* @category Class
|
||||
* @author WooCommerce
|
||||
*/
|
||||
class WC_Order_Item_Data_Store implements WC_Order_Item_Data_Store_Interface {
|
||||
|
||||
/**
|
||||
* Add an order item to an order.
|
||||
*
|
||||
* @since 2.7.0
|
||||
* @param int $order_id
|
||||
* @param array $item. order_item_name and order_item_type.
|
||||
* @return int Order Item ID
|
||||
*/
|
||||
public function add_order_item( $order_id, $item ) {
|
||||
global $wpdb;
|
||||
$wpdb->insert(
|
||||
$wpdb->prefix . "woocommerce_order_items",
|
||||
array(
|
||||
'order_item_name' => $item['order_item_name'],
|
||||
'order_item_type' => $item['order_item_type'],
|
||||
'order_id' => $order_id,
|
||||
),
|
||||
array(
|
||||
'%s',
|
||||
'%s',
|
||||
'%d',
|
||||
)
|
||||
);
|
||||
|
||||
return absint( $wpdb->insert_id );
|
||||
}
|
||||
|
||||
/**
|
||||
* Update an order item.
|
||||
*
|
||||
* @since 2.7.0
|
||||
* @param int $item_id
|
||||
* @param array $item. order_item_name or order_item_type.
|
||||
* @return boolean
|
||||
*/
|
||||
public function update_order_item( $item_id, $item ) {
|
||||
global $wpdb;
|
||||
return $wpdb->update( $wpdb->prefix . 'woocommerce_order_items', $item, array( 'order_item_id' => $item_id ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete an order item.
|
||||
*
|
||||
* @since 2.7.0
|
||||
* @param int $item_id
|
||||
*/
|
||||
public function delete_order_item( $item_id ) {
|
||||
global $wpdb;
|
||||
$wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}woocommerce_order_items WHERE order_item_id = %d", $item_id ) );
|
||||
$wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}woocommerce_order_itemmeta WHERE order_item_id = %d", $item_id ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Update term meta.
|
||||
*
|
||||
* @since 2.7.0
|
||||
* @param mixed $item_id
|
||||
* @param mixed $meta_key
|
||||
* @param mixed $meta_value
|
||||
* @param string $prev_value (default: '')
|
||||
* @return bool
|
||||
*/
|
||||
function update_metadata( $item_id, $meta_key, $meta_value, $prev_value = '' ) {
|
||||
return update_metadata( 'order_item', $item_id, $meta_key, $meta_value, $prev_value );
|
||||
}
|
||||
|
||||
/**
|
||||
* Add term meta.
|
||||
*
|
||||
* @since 2.7.0
|
||||
* @param mixed $item_id
|
||||
* @param mixed $meta_key
|
||||
* @param mixed $meta_value
|
||||
* @param bool $unique (default: false)
|
||||
* @return int New row ID or 0
|
||||
*/
|
||||
function add_metadata( $item_id, $meta_key, $meta_value, $unique = false ) {
|
||||
return add_metadata( 'order_item', $item_id, $meta_key, $meta_value, $unique );
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete term meta.
|
||||
*
|
||||
* @since 2.7.0
|
||||
* @param mixed $item_id
|
||||
* @param mixed $meta_key
|
||||
* @param string $meta_value (default: '')
|
||||
* @param bool $delete_all (default: false)
|
||||
* @return bool
|
||||
*/
|
||||
function delete_metadata( $item_id, $meta_key, $meta_value = '', $delete_all = false ) {
|
||||
return delete_metadata( 'order_item', $item_id, $meta_key, $meta_value, $delete_all );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get term meta.
|
||||
*
|
||||
* @since 2.7.0
|
||||
* @param mixed $item_id
|
||||
* @param mixed $key
|
||||
* @param bool $single (default: true)
|
||||
* @return mixed
|
||||
*/
|
||||
function get_metadata( $item_id, $key, $single = true ) {
|
||||
return get_metadata( 'order_item', $item_id, $key, $single );
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,44 @@
|
|||
<?php
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* WC Order Item Fee Data Store
|
||||
*
|
||||
* @version 2.7.0
|
||||
* @category Class
|
||||
* @author WooCommerce
|
||||
*/
|
||||
class WC_Order_Item_Fee_Data_Store extends Abstract_WC_Order_Item_Type_Data_Store implements WC_Object_Data_Store, WC_Order_Item_Type_Data_Store_Interface {
|
||||
/**
|
||||
* Read/populate data properties specific to this order item.
|
||||
*
|
||||
* @since 2.7.0
|
||||
* @param WC_Order_Item $item
|
||||
*/
|
||||
public function read( &$item ) {
|
||||
parent::read( $item );
|
||||
$item->set_props( array(
|
||||
'tax_class' => get_metadata( 'order_item', $item->get_id(), '_tax_class', true ),
|
||||
'tax_status' => get_metadata( 'order_item', $item->get_id(), '_tax_status', true ),
|
||||
'total' => get_metadata( 'order_item', $item->get_id(), '_line_total', true ),
|
||||
'taxes' => get_metadata( 'order_item', $item->get_id(), '_line_tax_data', true ),
|
||||
) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves an item's data to the database / item meta.
|
||||
* Ran after both create and update, so $item->get_id() will be set.
|
||||
*
|
||||
* @since 2.7.0
|
||||
* @param WC_Order_Item $item
|
||||
*/
|
||||
public function save_item_data( &$item ) {
|
||||
wc_update_order_item_meta( $item->get_id(), '_tax_class', $item->get_tax_class( 'edit' ) );
|
||||
wc_update_order_item_meta( $item->get_id(), '_tax_status', $item->get_tax_status( 'edit' ) );
|
||||
wc_update_order_item_meta( $item->get_id(), '_line_total', $item->get_total( 'edit' ) );
|
||||
wc_update_order_item_meta( $item->get_id(), '_line_tax', $item->get_total_tax( 'edit' ) );
|
||||
wc_update_order_item_meta( $item->get_id(), '_line_tax_data', $item->get_taxes( 'edit' ) );
|
||||
}
|
||||
}
|
|
@ -0,0 +1,71 @@
|
|||
<?php
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* WC Order Item Product Data Store
|
||||
*
|
||||
* @version 2.7.0
|
||||
* @category Class
|
||||
* @author WooCommerce
|
||||
*/
|
||||
class WC_Order_Item_Product_Data_Store extends Abstract_WC_Order_Item_Type_Data_Store implements WC_Object_Data_Store, WC_Order_Item_Type_Data_Store_Interface, WC_Order_Item_Product_Data_Store_Interface {
|
||||
/**
|
||||
* Read/populate data properties specific to this order item.
|
||||
*
|
||||
* @since 2.7.0
|
||||
* @param WC_Order_Item $item
|
||||
*/
|
||||
public function read( &$item ) {
|
||||
parent::read( $item );
|
||||
$item->set_props( array(
|
||||
'product_id' => get_metadata( 'order_item', $item->get_id(), '_product_id', true ),
|
||||
'variation_id' => get_metadata( 'order_item', $item->get_id(), '_variation_id', true ),
|
||||
'quantity' => get_metadata( 'order_item', $item->get_id(), '_qty', true ),
|
||||
'tax_class' => get_metadata( 'order_item', $item->get_id(), '_tax_class', true ),
|
||||
'subtotal' => get_metadata( 'order_item', $item->get_id(), '_line_subtotal', true ),
|
||||
'total' => get_metadata( 'order_item', $item->get_id(), '_line_total', true ),
|
||||
'taxes' => get_metadata( 'order_item', $item->get_id(), '_line_tax_data', true ),
|
||||
) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves an item's data to the database / item meta.
|
||||
* Ran after both create and update, so $item->get_id() will be set.
|
||||
*
|
||||
* @since 2.7.0
|
||||
* @param WC_Order_Item $item
|
||||
*/
|
||||
public function save_item_data( &$item ) {
|
||||
wc_update_order_item_meta( $item->get_id(), '_product_id', $item->get_product_id( 'edit' ) );
|
||||
wc_update_order_item_meta( $item->get_id(), '_variation_id', $item->get_variation_id( 'edit' ) );
|
||||
wc_update_order_item_meta( $item->get_id(), '_qty', $item->get_quantity( 'edit' ) );
|
||||
wc_update_order_item_meta( $item->get_id(), '_tax_class', $item->get_tax_class( 'edit' ) );
|
||||
wc_update_order_item_meta( $item->get_id(), '_line_subtotal', $item->get_subtotal( 'edit' ) );
|
||||
wc_update_order_item_meta( $item->get_id(), '_line_subtotal_tax', $item->get_subtotal_tax( 'edit' ) );
|
||||
wc_update_order_item_meta( $item->get_id(), '_line_total', $item->get_total( 'edit' ) );
|
||||
wc_update_order_item_meta( $item->get_id(), '_line_tax', $item->get_total_tax( 'edit' ) );
|
||||
wc_update_order_item_meta( $item->get_id(), '_line_tax_data', $item->get_taxes( 'edit' ) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get a list of download IDs for a specific item from an order.
|
||||
*
|
||||
* @since 2.7.0
|
||||
* @param WC_Order_Item $item
|
||||
* @param WC_Order $order
|
||||
* @return array
|
||||
*/
|
||||
public function get_download_ids( $item, $order ) {
|
||||
global $wpdb;
|
||||
return $wpdb->get_col(
|
||||
$wpdb->prepare(
|
||||
"SELECT download_id FROM {$wpdb->prefix}woocommerce_downloadable_product_permissions WHERE user_email = %s AND order_key = %s AND product_id = %d ORDER BY permission_id",
|
||||
$order->get_billing_email(),
|
||||
$order->get_order_key(),
|
||||
$item->get_variation_id() ? $item->get_variation_id() : $item->get_product_id()
|
||||
)
|
||||
);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,42 @@
|
|||
<?php
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* WC Order Item Shipping Data Store
|
||||
*
|
||||
* @version 2.7.0
|
||||
* @category Class
|
||||
* @author WooCommerce
|
||||
*/
|
||||
class WC_Order_Item_Shipping_Data_Store extends Abstract_WC_Order_Item_Type_Data_Store implements WC_Object_Data_Store, WC_Order_Item_Type_Data_Store_Interface {
|
||||
/**
|
||||
* Read/populate data properties specific to this order item.
|
||||
*
|
||||
* @since 2.7.0
|
||||
* @param WC_Order_Item $item
|
||||
*/
|
||||
public function read( &$item ) {
|
||||
parent::read( $item );
|
||||
$item->set_props( array(
|
||||
'method_id' => get_metadata( 'order_item', $item->get_id(), 'method_id', true ),
|
||||
'total' => get_metadata( 'order_item', $item->get_id(), 'cost', true ),
|
||||
'taxes' => get_metadata( 'order_item', $item->get_id(), 'taxes', true ),
|
||||
) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves an item's data to the database / item meta.
|
||||
* Ran after both create and update, so $item->get_id() will be set.
|
||||
*
|
||||
* @since 2.7.0
|
||||
* @param WC_Order_Item $item
|
||||
*/
|
||||
public function save_item_data( &$item ) {
|
||||
wc_update_order_item_meta( $item->get_id(), 'method_id', $item->get_method_id( 'edit' ) );
|
||||
wc_update_order_item_meta( $item->get_id(), 'cost', $item->get_total( 'edit' ) );
|
||||
wc_update_order_item_meta( $item->get_id(), 'total_tax', $item->get_total_tax( 'edit' ) );
|
||||
wc_update_order_item_meta( $item->get_id(), 'taxes', $item->get_taxes( 'edit' ) );
|
||||
}
|
||||
}
|
|
@ -0,0 +1,45 @@
|
|||
<?php
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* WC Order Item Tax Data Store
|
||||
*
|
||||
* @version 2.7.0
|
||||
* @category Class
|
||||
* @author WooCommerce
|
||||
*/
|
||||
class WC_Order_Item_Tax_Data_Store extends Abstract_WC_Order_Item_Type_Data_Store implements WC_Object_Data_Store, WC_Order_Item_Type_Data_Store_Interface {
|
||||
/**
|
||||
* Read/populate data properties specific to this order item.
|
||||
*
|
||||
* @since 2.7.0
|
||||
* @param WC_Order_Item $item
|
||||
*/
|
||||
public function read( &$item ) {
|
||||
parent::read( $item );
|
||||
$item->set_props( array(
|
||||
'rate_id' => get_metadata( 'order_item', $item->get_id(), 'rate_id', true ),
|
||||
'label' => get_metadata( 'order_item', $item->get_id(), 'label', true ),
|
||||
'compound' => get_metadata( 'order_item', $item->get_id(), 'compound', true ),
|
||||
'tax_total' => get_metadata( 'order_item', $item->get_id(), 'tax_amount', true ),
|
||||
'shipping_tax_total' => get_metadata( 'order_item', $item->get_id(), 'shipping_tax_amount', true ),
|
||||
) );
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves an item's data to the database / item meta.
|
||||
* Ran after both create and update, so $item->get_id() will be set.
|
||||
*
|
||||
* @since 2.7.0
|
||||
* @param WC_Order_Item $item
|
||||
*/
|
||||
public function save_item_data( &$item ) {
|
||||
wc_update_order_item_meta( $item->get_id(), 'rate_id', $item->get_rate_id( 'edit' ) );
|
||||
wc_update_order_item_meta( $item->get_id(), 'label', $item->get_label( 'edit' ) );
|
||||
wc_update_order_item_meta( $item->get_id(), 'compound', $item->get_compound( 'edit' ) );
|
||||
wc_update_order_item_meta( $item->get_id(), 'tax_amount', $item->get_tax_total( 'edit' ) );
|
||||
wc_update_order_item_meta( $item->get_id(), 'shipping_tax_amount', $item->get_shipping_tax_total( 'edit' ) );
|
||||
}
|
||||
}
|
|
@ -0,0 +1,77 @@
|
|||
<?php
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* WC Order Item Data Store Interface
|
||||
*
|
||||
* Functions that must be defined by the order item data store (for functions).
|
||||
*
|
||||
* @version 2.7.0
|
||||
* @category Interface
|
||||
* @author WooCommerce
|
||||
*/
|
||||
interface WC_Order_Item_Data_Store_Interface {
|
||||
/**
|
||||
* Add an order item to an order.
|
||||
* @param int $order_id
|
||||
* @param array $item. order_item_name and order_item_type.
|
||||
* @return int Order Item ID
|
||||
*/
|
||||
public function add_order_item( $order_id, $item );
|
||||
|
||||
/**
|
||||
* Update an order item.
|
||||
* @param int $item_id
|
||||
* @param array $item. order_item_name or order_item_type.
|
||||
* @return boolean
|
||||
*/
|
||||
public function update_order_item( $item_id, $item );
|
||||
|
||||
/**
|
||||
* Delete an order item.
|
||||
* @param int $item_id
|
||||
*/
|
||||
public function delete_order_item( $item_id );
|
||||
|
||||
/**
|
||||
* Update term meta.
|
||||
* @param mixed $item_id
|
||||
* @param mixed $meta_key
|
||||
* @param mixed $meta_value
|
||||
* @param string $prev_value (default: '')
|
||||
* @return bool
|
||||
*/
|
||||
function update_metadata( $item_id, $meta_key, $meta_value, $prev_value = '' );
|
||||
|
||||
/**
|
||||
* Add term meta.
|
||||
* @param mixed $item_id
|
||||
* @param mixed $meta_key
|
||||
* @param mixed $meta_value
|
||||
* @param bool $unique (default: false)
|
||||
* @return int New row ID or 0
|
||||
*/
|
||||
function add_metadata( $item_id, $meta_key, $meta_value, $unique = false );
|
||||
|
||||
|
||||
/**
|
||||
* Delete term meta.
|
||||
* @param mixed $item_id
|
||||
* @param mixed $meta_key
|
||||
* @param string $meta_value (default: '')
|
||||
* @param bool $delete_all (default: false)
|
||||
* @return bool
|
||||
*/
|
||||
function delete_metadata( $item_id, $meta_key, $meta_value = '', $delete_all = false );
|
||||
|
||||
/**
|
||||
* Get term meta.
|
||||
* @param mixed $item_id
|
||||
* @param mixed $key
|
||||
* @param bool $single (default: true)
|
||||
* @return mixed
|
||||
*/
|
||||
function get_metadata( $item_id, $key, $single = true );
|
||||
}
|
|
@ -0,0 +1,24 @@
|
|||
<?php
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* WC Order Item Data Store Interface
|
||||
*
|
||||
* Functions that must be defined by order item store classes.
|
||||
*
|
||||
* @version 2.7.0
|
||||
* @category Interface
|
||||
* @author WooCommerce
|
||||
*/
|
||||
interface WC_Order_Item_Product_Data_Store_Interface {
|
||||
/**
|
||||
* Get a list of download IDs for a specific item from an order.
|
||||
*
|
||||
* @param WC_Order_Item $item
|
||||
* @param WC_Order $order
|
||||
* @return array
|
||||
*/
|
||||
public function get_download_ids( $item, $order );
|
||||
}
|
|
@ -0,0 +1,23 @@
|
|||
<?php
|
||||
if ( ! defined( 'ABSPATH' ) ) {
|
||||
exit;
|
||||
}
|
||||
|
||||
/**
|
||||
* WC Order Item Data Store Interface
|
||||
*
|
||||
* Functions that must be defined by order item store classes.
|
||||
*
|
||||
* @version 2.7.0
|
||||
* @category Interface
|
||||
* @author WooCommerce
|
||||
*/
|
||||
interface WC_Order_Item_Type_Data_Store_Interface {
|
||||
/**
|
||||
* Saves an item's data to the database / item meta.
|
||||
* Ran after both create and update, so $item->get_id() will be set.
|
||||
*
|
||||
* @param WC_Order_Item $item
|
||||
*/
|
||||
public function save_item_data( &$item );
|
||||
}
|
|
@ -20,8 +20,6 @@ if ( ! defined( 'ABSPATH' ) ) {
|
|||
* @return mixed
|
||||
*/
|
||||
function wc_add_order_item( $order_id, $item ) {
|
||||
global $wpdb;
|
||||
|
||||
$order_id = absint( $order_id );
|
||||
|
||||
if ( ! $order_id )
|
||||
|
@ -34,21 +32,8 @@ function wc_add_order_item( $order_id, $item ) {
|
|||
|
||||
$item = wp_parse_args( $item, $defaults );
|
||||
|
||||
$wpdb->insert(
|
||||
$wpdb->prefix . "woocommerce_order_items",
|
||||
array(
|
||||
'order_item_name' => $item['order_item_name'],
|
||||
'order_item_type' => $item['order_item_type'],
|
||||
'order_id' => $order_id,
|
||||
),
|
||||
array(
|
||||
'%s',
|
||||
'%s',
|
||||
'%d',
|
||||
)
|
||||
);
|
||||
|
||||
$item_id = absint( $wpdb->insert_id );
|
||||
$data_store = WC_Data_Store::load( 'order-item' );
|
||||
$item_id = $data_store->add_order_item( $order_id, $item );
|
||||
|
||||
do_action( 'woocommerce_new_order_item', $item_id, $item, $order_id );
|
||||
|
||||
|
@ -64,9 +49,8 @@ function wc_add_order_item( $order_id, $item ) {
|
|||
* @return bool true if successfully updated, false otherwise
|
||||
*/
|
||||
function wc_update_order_item( $item_id, $args ) {
|
||||
global $wpdb;
|
||||
|
||||
$update = $wpdb->update( $wpdb->prefix . 'woocommerce_order_items', $args, array( 'order_item_id' => $item_id ) );
|
||||
$data_store = WC_Data_Store::load( 'order-item' );
|
||||
$update = $data_store->update_order_item( $item_id, $args );
|
||||
|
||||
if ( false === $update ) {
|
||||
return false;
|
||||
|
@ -85,17 +69,16 @@ function wc_update_order_item( $item_id, $args ) {
|
|||
* @return bool
|
||||
*/
|
||||
function wc_delete_order_item( $item_id ) {
|
||||
global $wpdb;
|
||||
$item_id = absint( $item_id );
|
||||
$data_store = WC_Data_Store::load( 'order-item' );
|
||||
|
||||
$item_id = absint( $item_id );
|
||||
|
||||
if ( ! $item_id )
|
||||
if ( ! $item_id ) {
|
||||
return false;
|
||||
}
|
||||
|
||||
do_action( 'woocommerce_before_delete_order_item', $item_id );
|
||||
|
||||
$wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}woocommerce_order_items WHERE order_item_id = %d", $item_id ) );
|
||||
$wpdb->query( $wpdb->prepare( "DELETE FROM {$wpdb->prefix}woocommerce_order_itemmeta WHERE order_item_id = %d", $item_id ) );
|
||||
$data_store->delete_order_item( $item_id );
|
||||
|
||||
do_action( 'woocommerce_delete_order_item', $item_id );
|
||||
|
||||
|
@ -113,7 +96,8 @@ function wc_delete_order_item( $item_id ) {
|
|||
* @return bool
|
||||
*/
|
||||
function wc_update_order_item_meta( $item_id, $meta_key, $meta_value, $prev_value = '' ) {
|
||||
if ( update_metadata( 'order_item', $item_id, $meta_key, $meta_value, $prev_value ) ) {
|
||||
$data_store = WC_Data_Store::load( 'order-item' );
|
||||
if ( $data_store->update_metadata( $item_id, $meta_key, $meta_value, $prev_value ) ) {
|
||||
$cache_key = WC_Cache_Helper::get_cache_prefix( 'orders' ) . 'item_meta_array_' . $item_id;
|
||||
wp_cache_delete( $cache_key, 'orders' );
|
||||
return true;
|
||||
|
@ -132,7 +116,8 @@ function wc_update_order_item_meta( $item_id, $meta_key, $meta_value, $prev_valu
|
|||
* @return int New row ID or 0
|
||||
*/
|
||||
function wc_add_order_item_meta( $item_id, $meta_key, $meta_value, $unique = false ) {
|
||||
if ( $meta_id = add_metadata( 'order_item', $item_id, $meta_key, $meta_value, $unique ) ) {
|
||||
$data_store = WC_Data_Store::load( 'order-item' );
|
||||
if ( $meta_id = $data_store->add_metadata( $item_id, $meta_key, $meta_value, $unique ) ) {
|
||||
$cache_key = WC_Cache_Helper::get_cache_prefix( 'orders' ) . 'item_meta_array_' . $item_id;
|
||||
wp_cache_delete( $cache_key, 'orders' );
|
||||
return $meta_id;
|
||||
|
@ -151,7 +136,8 @@ function wc_add_order_item_meta( $item_id, $meta_key, $meta_value, $unique = fal
|
|||
* @return bool
|
||||
*/
|
||||
function wc_delete_order_item_meta( $item_id, $meta_key, $meta_value = '', $delete_all = false ) {
|
||||
if ( delete_metadata( 'order_item', $item_id, $meta_key, $meta_value, $delete_all ) ) {
|
||||
$data_store = WC_Data_Store::load( 'order-item' );
|
||||
if ( $data_store->delete_metadata( $item_id, $meta_key, $meta_value, $delete_all ) ) {
|
||||
$cache_key = WC_Cache_Helper::get_cache_prefix( 'orders' ) . 'item_meta_array_' . $item_id;
|
||||
wp_cache_delete( $cache_key, 'orders' );
|
||||
return true;
|
||||
|
@ -169,5 +155,6 @@ function wc_delete_order_item_meta( $item_id, $meta_key, $meta_value = '', $dele
|
|||
* @return mixed
|
||||
*/
|
||||
function wc_get_order_item_meta( $item_id, $key, $single = true ) {
|
||||
return get_metadata( 'order_item', $item_id, $key, $single );
|
||||
$data_store = WC_Data_Store::load( 'order-item' );
|
||||
return $data_store->get_metadata( $item_id, $key, $single );
|
||||
}
|
||||
|
|
|
@ -69,7 +69,8 @@ class WC_Helper_Order {
|
|||
// Add shipping costs
|
||||
$shipping_taxes = WC_Tax::calc_shipping_tax( '10', WC_Tax::get_shipping_tax_rates() );
|
||||
$rate = new WC_Shipping_Rate( 'flat_rate_shipping', 'Flat rate shipping', '10', $shipping_taxes, 'flat_rate' );
|
||||
$item = new WC_Order_Item_Shipping( array(
|
||||
$item = new WC_Order_Item_Shipping();
|
||||
$item->set_props( array(
|
||||
'method_title' => $rate->label,
|
||||
'method_id' => $rate->id,
|
||||
'total' => wc_format_decimal( $rate->cost ),
|
||||
|
|
|
@ -233,15 +233,16 @@ class WC_Tests_CRUD_Orders extends WC_Unit_Test_Case {
|
|||
function test_remove_order_items() {
|
||||
$product = WC_Helper_Product::create_simple_product();
|
||||
$object = new WC_Order();
|
||||
$item_1 = new WC_Order_Item_Product( array(
|
||||
$item_1 = new WC_Order_Item_Product();
|
||||
$item_1->set_props( array(
|
||||
'product' => $product,
|
||||
'quantity' => 4,
|
||||
) );
|
||||
$item_2 = new WC_Order_Item_Product( array(
|
||||
$item_2 = new WC_Order_Item_Product();
|
||||
$item_2->set_props( array(
|
||||
'product' => $product,
|
||||
'quantity' => 2,
|
||||
) );
|
||||
|
||||
$object->add_item( $item_1 );
|
||||
$object->add_item( $item_2 );
|
||||
$object->save();
|
||||
|
@ -255,11 +256,13 @@ class WC_Tests_CRUD_Orders extends WC_Unit_Test_Case {
|
|||
*/
|
||||
function test_get_items() {
|
||||
$object = new WC_Order();
|
||||
$item_1 = new WC_Order_Item_Product( array(
|
||||
$item_1 = new WC_Order_Item_Product();
|
||||
$item_1->set_props( array(
|
||||
'product' => WC_Helper_Product::create_simple_product(),
|
||||
'quantity' => 4,
|
||||
) );
|
||||
$item_2 = new WC_Order_Item_Product( array(
|
||||
$item_2 = new WC_Order_Item_Product();
|
||||
$item_2->set_props( array(
|
||||
'product' => WC_Helper_Product::create_simple_product(),
|
||||
'quantity' => 2,
|
||||
) );
|
||||
|
@ -275,7 +278,8 @@ class WC_Tests_CRUD_Orders extends WC_Unit_Test_Case {
|
|||
*/
|
||||
function test_get_fees() {
|
||||
$object = new WC_Order();
|
||||
$item = new WC_Order_Item_Fee( array(
|
||||
$item = new WC_Order_Item_Fee();
|
||||
$item->set_props( array(
|
||||
'name' => 'Some Fee',
|
||||
'tax_status' => 'taxable',
|
||||
'total' => '100',
|
||||
|
@ -306,7 +310,8 @@ class WC_Tests_CRUD_Orders extends WC_Unit_Test_Case {
|
|||
WC_Tax::_insert_tax_rate( $tax_rate );
|
||||
|
||||
$object = new WC_Order();
|
||||
$item_1 = new WC_Order_Item_Product( array(
|
||||
$item_1 = new WC_Order_Item_Product();
|
||||
$item_1->set_props( array(
|
||||
'product' => WC_Helper_Product::create_simple_product(),
|
||||
'quantity' => 4,
|
||||
) );
|
||||
|
@ -335,7 +340,8 @@ class WC_Tests_CRUD_Orders extends WC_Unit_Test_Case {
|
|||
function test_get_shipping_methods() {
|
||||
$object = new WC_Order();
|
||||
$rate = new WC_Shipping_Rate( 'flat_rate_shipping', 'Flat rate shipping', '10', array(), 'flat_rate' );
|
||||
$item = new WC_Order_Item_Shipping( array(
|
||||
$item = new WC_Order_Item_Shipping();
|
||||
$item->set_props( array(
|
||||
'method_title' => $rate->label,
|
||||
'method_id' => $rate->id,
|
||||
'total' => wc_format_decimal( $rate->cost ),
|
||||
|
@ -353,7 +359,8 @@ class WC_Tests_CRUD_Orders extends WC_Unit_Test_Case {
|
|||
function test_get_shipping_method() {
|
||||
$object = new WC_Order();
|
||||
$rate = new WC_Shipping_Rate( 'flat_rate_shipping', 'Flat rate shipping', '10', array(), 'flat_rate' );
|
||||
$item = new WC_Order_Item_Shipping( array(
|
||||
$item = new WC_Order_Item_Shipping();
|
||||
$item->set_props( array(
|
||||
'method_title' => $rate->label,
|
||||
'method_id' => $rate->id,
|
||||
'total' => wc_format_decimal( $rate->cost ),
|
||||
|
@ -365,7 +372,8 @@ class WC_Tests_CRUD_Orders extends WC_Unit_Test_Case {
|
|||
$this->assertEquals( 'Flat rate shipping', $object->get_shipping_method() );
|
||||
|
||||
$rate = new WC_Shipping_Rate( 'flat_rate_shipping', 'Flat rate shipping 2', '10', array(), 'flat_rate' );
|
||||
$item = new WC_Order_Item_Shipping( array(
|
||||
$item = new WC_Order_Item_Shipping();
|
||||
$item->set_props( array(
|
||||
'method_title' => $rate->label,
|
||||
'method_id' => $rate->id,
|
||||
'total' => wc_format_decimal( $rate->cost ),
|
||||
|
@ -382,7 +390,8 @@ class WC_Tests_CRUD_Orders extends WC_Unit_Test_Case {
|
|||
*/
|
||||
function test_get_used_coupons() {
|
||||
$object = new WC_Order();
|
||||
$item = new WC_Order_Item_Coupon( array(
|
||||
$item = new WC_Order_Item_Coupon();
|
||||
$item->set_props( array(
|
||||
'code' => '12345',
|
||||
'discount' => 10,
|
||||
'discount_tax' => 5,
|
||||
|
@ -397,15 +406,16 @@ class WC_Tests_CRUD_Orders extends WC_Unit_Test_Case {
|
|||
*/
|
||||
function test_get_item_count() {
|
||||
$object = new WC_Order();
|
||||
$item_1 = new WC_Order_Item_Product( array(
|
||||
$item_1 = new WC_Order_Item_Product();
|
||||
$item_1->set_props( array(
|
||||
'product' => WC_Helper_Product::create_simple_product(),
|
||||
'quantity' => 4,
|
||||
) );
|
||||
$item_2 = new WC_Order_Item_Product( array(
|
||||
$item_2 = new WC_Order_Item_Product();
|
||||
$item_2->set_props( array(
|
||||
'product' => WC_Helper_Product::create_simple_product(),
|
||||
'quantity' => 2,
|
||||
) );
|
||||
|
||||
$object->add_item( $item_1 );
|
||||
$object->add_item( $item_2 );
|
||||
$object->save();
|
||||
|
@ -417,17 +427,19 @@ class WC_Tests_CRUD_Orders extends WC_Unit_Test_Case {
|
|||
*/
|
||||
function test_get_item() {
|
||||
$object = new WC_Order();
|
||||
$item = new WC_Order_Item_Product( array(
|
||||
$item = new WC_Order_Item_Product();
|
||||
$item->set_props( array(
|
||||
'product' => WC_Helper_Product::create_simple_product(),
|
||||
'quantity' => 4,
|
||||
) );
|
||||
$item_id = $item->save();
|
||||
$object->add_item( $item_id );
|
||||
$item->save();
|
||||
$object->add_item( $item->get_id() );
|
||||
$object->save();
|
||||
$this->assertTrue( $object->get_item( $item_id ) instanceOf WC_Order_Item_Product );
|
||||
$this->assertTrue( $object->get_item( $item->get_id() ) instanceOf WC_Order_Item_Product );
|
||||
|
||||
$object = new WC_Order();
|
||||
$item = new WC_Order_Item_Coupon( array(
|
||||
$item = new WC_Order_Item_Coupon();
|
||||
$item->set_props( array(
|
||||
'code' => '12345',
|
||||
'discount' => 10,
|
||||
'discount_tax' => 5,
|
||||
|
@ -472,14 +484,16 @@ class WC_Tests_CRUD_Orders extends WC_Unit_Test_Case {
|
|||
function test_calculate_shipping() {
|
||||
$object = new WC_Order();
|
||||
$rate = new WC_Shipping_Rate( 'flat_rate_shipping', 'Flat rate shipping', '10', array(), 'flat_rate' );
|
||||
$item_1 = new WC_Order_Item_Shipping( array(
|
||||
$item_1 = new WC_Order_Item_Shipping();
|
||||
$item_1->set_props( array(
|
||||
'method_title' => $rate->label,
|
||||
'method_id' => $rate->id,
|
||||
'total' => wc_format_decimal( $rate->cost ),
|
||||
'taxes' => $rate->taxes,
|
||||
'meta_data' => $rate->get_meta_data(),
|
||||
) );
|
||||
$item_2 = new WC_Order_Item_Shipping( array(
|
||||
$item_2 = new WC_Order_Item_Shipping();
|
||||
$item_2->set_props( array(
|
||||
'method_title' => $rate->label,
|
||||
'method_id' => $rate->id,
|
||||
'total' => wc_format_decimal( $rate->cost ),
|
||||
|
@ -516,13 +530,14 @@ class WC_Tests_CRUD_Orders extends WC_Unit_Test_Case {
|
|||
$object->add_product( WC_Helper_Product::create_simple_product(), 4 );
|
||||
|
||||
$rate = new WC_Shipping_Rate( 'flat_rate_shipping', 'Flat rate shipping', '10', array(), 'flat_rate' );
|
||||
$item = new WC_Order_Item_Shipping( array(
|
||||
$item = new WC_Order_Item_Shipping();
|
||||
$item->set_props( array(
|
||||
'method_title' => $rate->label,
|
||||
'method_id' => $rate->id,
|
||||
'total' => wc_format_decimal( $rate->cost ),
|
||||
'taxes' => $rate->taxes,
|
||||
'meta_data' => $rate->get_meta_data(),
|
||||
) );
|
||||
) );
|
||||
$object->add_item( $item );
|
||||
|
||||
$object->calculate_taxes();
|
||||
|
@ -557,7 +572,8 @@ class WC_Tests_CRUD_Orders extends WC_Unit_Test_Case {
|
|||
$object->add_product( WC_Helper_Product::create_simple_product(), 4 );
|
||||
|
||||
$rate = new WC_Shipping_Rate( 'flat_rate_shipping', 'Flat rate shipping', '10', array(), 'flat_rate' );
|
||||
$item = new WC_Order_Item_Shipping( array(
|
||||
$item = new WC_Order_Item_Shipping();
|
||||
$item->set_props( array(
|
||||
'method_title' => $rate->label,
|
||||
'method_id' => $rate->id,
|
||||
'total' => wc_format_decimal( $rate->cost ),
|
||||
|
@ -596,7 +612,8 @@ class WC_Tests_CRUD_Orders extends WC_Unit_Test_Case {
|
|||
$this->assertFalse( $object->has_shipping_method( 'flat_rate_shipping' ) );
|
||||
|
||||
$rate = new WC_Shipping_Rate( 'flat_rate_shipping:1', 'Flat rate shipping', '10', array(), 'flat_rate' );
|
||||
$item = new WC_Order_Item_Shipping( array(
|
||||
$item = new WC_Order_Item_Shipping();
|
||||
$item->set_props( array(
|
||||
'method_title' => $rate->label,
|
||||
'method_id' => $rate->id,
|
||||
'total' => wc_format_decimal( $rate->cost ),
|
||||
|
@ -661,7 +678,6 @@ class WC_Tests_CRUD_Orders extends WC_Unit_Test_Case {
|
|||
*/
|
||||
function test_payment_complete() {
|
||||
$object = new WC_Order();
|
||||
|
||||
$this->assertFalse( $object->payment_complete() );
|
||||
$object->save();
|
||||
$this->assertTrue( $object->payment_complete( '12345' ) );
|
||||
|
|
|
@ -298,13 +298,22 @@ final class WooCommerce {
|
|||
include_once( WC_ABSPATH . 'includes/data-stores/interfaces/wc-abstract-order-data-store-interface.php' );
|
||||
include_once( WC_ABSPATH . 'includes/data-stores/interfaces/wc-order-data-store-interface.php' );
|
||||
include_once( WC_ABSPATH . 'includes/data-stores/interfaces/wc-order-refund-data-store-interface.php' );
|
||||
|
||||
include_once( WC_ABSPATH . 'includes/data-stores/interfaces/class-wc-order-item-type-data-store-interface.php' );
|
||||
include_once( WC_ABSPATH . 'includes/data-stores/interfaces/class-wc-order-item-data-store-interface.php' );
|
||||
include_once( WC_ABSPATH . 'includes/data-stores/interfaces/class-wc-order-item-product-data-store-interface.php' );
|
||||
include_once( WC_ABSPATH . 'includes/data-stores/class-wc-data-store-cpt.php' );
|
||||
include_once( WC_ABSPATH . 'includes/data-stores/class-wc-coupon-data-store-cpt.php' );
|
||||
include_once( WC_ABSPATH . 'includes/data-stores/class-wc-product-data-store-cpt.php' );
|
||||
include_once( WC_ABSPATH . 'includes/data-stores/class-wc-product-grouped-data-store-cpt.php' );
|
||||
include_once( WC_ABSPATH . 'includes/data-stores/class-wc-product-variable-data-store-cpt.php' );
|
||||
include_once( WC_ABSPATH . 'includes/data-stores/class-wc-product-variation-data-store-cpt.php' );
|
||||
include_once( WC_ABSPATH . 'includes/data-stores/abstract-wc-order-item-type-data-store.php' );
|
||||
include_once( WC_ABSPATH . 'includes/data-stores/class-wc-order-item-data-store.php' );
|
||||
include_once( WC_ABSPATH . 'includes/data-stores/class-wc-order-item-coupon-data-store.php' );
|
||||
include_once( WC_ABSPATH . 'includes/data-stores/class-wc-order-item-fee-data-store.php' );
|
||||
include_once( WC_ABSPATH . 'includes/data-stores/class-wc-order-item-product-store.php' );
|
||||
include_once( WC_ABSPATH . 'includes/data-stores/class-wc-order-item-shipping-data-store.php' );
|
||||
include_once( WC_ABSPATH . 'includes/data-stores/class-wc-order-item-tax-data-store.php' );
|
||||
include_once( WC_ABSPATH . 'includes/data-stores/class-wc-payment-token-data-store.php' );
|
||||
include_once( WC_ABSPATH . 'includes/data-stores/class-wc-customer-data-store.php' );
|
||||
include_once( WC_ABSPATH . 'includes/data-stores/class-wc-customer-data-store-session.php' );
|
||||
|
|
Loading…
Reference in New Issue