WC_Shipping::calculate_shipping_for_package()
Calculate shipping rates for a package,
Calculates each shipping methods cost. Rates are stored in the session based on the package hash to avoid re-calculation every page load.
Method of the class: WC_Shipping{}
Hooks from the method
Return
Array|true|false
.
Usage
$WC_Shipping = new WC_Shipping(); $WC_Shipping->calculate_shipping_for_package( $package, $package_key );
- $package(array)
- Package of cart items.
Default: array() - $package_key(int)
- Index of the package being calculated. Used to cache multiple package rates.
WC_Shipping::calculate_shipping_for_package() WC Shipping::calculate shipping for package code WC 9.4.2
public function calculate_shipping_for_package( $package = array(), $package_key = 0 ) { // If shipping is disabled or the package is invalid, return false. if ( ! $this->enabled || empty( $package ) ) { return false; } $package['rates'] = array(); // If the package is not shippable, e.g. trying to ship to an invalid country, do not calculate rates. if ( ! $this->is_package_shippable( $package ) ) { return $package; } // Check if we need to recalculate shipping for this package. $package_to_hash = $package; // Remove data objects so hashes are consistent. foreach ( $package_to_hash['contents'] as $item_id => $item ) { unset( $package_to_hash['contents'][ $item_id ]['data'] ); } // Get rates stored in the WC session data for this package. $wc_session_key = 'shipping_for_package_' . $package_key; $stored_rates = WC()->session->get( $wc_session_key ); // Calculate the hash for this package so we can tell if it's changed since last calculation. $package_hash = 'wc_ship_' . md5( wp_json_encode( $package_to_hash ) . WC_Cache_Helper::get_transient_version( 'shipping' ) ); if ( ! is_array( $stored_rates ) || $package_hash !== $stored_rates['package_hash'] || 'yes' === get_option( 'woocommerce_shipping_debug_mode', 'no' ) ) { foreach ( $this->load_shipping_methods( $package ) as $shipping_method ) { if ( ! $shipping_method->supports( 'shipping-zones' ) || $shipping_method->get_instance_id() ) { /** * Fires before getting shipping rates for a package. * * @since 4.3.0 * @param array $package Package of cart items. * @param WC_Shipping_Method $shipping_method Shipping method instance. */ do_action( 'woocommerce_before_get_rates_for_package', $package, $shipping_method ); // Use + instead of array_merge to maintain numeric keys. $package['rates'] = $package['rates'] + $shipping_method->get_rates_for_package( $package ); /** * Fires after getting shipping rates for a package. * * @since 4.3.0 * @param array $package Package of cart items. * @param WC_Shipping_Method $shipping_method Shipping method instance. */ do_action( 'woocommerce_after_get_rates_for_package', $package, $shipping_method ); } } /** * Filter the calculated shipping rates. * * @see https://gist.github.com/woogists/271654709e1d27648546e83253c1a813 for cache invalidation methods. * @param array $package['rates'] Package rates. * @param array $package Package of cart items. */ $package['rates'] = apply_filters( 'woocommerce_package_rates', $package['rates'], $package ); // Store in session to avoid recalculation. WC()->session->set( $wc_session_key, array( 'package_hash' => $package_hash, 'rates' => $package['rates'], ) ); } else { $package['rates'] = $stored_rates['rates']; } return $package; }