WC_Tax::get_shipping_tax_rates
Gets shipping tax rates based on tax class and customer location.
This method determines which tax rates to apply to shipping costs by following this priority:
- Uses the explicitly configured shipping tax class from WooCommerce settings if not set to
'inherit' - If tax_class is provided (per-item shipping), uses that specific class
- If no tax_class provided (per-order shipping), analyzes cart items to determine the appropriate class:
- Returns empty array if cart has no taxable items
- For multiple tax classes: prioritizes standard rate, then uses first class found in tax class hierarchy
- For single tax class: uses that class directly
4. Returns only rates that have shipping tax enabled for the determined tax class ```php - If no shipping rates exist for the tax class, returns empty array (no fallback to standard rates) - This ensures tax class inheritance works correctly - if a tax class doesn't apply to shipping, no shipping tax is charged
Method of the class: WC_Tax{}
Hooks from the method
Returns
Array. Array of tax rate arrays, each containing 'rate', 'label', 'shipping', and 'compound' keys. Empty array if no shipping rates found for the tax class.
Usage
$result = WC_Tax::get_shipping_tax_rates( $tax_class, $customer );
- $tax_class(string|null)
- Specific tax class slug to get rates for. If null, determines from cart contents.
Default:null - $customer(WC_Customer|null)
- Customer object to get location from. Uses current customer if null.
Default:null
WC_Tax::get_shipping_tax_rates() WC Tax::get shipping tax rates code WC 10.7.0
public static function get_shipping_tax_rates( $tax_class = null, $customer = null ) {
// See if we have an explicitly set shipping tax class.
$shipping_tax_class = get_option( 'woocommerce_shipping_tax_class' );
if ( 'inherit' !== $shipping_tax_class ) {
$tax_class = $shipping_tax_class;
}
// If we don't have a shipping tax class yet, work out which one to use.
if ( is_null( $tax_class ) ) {
$tax_class = self::get_shipping_tax_class_from_cart_items();
}
// If we still don't have a tax class, there must be no taxable items.
if ( is_null( $tax_class ) ) {
return array();
}
$location = self::get_tax_location( $tax_class, $customer );
$cart = WC()->cart ?? null;
/**
* Filters the shipping tax class before calculating tax rates.
*
* This filter allows plugins to modify or replace the shipping tax class
* that will be used to calculate shipping tax rates. It fires after core
* logic determines the tax class but before rates are looked up.
*
* @since 10.5.0
*
* @param string|null $tax_class The tax class determined by core logic. Can be null, empty string (standard), or a tax class slug.
* @param WC_Cart|null $cart The cart object containing all cart items, or null if not available.
* @param WC_Customer|null $customer The customer object, or null if not available.
* @param array $location The tax location array [country, state, postcode, city].
*/
$tax_class = apply_filters( 'woocommerce_shipping_tax_class', $tax_class, $cart, $customer, $location );
// If filter returned null, treat as no taxable items.
if ( is_null( $tax_class ) ) {
return array();
}
// Check for a valid location.
if ( 4 !== count( $location ) ) {
return array();
}
list( $country, $state, $postcode, $city ) = $location;
return self::find_shipping_rates(
array(
'country' => $country,
'state' => $state,
'postcode' => $postcode,
'city' => $city,
'tax_class' => $tax_class,
)
);
}