WC_Shipping_Method::add_rate( array $args = array() )
Add a shipping rate. If taxes are not set they will be calculated based on cost.
Description Description
Parameters Parameters
- $args
-
(Optional) Arguments (default: array()).
Default value: array()
Source Source
File: includes/abstracts/abstract-wc-shipping-method.php
public function add_rate( $args = array() ) {
$args = apply_filters(
'woocommerce_shipping_method_add_rate_args',
wp_parse_args(
$args,
array(
'id' => $this->get_rate_id(), // ID for the rate. If not passed, this id:instance default will be used.
'label' => '', // Label for the rate.
'cost' => '0', // Amount or array of costs (per item shipping).
'taxes' => '', // Pass taxes, or leave empty to have it calculated for you, or 'false' to disable calculations.
'calc_tax' => 'per_order', // Calc tax per_order or per_item. Per item needs an array of costs.
'meta_data' => array(), // Array of misc meta data to store along with this rate - key value pairs.
'package' => false, // Package array this rate was generated for @since 2.6.0.
'price_decimals' => wc_get_price_decimals(),
)
),
$this
);
// ID and label are required.
if ( ! $args['id'] || ! $args['label'] ) {
return;
}
// Total up the cost.
$total_cost = is_array( $args['cost'] ) ? array_sum( $args['cost'] ) : $args['cost'];
$taxes = $args['taxes'];
// Taxes - if not an array and not set to false, calc tax based on cost and passed calc_tax variable. This saves shipping methods having to do complex tax calculations.
if ( ! is_array( $taxes ) && false !== $taxes && $total_cost > 0 && $this->is_taxable() ) {
$taxes = 'per_item' === $args['calc_tax'] ? $this->get_taxes_per_item( $args['cost'] ) : WC_Tax::calc_shipping_tax( $total_cost, WC_Tax::get_shipping_tax_rates() );
}
// Round the total cost after taxes have been calculated.
$total_cost = wc_format_decimal( $total_cost, $args['price_decimals'] );
// Create rate object.
$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 ) {
$rate->add_meta_data( $key, $value );
}
}
// Store package data.
if ( $args['package'] ) {
$items_in_package = array();
foreach ( $args['package']['contents'] as $item ) {
$product = $item['data'];
$items_in_package[] = $product->get_name() . ' × ' . $item['quantity'];
}
$rate->add_meta_data( __( 'Items', 'woocommerce' ), implode( ', ', $items_in_package ) );
}
$this->rates[ $args['id'] ] = apply_filters( 'woocommerce_shipping_method_add_rate', $rate, $args, $this );
}