{
  "slug": "bw-ai-schema-pro",
  "name": "BW AI Schema Pro",
  "version": "2.3.0",
  "download_url": "https://plugins.bowden.works/wp-content/uploads/plugin-updates/bw-ai-schema-pro-2.3.0.zip",
  "download_hash": "sha256:a1b1c15b1c413cb70afe8c1728a3fc82f6d4e8244cb6b6608aee6390fd3f8b29",
  "download_size": 414745,
  "requires": "6.0",
  "tested": "",
  "requires_php": "7.4",
  "last_updated": "2026-06-05",
  "homepage": "https://plugins.bowden.works/bw-ai-schema-pro/",
  "author": "Bowden Works",
  "description": "Advanced Schema Markup plugin optimized for AI era - Enhance your content's visibility and understanding by AI systems with comprehensive schema markup.",
  "changelog": "## [2.3.0] - 2026-06-05\n\n### Added (Post FAQ module)\n- **New module: Post FAQ.** Attach a question-and-answer list to any\n  supported post type via a sortable metabox on the post-edit screen,\n  rendered on the front-end as an inline FAQ section accompanied by\n  FAQPage JSON-LD. Pattern adapted from the stackd-consulting child-theme\n  implementation, generalized to work without TotalWP.\n- **Configurable insertion point.** Settings dropdown chooses how the\n  FAQ slots into the page:\n  - **After the post content** — uses the `the_content` filter, works\n    on virtually every theme. Default.\n  - **Kadence: after content, before comments** — hooks\n    `kadence_single_after_content` for tight slotting under the body.\n  - **Kadence: after the author byline / title area** — hooks\n    `kadence_single_after_entry_header`.\n  - **Genesis: after the entry** (`genesis_after_entry`, priority 12).\n  - **Astra: after the entry** (`astra_entry_after`).\n  - **GeneratePress: after content** (`generate_after_content`).\n  - **Custom hook** — text input for any action hook name on themes\n    that aren't pre-supported.\n  - **Shortcode only** — no auto-insertion. Use `[bw_schema_faq]`\n    inside the post body to place manually.\n- **Shortcode** `[bw_schema_faq]` (current post) or\n  `[bw_schema_faq post_id=\"123\"]`. Always available, even when\n  auto-insertion is set to shortcode-only. Idempotent guard prevents\n  double-rendering if both the shortcode and the auto-insert match.\n- **Per-post overrides** in the metabox:\n  - Heading (falls back to the global default)\n  - Accordion mode (inherit / on / off)\n  - Hide on this post (overrides the global enable)\n- **Global settings** in Settings → AI Schema Pro → Settings:\n  - Enable Post FAQ\n  - Post types\n  - Default heading\n  - Default accordion behavior (one-open-at-a-time vs all-expanded)\n  - Insertion point + custom-hook input\n- **Minimal CSS.** Renders inline, uses `currentColor` and `em` units\n  so it inherits typography and link color from the surrounding theme.\n  No external stylesheet, no jQuery on the front-end — accordion is\n  vanilla JS, idempotent, no dependencies.\n- **Storage keys** (post meta): `_bw_schema_post_faq_items`,\n  `_bw_schema_post_faq_heading`, `_bw_schema_post_faq_accordion`,\n  `_bw_schema_post_faq_disable`. Settings option:\n  `bw_schema_post_faq_settings`.\n- Independent of the existing `BW_Schema_FAQ` schema class — that one\n  generates FAQPage schema for users who manually set a post's schema\n  type to FAQPage and write into `_bw_schema_faq_items`. The new module\n  has its own data store and emits its own inline JSON-LD so a regular\n  Article-schema'd post can carry an FAQPage block as a parallel,\n  visible section without the two systems fighting.\n\n### Added (Post FAQ — universal CSS-selector insertion + heading styles)\n- **New insertion mode: \"Insert at an HTML element (CSS selector)\".**\n  For themes and page builders that don't expose a clean action hook\n  (Elementor, Bricks, Divi, WPBakery, etc., plus any theme we\n  haven't seen yet). The admin enters a CSS selector and a position\n  (after / before the element, or inside at the start/end). On the\n  front-end, the FAQ is server-rendered inside a hidden `<div hidden>`\n  container in the footer; a tiny vanilla-JS snippet locates the\n  selector at DOMContentLoaded and moves the FAQ next to it via\n  `insertAdjacentElement`. If the selector doesn't match, the FAQ\n  stays hidden (better silent than wrong-place). The FAQPage JSON-LD\n  is inside the hidden container too, but JSON-LD is DOM-parsed\n  regardless of CSS display state so schema validators still see it.\n- **Zero JS cost when not in selector mode.** The DOM-injection\n  snippet is only emitted when \"Insert at an HTML element\" is the\n  active insertion mode. Other modes (`the_content`, Kadence, etc.)\n  emit no extra JS at all.\n- **New \"Heading color\" and \"Heading size\" settings.** Both optional.\n  Heading color is gated behind an \"Override the theme color\"\n  checkbox so the default behavior (inherit from theme) is preserved\n  unless the admin explicitly opts in. Heading size is a preset\n  dropdown (Inherit / 0.9em / 1em / 1.1em / 1.25em / 1.5em / 2em).\n  When set, both are emitted as inline `style=\"...\"` on the section's\n  H2 only.\n- Reordered the insertion-mode dropdown so \"Custom action hook\" is\n  clearly labeled as advanced and sits next to the new selector\n  option. Renamed from \"Custom hook\" → \"Custom action hook\" to make\n  its scope explicit (only `add_action` hooks; filters and shortcode\n  interception use the CSS-selector path instead)."
}
