{"id":370741,"date":"2026-09-24T18:24:19","date_gmt":"2026-09-24T18:24:19","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/dovi-tabbed-faq\/"},"modified":"2026-09-24T21:10:22","modified_gmt":"2026-09-24T21:10:22","slug":"tabbed-faq","status":"publish","type":"plugin","link":"https:\/\/roh.wordpress.org\/plugins\/tabbed-faq\/","author":16261374,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.7","stable_tag":"1.0.7","tested":"7.1.2","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Tabbed FAQ","header_author":"Dovi Solutions","header_description":"Brandless tabbed FAQ accordion with FAQPage schema and CSV importer.","assets_banners_color":"2e5881","last_updated":"2026-09-24 21:10:22","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/www.dovisolutions.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":55,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","changelog"],"tags":{"1.0.6":{"tag":"1.0.6","author":"dovidev","date":"2026-09-24 20:04:36","revision":3711951},"1.0.7":{"tag":"1.0.7","author":"dovidev","date":"2026-09-24 21:10:22","revision":3712022}},"upgrade_notice":{"1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3711859,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3711859,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3711859,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3711859,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.6","1.0.7"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3711951,"resolution":"1","location":"assets","locale":"","width":920,"height":1207},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3711951,"resolution":"2","location":"assets","locale":"","width":920,"height":512},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3711951,"resolution":"3","location":"assets","locale":"","width":1440,"height":1000},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3711951,"resolution":"4","location":"assets","locale":"","width":1440,"height":610},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3711951,"resolution":"5","location":"assets","locale":"","width":1440,"height":480}},"screenshots":{"1":"The front-end FAQ, with a tab per category and the first answer open.","2":"Opening straight to one category with default_category.","3":"FAQs are edited as an ordinary post type. The title is the question, the content is the answer.","4":"The shortcode reference built into the FAQs menu.","5":"The CSV importer, for bringing a whole FAQ set in at once."}},"plugin_section":[],"plugin_tags":[1741,1643,2516,1117,2148],"plugin_category":[43,55],"plugin_contributors":[280968],"plugin_business_model":[],"class_list":["post-370741","plugin","type-plugin","status-publish","hentry","plugin_tags-accordion","plugin_tags-faq","plugin_tags-json-ld","plugin_tags-schema","plugin_tags-tabs","plugin_category-customization","plugin_category-seo-and-marketing","plugin_contributors-dovidev","plugin_committers-dovidev"],"banners":{"banner":"https:\/\/ps.w.org\/tabbed-faq\/assets\/banner-772x250.png?rev=3711859","banner_2x":"https:\/\/ps.w.org\/tabbed-faq\/assets\/banner-1544x500.png?rev=3711859","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/tabbed-faq\/assets\/icon-128x128.png?rev=3711859","icon_2x":"https:\/\/ps.w.org\/tabbed-faq\/assets\/icon-256x256.png?rev=3711859","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/tabbed-faq\/assets\/screenshot-1.png?rev=3711951","caption":"The front-end FAQ, with a tab per category and the first answer open."},{"src":"https:\/\/ps.w.org\/tabbed-faq\/assets\/screenshot-2.png?rev=3711951","caption":"Opening straight to one category with default_category."},{"src":"https:\/\/ps.w.org\/tabbed-faq\/assets\/screenshot-3.png?rev=3711951","caption":"FAQs are edited as an ordinary post type. The title is the question, the content is the answer."},{"src":"https:\/\/ps.w.org\/tabbed-faq\/assets\/screenshot-4.png?rev=3711951","caption":"The shortcode reference built into the FAQs menu."},{"src":"https:\/\/ps.w.org\/tabbed-faq\/assets\/screenshot-5.png?rev=3711951","caption":"The CSV importer, for bringing a whole FAQ set in at once."}],"raw_content":"<!--section=description-->\n<p>Tabbed FAQ creates a structured FAQ system using a custom post type and category taxonomy, rendered via a shortcode. It is framework-agnostic (no Elementor or page builder required) and designed for large FAQ sets, SEO safety, and easy customization.<\/p>\n\n<p>Features include:\n* Custom Post Type for FAQs\n* Custom taxonomy for FAQ categories\n* Horizontal, scrollable category tabs with arrow controls\n* Accordion-style questions and answers\n* FAQPage JSON-LD schema output\n* CSV importer for bulk creation and updates\n* Shortcode-based rendering<\/p>\n\n<h3>Data Structure<\/h3>\n\n<p>Custom Post Type:\nPost Type: tabbed_faq\nSupports: Title, Editor, Menu Order, Revisions<\/p>\n\n<p>Each FAQ:\n* Title = Question\n* Content = Answer<\/p>\n\n<p>Taxonomy:\nTaxonomy: tabbed_faq_category\nUsed to generate the category tabs<\/p>\n\n<h3>Usage<\/h3>\n\n<p>Use the shortcode:<\/p>\n\n<p>[tabbed_faq]<\/p>\n\n<p>The shortcode can be placed in:\n* Pages\n* Posts\n* Shortcode blocks\n* PHP templates using do_shortcode()<\/p>\n\n<h3>Shortcode Attributes<\/h3>\n\n<p>show_all_tab (default: 1)\nShow an \u201cAll\u201d tab at the beginning.<\/p>\n\n<p>all_tab_label (default: All)\nLabel for the \u201cAll\u201d tab.<\/p>\n\n<p>default_category (default: all)\nCategory slug to load first.<\/p>\n\n<p>posts_per_page (default: 300)\nMaximum FAQs per category.<\/p>\n\n<p>orderby (default: menu_order)\nSorting field.<\/p>\n\n<p>order (default: ASC)\nSort direction.<\/p>\n\n<p>include_categories (default: empty)\nComma-separated category slugs to include.<\/p>\n\n<p>exclude_categories (default: empty)\nComma-separated category slugs to exclude.<\/p>\n\n<p>schema_mode (default: all)\nControls schema output.\nPossible values:\n* all \u2013 include all FAQs on the page (recommended)\n* active \u2013 include only the default category<\/p>\n\n<p>Examples:<\/p>\n\n<p>[tabbed_faq]<\/p>\n\n<p>[tabbed_faq default_category=\"vehicle-care\"]<\/p>\n\n<p>[tabbed_faq include_categories=\"technical,services\"]<\/p>\n\n<p>[tabbed_faq schema_mode=\"active\"]<\/p>\n\n<h3>FAQ Schema Behavior<\/h3>\n\n<p>By default (schema_mode=\"all\"):<\/p>\n\n<ul>\n<li>Outputs a single FAQPage JSON-LD block<\/li>\n<li>Includes all FAQs rendered on the page<\/li>\n<li>Merges schema from multiple shortcodes into one block<\/li>\n<\/ul>\n\n<p>When using schema_mode=\"active\":<\/p>\n\n<ul>\n<li>Only FAQs from the default category are included in schema<\/li>\n<\/ul>\n\n<p>Schema output:\n* Is generated from actual FAQ content\n* Is printed once per page in the document head\n* Is safe for SEO and Google FAQ guidelines<\/p>\n\n<h3>CSV Importer<\/h3>\n\n<p>Accessible via:\nFAQs \u2192 Import FAQs<\/p>\n\n<p>CSV requirements:\n* Header row required\n* UTF-8 encoded CSV<\/p>\n\n<p>Supported columns:<\/p>\n\n<p>category (required)\nCategory name or slug<\/p>\n\n<p>question (required)\nFAQ question<\/p>\n\n<p>answer (required)\nFAQ answer (HTML allowed)<\/p>\n\n<p>id (optional)\nExisting FAQ post ID to update<\/p>\n\n<p>slug (optional)\nPost slug to match\/update<\/p>\n\n<p>Update modes:\n* Prefer ID, then Slug (default)\n* Slug only\n* Always create new<\/p>\n\n<p>If no match is found, a new FAQ is created automatically.<\/p>\n\n<h3>Styling<\/h3>\n\n<p>Default styles are located at:\nassets\/css\/tabbed-faq.css<\/p>\n\n<p>Key CSS selectors:\n.tabbed-faq\n.tabbed-faq__tabs\n.tabbed-faq__tab\n.tabbed-faq__accordion\n.tabbed-faq__item\n.tabbed-faq__toggle\n.tabbed-faq__answer<\/p>\n\n<p>Styles may be overridden in the theme or by dequeuing the stylesheet.<\/p>\n\n<h3>JavaScript<\/h3>\n\n<p>JavaScript file:\nassets\/js\/tabbed-faq.js<\/p>\n\n<p>Handles:\n* Tab switching\n* Horizontal tab scrolling\n* Accordion open\/close behavior\n* ARIA attribute updates<\/p>\n\n<p>No external dependencies.<\/p>\n\n<h3>Accessibility<\/h3>\n\n<ul>\n<li>Tabs use proper tablist and tab roles<\/li>\n<li>Accordion buttons use aria-expanded and aria-controls<\/li>\n<li>Only one accordion item is open per category at a time<\/li>\n<\/ul>\n\n<h3>Performance<\/h3>\n\n<ul>\n<li>Uses get_posts() for data retrieval<\/li>\n<li>No AJAX requests<\/li>\n<li>Schema generated once per page<\/li>\n<li>Suitable for large FAQ sets<\/li>\n<\/ul>\n\n<h3>Uninstall<\/h3>\n\n<p>Deactivating the plugin:\n* Removes frontend output\n* Does not delete FAQ posts or categories<\/p>\n\n<p>Manual cleanup requires deleting tabbed_faq posts and taxonomy terms.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin ZIP via Plugins \u2192 Add New \u2192 Upload Plugin<\/li>\n<li>Activate the plugin<\/li>\n<li>A new \u201cFAQs\u201d menu will appear in the WordPress admin<\/li>\n<\/ol>\n\n<!--section=changelog-->\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>Fixed: the FAQs list table rendered two identical category columns.<\/li>\n<li>The shortcode examples on the Shortcodes page now use generic category slugs.<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Fixed: the activation routine never ran, so rewrite rules were not flushed on activation.<\/li>\n<li>Hardened the FAQPage JSON-LD output against answer content containing HTML.<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Renamed to Tabbed FAQ for the WordPress.org directory.<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Security: FAQ answers are passed through wp_kses_post() on output; uploaded CSV path is validated with is_uploaded_file().<\/li>\n<li>Code: replaced short echo tags; added plugin header requirements.<\/li>\n<li>Prepared for WordPress.org (Plugin Check clean).<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Cleaned up ready to go<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Added Column, Bulk and Quick editing for Tabbed FAQ Categories<\/li>\n<li>Changed category to hierarchical like post categories<\/li>\n<li>Made import an AJAX process<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<p>Added Plugin Update Checker<\/p>\n\n<h4>1.0.0<\/h4>\n\n<p>Initial release.\nTabbed FAQ CPT, taxonomy, shortcode rendering, schema output, and CSV importer.<\/p>","raw_excerpt":"Lightweight tabbed FAQ accordion with category tabs, FAQPage schema output and a CSV importer. No page builder required.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/roh.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/370741","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/roh.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/roh.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/roh.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=370741"}],"author":[{"embeddable":true,"href":"https:\/\/roh.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/dovidev"}],"wp:attachment":[{"href":"https:\/\/roh.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=370741"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/roh.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=370741"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/roh.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=370741"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/roh.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=370741"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/roh.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=370741"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/roh.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=370741"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}