WooCommerce 11.0, scheduled for July 28, changes the registration of the product_shipping_class taxonomy so it is no longer public. This brings product shipping classes in line with their role as an internal product taxonomy used for shipping-rate rules rather than as public, front-end taxonomy archives.
The change was made in woocommerce/woocommerce#63146 by explicitly setting the taxonomy registration argument to 'public' => false.
For most stores and extensions, no action is required. Product shipping classes can still be created, assigned to products, read from products, and used by shipping logic. The change affects code that treats product_shipping_class as a publicly viewable or publicly queryable taxonomy.
What changed
Before WooCommerce 11.0, product_shipping_class was registered without an explicit public value. Because WordPress defaults taxonomy public to true, some WordPress APIs treated product shipping classes as viewable public taxonomies.
Starting in WooCommerce 11.0:
is_taxonomy_viewable( 'product_shipping_class' ); // falseThis follows WordPress’ taxonomy registration behavior: when public is false and no separate publicly_queryable value is provided, publicly_queryable inherits the false value. is_taxonomy_viewable() returns the taxonomy object’s publicly_queryable value, so product shipping classes are no longer considered viewable.
Why WooCommerce is making this change
Product shipping classes are designed to group products for shipping calculations. They are not intended to behave like customer-facing catalog taxonomies such as product categories or product tags.
Historically, the taxonomy’s public behavior could leak into places that rely on WordPress taxonomy visibility, including sitemap generation, taxonomy archive handling, query builders, and integrations that enumerate public taxonomies. That meant some extensions and site owners had to work around shipping classes appearing in public-facing contexts even though shipping classes are operational data.
Marking the taxonomy private fixes that root behavior in WooCommerce core.
Who may be affected
Review your code if it does any of the following:
- Checks
is_taxonomy_viewable( 'product_shipping_class' )and expectstrue. - Builds front-end taxonomy archive links for product shipping classes.
- Includes
product_shipping_classin sitemap, SEO, navigation, or public query integrations because it previously appeared public. - Enumerates public taxonomies with
get_taxonomies()and expects product shipping classes to be included. - Registers custom REST, GraphQL, search, or filtering behavior based on public taxonomy status.
- Uses
product_shipping_classas a general-purpose product grouping taxonomy outside shipping logic.
Code that assigns shipping classes to products, reads assigned shipping classes, calculates shipping methods, or manages shipping classes through WooCommerce settings should continue to work.
What developers should do
If your extension only uses product shipping classes for shipping calculations, no changes should be needed.
If your theme or extension intentionally exposed product shipping classes in public-facing contexts, update it so that behavior is explicit. Do not rely on WooCommerce core registering the taxonomy as public.
For example, if you need to continue treating product shipping classes as publicly queryable for a specific site or extension, you can alter the taxonomy registration arguments:
add_filter(
'register_product_shipping_class_taxonomy_args',
function ( $args ) {
$args['public'] = true;
$args['publicly_queryable'] = true;
return $args;
}
);Only use this kind of override if you have a clear need for public shipping-class URLs or public taxonomy discovery. In most cases, a better long-term approach is to use a customer-facing taxonomy such as product categories, product tags, product attributes, or a custom taxonomy designed for public display.
This is a visibility change, not a data migration. Existing product shipping class terms are not removed, product assignments are not changed, and shipping-rate configuration should remain intact.
Leave a Reply