PN Scripts Tabwise – Custom Product Tabs & FAQ
WooCommerce plugin: custom and global product tabs, FAQ tabs with schema, block-theme support and one-click import from YIKES Custom Product Tabs. By PN Scripts.
by PN Scripts · github.com/pnscripts/woocommerce-product-tabs · website
Install
No release zip yet. The repository archive installs, but the folder name will carry the branch suffix and updates will not flow:
wp plugin install https://github.com/pnscripts/woocommerce-product-tabs/archive/refs/heads/main.zipCustom product tabs for WooCommerce: per-product tabs, reusable global tabs by category or tag, FAQ tabs with optional FAQPage schema, a manager for the default Description / Additional information / Reviews tabs, and a one-click importer from Custom Product Tabs for WooCommerce by YIKES (80,000+ installs, last release 2025-04).
- WordPress.org slug / text domain:
pnscripts-tabwise(not submitted yet; renamed from PN Scripts Product Tabs /pnscripts-product-tabsin 1.0.3) - Requires PHP 8.1+, WordPress 6.5+, WooCommerce 9.0+; tested with WordPress 7.1.2 and WooCommerce 11.1.2
- Licence: GPL-2.0-or-later. Copyright © 2026 ПН СКРИПТС ЕООД (PN Scripts)
Features (all free)
| Area | What it does |
|---|---|
| Product tabs | Product data → Custom tabs: rich text (classic editor) or FAQ tabs, drag to reorder, switch off, link global tabs, hide global or default tabs on one product |
| Global tabs | Products → Product tabs (block editor): all products, categories (with subcategories) or tags, or manual; own priority |
| Default tabs | Products → Tab settings (edit.php?post_type=product&page=pnscripts-tabwise; the 1.0.x page=pnscripts-product-tabs redirects): rename (Reviews title supports %d), reorder, hide; keep Reviews last |
| FAQ | Native <details> list, one merged FAQPage JSON-LD per product page (per-tab and store-wide switches) |
| Themes | Classic templates, legacy Product Details block, and the accordion Product Details block (WooCommerce 10+): custom tabs are placed by priority and default tabs renamed/hidden there too |
| YIKES import | Dry run, batches of 100, re-runnable (hash per product), undo, YIKES data never written; storefront identical after import; YIKES copies hidden while both are active; wp pnscripts-tabwise import-yikes [--dry-run|--undo] (1.0.x alias wp pnscripts-product-tabs) |
| Compatibility | HPOS and cart/checkout blocks declared; no queries per tab (one cached index option); no storefront JavaScript |
| i18n | languages/pnscripts-tabwise.pot plus bg_BG, de_DE, pl_PL (.po, .mo, .l10n.php) |
| Uninstall | Keeps data unless "Delete all tabs and settings…" is on; multisite aware |
Data model
The code prefix did not change with the 1.0.3 rename: namespace Pnscripts\ProductTabs, constants PNSCRIPTS_PRODUCT_TABS_*,
hooks, options and meta pnscripts_product_tabs*, CPT pnscripts_ptab, REST base wp/v2/pnscripts-product-tabs, CSS classes and
asset handles pnscripts-product-tabs*. Existing tabs and settings are kept.
| Data | Where |
|---|---|
| Product tabs | product meta _pnscripts_product_tabs (list of {id, type: content|faq|global, title, content, faq, schema, global_id, enabled, origin}) |
| Hidden global / default tabs per product | _pnscripts_product_tabs_hidden_globals, _pnscripts_product_tabs_hidden_defaults |
| Global tabs | CPT pnscripts_ptab (block editor), meta _pnscripts_product_tabs_{type,faq,schema,scope,categories,tags,priority} |
| Storefront index of global tabs | option pnscripts_product_tabs_index (not autoloaded; rebuilt when a global tab changes) |
| Settings | option pnscripts_product_tabs_settings |
| Import bookkeeping | _pnscripts_product_tabs_yikes_hash, _pnscripts_product_tabs_yikes_defaults (product), _pnscripts_product_tabs_yikes_id (global tab), option pnscripts_product_tabs_yikes_last_run |
YIKES 1.8.6 data that the importer reads (verified in its source and with data written by its own UI):
post meta yikes_woo_products_tabs ([{title, id, content}], id = WooCommerce tab key), option
yikes_woo_reusable_products_tabs ([id => {tab_title, tab_name, tab_content, tab_id, tab_slug, taxonomies, global_tab}])
and option yikes_woo_reusable_products_tabs_applied ([product_id => [saved_id => {post_id, reusable_tab_id, tab_id}]]).
Hooks for add-ons (Pro)
| Hook | Use |
|---|---|
pnscripts_product_tabs_license (filter) |
Return a Licensing\LicenseInterface; the free plugin uses FreeLicense (no remote calls, nothing locked) |
pnscripts_product_tabs_global_tab_applies (filter) |
Advanced conditions and schedules: (bool $applies, array $global_tab, array $context) |
pnscripts_product_tabs_index_entry (filter) |
Store add-on rule data under extra in the cached index |
pnscripts_product_tabs_global_tab_settings / _global_tab_saved (actions) |
Extra fields in the global tab box and saving them |
pnscripts_product_tabs_resolved (filter) |
Final list of custom tabs for a product |
pnscripts_product_tabs_content, _heading, _faq_schema, _use_the_content, _accordion_integration |
Rendering |
pnscripts_product_tabs_loaded (action) |
Receives the service container (Plugin) |
Development
composer install && npm install # dev tools only; the plugin has no runtime dependencies
bin/setup-wp.sh # WordPress + WooCommerce + YIKES on SQLite in .cache/wp (no Docker/MySQL)
bin/serve.sh # http://127.0.0.1:8795 (admin/admin, local only)
WP_DIR=$PWD/.cache/wp-test bin/setup-wp.sh # pristine site for integration tests
composer lint # WPCS 3 + PHPCompatibilityWP
composer analyse # PHPStan level 8 with WordPress and WooCommerce stubs
composer test # unit tests (Brain Monkey)
WP_DIR=$PWD/.cache/wp-test composer test:integration # real WordPress + WooCommerce + YIKES 1.8.6
bin/i18n/update.sh # .pot, bundled .po/.mo/.l10n.php
bin/build-zip.sh # build/pnscripts-tabwise-<version>.zip (honours .distignore)
GLOBAL_TAB=<id> npm run screenshots # assets/screenshots/screenshot-N.png from the dev site
Minimum versions: WP_DIR=$PWD/.cache/wp-min WP_VERSION=6.5.5 WC_VERSION=9.0.2 bin/setup-wp.sh, then run the
integration suite with that WP_DIR.
Release (owner)
See the checklist in CHANGELOG.md → Unreleased notes and the WordPress.org pack in the AI Brain
(ai-brain/.skills/platforms/wordpress/directory-submission.md). Nothing has been pushed, tagged or submitted.
Trademarks
WooCommerce is a trademark of Automattic Inc.; YIKES and Custom Product Tabs for WooCommerce belong to their owners. This plugin is not affiliated with them. "PN Scripts" and "Tabwise" are trademarks of ПН СКРИПТС ЕООД and are not covered by the code licence.