diff --git a/includes/abstracts/abstract-wc-shipping-method.php b/includes/abstracts/abstract-wc-shipping-method.php index a6a77bcaf073f..624c7181c78b8 100644 --- a/includes/abstracts/abstract-wc-shipping-method.php +++ b/includes/abstracts/abstract-wc-shipping-method.php @@ -263,7 +263,13 @@ public function add_rate( $args = array() ) { $total_cost = wc_format_decimal( $total_cost, wc_get_price_decimals() ); // Create rate object - $rate = new WC_Shipping_Rate( $args['id'], $args['label'], $total_cost, $taxes, $this->id ); + $rate = new WC_Shipping_Rate(); + $rate->set_id( $args['id'] ); + $rate->set_method_id( $this->id ); + $rate->set_instance_id( $this->instance_id ); + $rate->set_label( $args['label'] ); + $rate->set_cost( $total_cost ); + $rate->set_taxes( $taxes ); if ( ! empty( $args['meta_data'] ) ) { foreach ( $args['meta_data'] as $key => $value ) { diff --git a/includes/class-wc-shipping-rate.php b/includes/class-wc-shipping-rate.php index c7037928594b9..d0012dcef40ff 100644 --- a/includes/class-wc-shipping-rate.php +++ b/includes/class-wc-shipping-rate.php @@ -9,35 +9,35 @@ * * Simple Class for storing rates. * - * @class WC_Shipping_Rate - * @version 2.6.0 - * @package WooCommerce/Classes/Shipping - * @category Class - * @author WooThemes + * @class WC_Shipping_Rate + * @package WooCommerce/Classes/Shipping + * @category Class + * @author Automattic */ class WC_Shipping_Rate { - /** @var string Rate ID. */ - public $id = ''; - - /** @var string Label for the rate. */ - public $label = ''; - - /** @var float Cost for the rate. */ - public $cost = 0; - - /** @var array Array of taxes for the rate. */ - public $taxes = array(); - - /** @var string Label for the rate. */ - public $method_id = ''; + /** + * Stores data for this rate. + * + * @since 3.2.0 + * @var array + */ + protected $data = array( + 'id' => '', + 'method_id' => '', + 'instance_id' => 0, + 'label' => '', + 'cost' => 0, + 'taxes' => array(), + ); /** - * Stores meta data for this rate + * Stores meta data for this rate. + * * @since 2.6.0 - * @var array + * @var array */ - private $meta_data = array(); + protected $meta_data = array(); /** * Constructor. @@ -47,35 +47,191 @@ class WC_Shipping_Rate { * @param integer $cost * @param array $taxes * @param string $method_id + * @param int $instance_id */ - public function __construct( $id = '', $label = '', $cost = 0, $taxes = array(), $method_id = '' ) { - $this->id = $id; - $this->label = $label; - $this->cost = $cost; - $this->taxes = ! empty( $taxes ) && is_array( $taxes ) ? $taxes : array(); - $this->method_id = $method_id; + public function __construct( $id = '', $label = '', $cost = 0, $taxes = array(), $method_id = '', $instance_id = 0 ) { + $this->set_id( $id ); + $this->set_label( $label ); + $this->set_cost( $cost ); + $this->set_taxes( $taxes ); + $this->set_method_id( $method_id ); + $this->set_instance_id( $instance_id ); } /** - * Get shipping tax. + * Magic methods to support direct access to props. * - * @return array + * @since 3.2.0 + * @param string $key + * @return bool */ - public function get_shipping_tax() { - return apply_filters( 'woocommerce_get_shipping_tax', sizeof( $this->taxes ) > 0 && ! WC()->customer->get_is_vat_exempt() ? array_sum( $this->taxes ) : 0, $this ); + public function __isset( $key ) { + return isset( $this->data[ $key ] ); + } + + /** + * Magic methods to support direct access to props. + * + * @since 3.2.0 + * @param string $key + * @return mixed + */ + public function __get( $key ) { + if ( is_callable( array( $this, "get_{$key}" ) ) ) { + return $this->{"get_{$key}"}(); + } elseif ( isset( $this->data[ $key ] ) ) { + return $this->data[ $key ]; + } else { + return ''; + } + } + + /** + * Magic methods to support direct access to props. + * + * @since 3.2.0 + * @param string $key + * @param mixed $value + */ + public function __set( $key, $value ) { + if ( is_callable( array( $this, "set_{$key}" ) ) ) { + $this->{"set_{$key}"}( $value ); + } else { + $this->data[ $key ] = $value; + } + } + + /** + * Set ID for the rate. This is usually a combination of the method and instance IDs. + * + * @since 3.2.0 + * @param string $id + */ + public function set_id( $id ) { + $this->data['id'] = (string) $id; + } + + /** + * Set shipping method ID the rate belongs to. + * + * @since 3.2.0 + * @param string $method_id + */ + public function set_method_id( $method_id ) { + $this->data['method_id'] = (string) $method_id; + } + + /** + * Set instance ID the rate belongs to. + * + * @since 3.2.0 + * @param int $instance_id + */ + public function set_instance_id( $instance_id ) { + $this->data['method_id'] = absint( $instance_id ); + } + + /** + * Set rate label. + * + * @since 3.2.0 + * @param string $method_id + */ + public function set_label( $label ) { + $this->data['label'] = (string) $label; + } + + /** + * Set rate cost. + * + * @since 3.2.0 + * @param string $cost + */ + public function set_cost( $cost ) { + $this->data['cost'] = $cost; + } + + /** + * Set rate taxes. + * + * @since 3.2.0 + * @param array $taxes + */ + public function set_taxes( $taxes ) { + $this->data['taxes'] = ! empty( $taxes ) && is_array( $taxes ) ? $taxes : array(); + } + + /** + * Set ID for the rate. This is usually a combination of the method and instance IDs. + * + * @since 3.2.0 + * @return string + */ + public function get_id() { + return apply_filters( 'woocommerce_shipping_rate_id', $this->data['id'], $this ); + } + + /** + * Set shipping method ID the rate belongs to. + * + * @since 3.2.0 + * @return string + */ + public function get_method_id() { + return apply_filters( 'woocommerce_shipping_rate_method_id', $this->data['method_id'], $this ); + } + + /** + * Set instance ID the rate belongs to. + * + * @since 3.2.0 + * @return int + */ + public function get_instance_id() { + return apply_filters( 'woocommerce_shipping_rate_instance_id', $this->data['instance_id'], $this ); } /** - * Get label. + * Set rate label. * * @return string */ public function get_label() { - return apply_filters( 'woocommerce_shipping_rate_label', $this->label, $this ); + return apply_filters( 'woocommerce_shipping_rate_label', $this->data['label'], $this ); + } + + /** + * Set rate cost. + * + * @since 3.2.0 + * @return string + */ + public function get_cost() { + return apply_filters( 'woocommerce_shipping_rate_cost', $this->data['cost'], $this ); + } + + /** + * Set rate taxes. + * + * @since 3.2.0 + * @return array + */ + public function get_taxes() { + return apply_filters( 'woocommerce_shipping_rate_taxes', $this->data['taxes'], $this ); + } + + /** + * Get shipping tax. + * + * @return array + */ + public function get_shipping_tax() { + return apply_filters( 'woocommerce_get_shipping_tax', sizeof( $this->taxes ) > 0 && ! WC()->customer->get_is_vat_exempt() ? array_sum( $this->taxes ) : 0, $this ); } /** * Add some meta data for this rate. + * * @since 2.6.0 * @param string $key * @param string $value @@ -86,7 +242,9 @@ public function add_meta_data( $key, $value ) { /** * Get all meta data for this rate. + * * @since 2.6.0 + * @return array */ public function get_meta_data() { return $this->meta_data;