Configuration
Dieser Inhalt ist noch nicht in deiner Sprache verfügbar.
Tabby has one settings screen and a deliberately small set of options. Everything lives under WooCommerce → Tabby Tabs, stored in a single tabby_settings option. The save capability is manage_woocommerce, so shop managers can edit tabs without a full admin account.
Enable Tabby
Section titled “Enable Tabby”The master switch in the General section, on by default. Turn it off to hide every tab on the storefront at once without deleting them, your tabs stay saved and reappear when you turn it back on. While off, Tabby contributes no tabs and does not enqueue its front-end stylesheet.
The Tabs section is a repeating list. Each row is one reusable tab and has three fields:
- Tab title, the label in the product tab strip and the heading printed above the tab content. Sanitised with
sanitize_text_fieldon save. A row with a blank title is dropped on save, so leaving a row empty is how you discard it. - Enabled, a per-tab toggle. Unticked rows are saved but not rendered on the storefront, so you can park a tab without losing its content.
- Tab content, the body, sanitised with
wp_kses_poston save (see Allowed HTML).
Tabs render on every single product page, in the order listed on this screen, after the native WooCommerce tabs. Use Add tab to append a row and the × button to remove one; the list is reindexed automatically.
Tab slugs
Section titled “Tab slugs”On save, each tab is given a stable slug derived from its title with sanitize_key (for example Shipping & Returns becomes shipping-returns). If two tabs would produce the same slug, Tabby appends _1, _2 and so on so each stays unique. The slug is the tab’s internal key, used in the panel’s HTML id (tab-tabby_<slug>), and is not separately editable.
Allowed HTML in tab content
Section titled “Allowed HTML in tab content”Tab content is sanitised with WordPress’s wp_kses_post, the same safe subset allowed in post content:
- Links, ordered and unordered lists
- Headings, paragraphs, line breaks
- Bold, italic and other inline emphasis
- Images
- Blockquotes and similar block elements
Scripts, iframes and other unsafe markup are stripped. Sanitisation runs on save and again on render, and on render the stored content is also passed through wpautop, so plain line breaks become paragraphs the way they do in a post.
What is fixed by design
Section titled “What is fixed by design”A few behaviours are deliberately not settings:
- Tabs always render after the native WooCommerce tabs (the filter runs at priority
98, and each tab is added at priority100and up). There is no before/after placement option. - Tabs always appear on every product. There is no per-product tab editor and no per-product hiding in the free plugin.
- A tab with a title but empty content renders only its heading, not an empty content box.
Storage and cleanup
Section titled “Storage and cleanup”All configuration lives in one option, tabby_settings (the master toggle plus the global_tabs array). Tabby creates no custom database tables and writes no post meta. A second option, tabby_db_version, records the schema version so future updates can migrate safely.
Deleting the plugin from the Plugins screen runs the uninstall routine, which removes both tabby_settings and tabby_db_version. Nothing is sent to any external service.
Theming the tab panels (CSS)
Section titled “Theming the tab panels (CSS)”Tabby’s panels are styled with --tabby-* custom properties, the index-divider edge colour, its width, the reserved gutter and the open-tab animation timing, scoped to panels whose id starts with tab-tabby_. Override them from your theme stylesheet to re-skin Tabby without touching the native panels:
.woocommerce-tabs .panel[id^="tab-tabby_"] { --tabby-edge: #2563eb; /* the index-tab edge colour */ --tabby-edge-width: 3px; /* its thickness */}The panels carry a built-in dark-scheme palette (via prefers-color-scheme) and the short “file into place” open animation is disabled automatically under prefers-reduced-motion. Tabby ships no theme-overridable PHP template, the panel markup is a heading and a content <div>, restyled entirely through these CSS tokens.
Extending Tabby (developers)
Section titled “Extending Tabby (developers)”After Tabby gathers the enabled tabs for a product it passes them through one filter before WooCommerce renders them:
add_filter( 'tabby/resolved_tabs', function ( array $tabs, ?WC_Product $product ): array { // $tabs is an array of Tabby\Domain\Tab value objects, in render order. // $product is the product being rendered, when WooCommerce has set it.
// Example: hide a tab on a specific product. if ( $product && 123 === $product->get_id() ) { $tabs = array_filter( $tabs, fn ( $tab ) => 'warranty' !== $tab->id ); }
return array_values( $tabs );}, 10, 2 );Each item is a Tabby\Domain\Tab with readonly id, title, content, enabled and source properties. Anything you return that is not a Tab instance is dropped before rendering, so the renderer never receives a foreign shape. This is the same hook Tabby Pro’s category-scoping uses. (The tabby/booted action is an internal boot signal for add-ons, not a content hook.)