WC_Shipping_Method::add_rate()publicWC 1.0

Add a shipping rate. If taxes are not set they will be calculated based on cost.

Метод класса: WC_Shipping_Method{}

Возвращает

null. Ничего (null).

Использование

$WC_Shipping_Method = new WC_Shipping_Method();
$WC_Shipping_Method->add_rate( $args );
$args(массив)
Arguments .
По умолчанию: array())

Код WC_Shipping_Method::add_rate() WC 8.7.0

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 );
}