WooCommerce includes three default tabs on every product page: “Description”, “Additional Information”, and “Reviews”. These are called Product Data Tabs, and WooCommerce provides a filter hook that lets you remove, rename, reorder, customize, or add new tabs entirely.
All the code snippets in this guide use the woocommerce_product_tabs filter. Add them to your functions.php file in your child theme, or in a custom plugin.
If it’s not clear, these are the tabs that appear below the product itself, as shown in the following image (they may look different depending on your theme):

“Product tabs can be removed, renamed, re-ordered and customized using the woocommerce_product_tabs filter.” – WooCommerce official documentation.
Removing Tabs
Use unset() on the tab keys to remove specific tabs. The three default tab keys are description, reviews, and additional_information:
add_filter( 'woocommerce_product_tabs', function( $tabs ) {
unset( $tabs['description'] );
unset( $tabs['reviews'] );
unset( $tabs['additional_information'] );
return $tabs;
}, 98 );Remove only the tabs you don’t need. For example, if you want to keep the description but remove reviews and additional information, only unset those two.
Renaming Tabs
Change the title property of each tab to rename it. Always check with isset() first, since a tab might not exist for every product:
add_filter( 'woocommerce_product_tabs', function( $tabs ) {
if ( isset( $tabs['description'] ) ) {
$tabs['description']['title'] = __( 'More Information', 'woocommerce' );
}
if ( isset( $tabs['reviews'] ) ) {
$tabs['reviews']['title'] = __( 'Ratings', 'woocommerce' );
}
if ( isset( $tabs['additional_information'] ) ) {
$tabs['additional_information']['title'] = __( 'Product Data', 'woocommerce' );
}
return $tabs;
}, 98 );Always use isset() before modifying a tab’s properties. The “Additional Information” tab only exists when the product has attributes, dimensions, or weight. Accessing it without checking first will trigger a PHP warning.
Reordering Tabs
Change the priority value to control tab order. Lower numbers appear first:
add_filter( 'woocommerce_product_tabs', function( $tabs ) {
if ( isset( $tabs['reviews'] ) ) {
$tabs['reviews']['priority'] = 5;
}
if ( isset( $tabs['description'] ) ) {
$tabs['description']['priority'] = 10;
}
if ( isset( $tabs['additional_information'] ) ) {
$tabs['additional_information']['priority'] = 15;
}
return $tabs;
}, 98 );The default priorities are: Description (10), Additional Information (20), Reviews (30). Adjust these numbers to place tabs in any order you want.
Customizing Tab Content
Replace a tab’s callback to change its content entirely:
add_filter( 'woocommerce_product_tabs', function( $tabs ) {
if ( isset( $tabs['description'] ) ) {
$tabs['description']['callback'] = 'savvy_custom_description_content';
}
return $tabs;
}, 98 );
function savvy_custom_description_content() {
echo '<h2>Customized Description</h2>';
echo '<p>Here is your custom description content.</p>';
}The callback function replaces everything inside the tab panel. You can output any HTML, pull content from custom fields, or call other template functions.
Adding a Custom Tab
Add a new entry to the $tabs array with a unique key, a title, a priority, and a callback function:
add_filter( 'woocommerce_product_tabs', function( $tabs ) {
$tabs['usage_instructions'] = array(
'title' => __( 'Usage Instructions', 'woocommerce' ),
'priority' => 50,
'callback' => 'savvy_usage_instructions_content',
);
return $tabs;
} );
function savvy_usage_instructions_content() {
echo '<h2>Usage Instructions</h2>';
echo '<p>Follow these steps to use this product...</p>';
}In most cases, you’ll want to pull the tab content from a custom field rather than hardcoding it. You can use Advanced Custom Fields to create a field on the product page, then display its value in the callback using get_field().
Displaying Tabs for Specific Products or Product Types
Use global $product inside the filter callback to add conditional logic. For example, show a tab only for a specific product:
add_filter( 'woocommerce_product_tabs', function( $tabs ) {
global $product;
if ( $product->get_id() === 5 ) {
$tabs['special_tab'] = array(
'title' => __( 'Special Info', 'woocommerce' ),
'priority' => 25,
'callback' => 'savvy_special_tab_content',
);
}
return $tabs;
} );Or show a tab only for variable products:
add_filter( 'woocommerce_product_tabs', function( $tabs ) {
global $product;
if ( $product->is_type( 'variable' ) ) {
$tabs['sizing_guide'] = array(
'title' => __( 'Sizing Guide', 'woocommerce' ),
'priority' => 25,
'callback' => 'savvy_sizing_guide_content',
);
}
return $tabs;
} );You can use any product method for conditions: is_type(), get_category_ids(), is_virtual(), is_downloadable(), and more.
The “Additional Information” Tab
The “Additional Information” tab is a special case. WooCommerce only displays it when the product has attributes, dimensions, or weight defined (not attributes used for variations).
If you try to modify this tab on a product that doesn’t have those properties, you’ll get a PHP warning:
Warning: call_user_func() expects parameter 1 to be a valid callback, no array or string given in .../templates/single-product/tabs/tabs.php on line 35To avoid this, always check with WooCommerce’s built-in methods before modifying the tab:
add_filter( 'woocommerce_product_tabs', function( $tabs ) {
global $product;
if ( $product->has_attributes() || $product->has_dimensions() || $product->has_weight() ) {
$tabs['additional_information']['title'] = __( 'Specifications', 'woocommerce' );
}
return $tabs;
}, 98 );The three methods you can use are has_attributes(), has_dimensions(), and has_weight().
Overriding the Tabs Template
For deeper customization beyond what the woocommerce_product_tabs filter provides, you can override WooCommerce’s tab template directly. Copy the template file from the plugin to your child theme:
From: wp-content/plugins/woocommerce/templates/single-product/tabs/tabs.php
To: wp-content/themes/your-child-theme/woocommerce/single-product/tabs/tabs.phpThis gives you full control over the tab markup, including the HTML structure, CSS classes, and how tabs are rendered. Use this approach when you need to change the tab UI itself (e.g., switching from horizontal tabs to an accordion layout).
Template overrides require maintenance. When WooCommerce updates the template, you’ll need to check if your override is still compatible. The woocommerce_product_tabs filter is the safer option for most tab customizations, since it doesn’t depend on the template structure.
FAQs
Common questions about WooCommerce product data tabs:
woocommerce_product_tabs filter hook. It receives an array of all product tabs, where each tab has a title, callback, and priority. You can modify this array to add, remove, rename, or reorder tabs.unset( $tabs['reviews'] ); inside a function hooked to the woocommerce_product_tabs filter. Alternatively, you can disable reviews entirely in WooCommerce > Settings > Products > General by unchecking "Enable product reviews".get_field( 'your_field_name' ) inside your tab's callback function. You can conditionally show the tab only when the field has content by checking the field value inside the woocommerce_product_tabs filter before adding the tab.Summary
WooCommerce’s woocommerce_product_tabs filter gives you full control over product page tabs. You can remove tabs with unset(), rename them by changing the title property, reorder them with priority, replace their content with a custom callback, or add entirely new tabs.
Always use isset() checks before modifying existing tabs, especially the “Additional Information” tab which only exists when the product has attributes, dimensions, or weight.
For deeper structural changes, override the tab template in your child theme – but prefer the filter approach when possible, since it’s more resilient to WooCommerce updates.

