{
  "slug": "bw-ai-schema-pro",
  "name": "BW AI Schema Pro",
  "version": "2.2.0",
  "download_url": "https://plugins.bowden.works/wp-content/uploads/plugin-updates/bw-ai-schema-pro-2.2.0.zip",
  "download_hash": "sha256:63d0d173c530150f4b640dd694bb04778f18a3cdc21f1e58c061aabba2057c10",
  "download_size": 392148,
  "requires": "6.0",
  "tested": "",
  "requires_php": "7.4",
  "last_updated": "2026-05-30",
  "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.2.0] - 2026-05-28\n\n### Fixed (recurring \"wrong byline link / 404 author\" bug on Kadence sites)\n- **Byline link `href` is now correctly overridden server-side** when a\n  post has a team-member author override (e.g. risealliance.com's\n  /resource/ posts displayed by Robert DiNozzi).\n  Previously: `the_author` filter overrode the *display name* only;\n  the link `href` still pointed at the WP author archive\n  `/author/{post_author}/`. A wp_footer JavaScript rewriter masked\n  this by replacing the visible text after page load, so the byline\n  *looked* right but the link still went to the wrong place — and\n  bots / paste-the-URL users hit 404s. Now three filters work\n  together server-side:\n  - `get_the_author_display_name` -> overrides byline name\n  - `get_the_author_user_url` -> overrides Kadence's preferred href\n    source (`get_the_author_meta('url')`). This is the actual filter\n    Kadence prefers — note WP renames the `url` field to `user_url`\n    internally, so the filter is `get_the_author_user_url`, not\n    `get_the_author_url`.\n  - `author_link` -> overrides the byline href when themes use\n    `get_author_posts_url()` instead (fallback)\n  All three are scoped to: singular-post context, same author as the\n  queried post. Comments, widgets, user-profile reads elsewhere are\n  untouched. The `the_author` filter and the JS rewriter remain in\n  place as belt-and-braces.\n- **`/author/USERNAME/` redirect has a fallback now.** The\n  `_bw_schema_linked_user` meta on the team page (the configuration\n  pointer that historically drifts due to UpdraftPlus restores,\n  \"Rewrite & Republish,\" CSV reimports, etc.) is no longer the only\n  way to resolve the redirect target. When that meta is empty, the\n  plugin now looks at recent posts authored by the visited WP user\n  for one with a team-member schema author override, and redirects\n  to that team page. This rescues the common drift case without\n  requiring the user to keep the meta synced manually.\n- **Admin notice on the team CPT edit screen** when this team page\n  is referenced as a schema author on at least one post but has no\n  Linked WordPress User set. Loud yellow banner with copy that\n  points at the field to fix. Prevents the bad state from being\n  silent — even if the byline link works (via the new\n  `author_link` filter), this still flags the config gap so the\n  /author/X/ redirect stays solid.\n\n### Added (manual admin intake — Path 1)\n- **New admin page: Add team info manually.** Reachable from the\n  \"Add team info manually\" button at the top of the Team Surveys\n  queue, and from the empty-queue state. Renders the same survey\n  questions in admin context, lets admin pick an existing team member\n  or create a new draft, and on save creates a response with\n  `status=structured` (skips moderator triage — admin is trusted) with\n  the structured payload pre-filled by the deterministic raw→structured\n  parser. Lands the admin on the Schema Review tab so they can refine\n  before publishing.\n- Empty-queue state now surfaces both intake paths (manual entry,\n  public survey link) so first-time users know how to start.\n\n### Fixed (rewrite registration — 404 on the survey link)\n- **`register_rewrite()` is now called directly from\n  `BW_Schema_Survey::init()` instead of being hooked onto `init` at the\n  same priority as the caller.** `WP_Hook`'s priority foreach iterates\n  an array copy of the bucket, so a same-priority callback added during\n  iteration never fires on the current request — meaning the rule was\n  missing from `extra_rules_top` on every request, and a follow-up\n  `flush_rewrite_rules()` (from a permalink resave, etc.) would wipe\n  the activation-time rule out of the DB-stored `rewrite_rules` option.\n- **Added one-shot version-tracked auto-flush** via\n  `BW_Schema_Survey::maybe_flush_rewrites()`, gated on the\n  `bw_schema_survey_rewrite_version` option. Handles file-only deploys\n  (no activation cycle) so the rule lands in the DB on the next request\n  without needing the user to deactivate/reactivate or visit Settings →\n  Permalinks. Subsequent requests are a single option lookup; the\n  flush runs at most once per deploy.\n- Settings handlers for slug change and token rotation now also\n  re-register the rewrite, flush, and bump the version option in one\n  shot — so URL rotation invalidates the old URL immediately.\n\n### Added (Team Survey workflow — Phase 1)\n- **New module: Team Survey workflow** for collecting team-member info\n  in-WordPress instead of via Google Forms. Replaces the out-of-band\n  intake process with a four-stage pipeline: public survey → moderator\n  triage → schema-shaped review → publish to live Person-schema fields.\n  See `docs/SPEC-team-survey.md` for the full spec.\n- Public survey page at `/{slug}/{token}/` (default\n  `/bw-team-survey/<token>/`), served via a plugin-owned rewrite rule.\n  Robots-blocked (`<meta robots noindex>` + `X-Robots-Tag` header) so\n  the rotatable token never lands in any index.\n- Time-limited open window: admin opens the survey for up to 7 days at\n  a time, with a \"Renew\" action for up to another 7 days. Survey is\n  closed by default until explicitly opened.\n- New DB table `{prefix}bw_schema_survey_responses` for staging\n  responses (raw + structured payloads, status, moderator notes).\n  Installed via dbDelta on activation/upgrade; schema version tracked\n  in `bw_schema_survey_db_version`.\n- New capability `bw_schema_moderate_team_surveys`. Granted to\n  administrators by default; settings toggle to also grant to editors.\n- Admin pages under the existing AI Schema Pro options menu: queue,\n  per-submission detail (triage / schema review / publish tabs),\n  settings (open/renew, regenerate URL, notifications, capability\n  grant).\n- Holding queue for \"I'm not listed\" submissions — moderator\n  graduates them to a team CPT draft before they enter the workflow.\n- Anti-abuse: honeypot field, 3-second time-trap, IP rate-limit\n  (5/hour, same pattern as `BW_Schema_Security::check_rate_limit()`),\n  WP nonce on the form. No CAPTCHA — moderation gating is the primary\n  defense.\n- Precondition gate: workflow is hidden / closed until a team post\n  type is mapped in the existing AI Schema Pro settings.\n\n### Notes\n- AI features (mosiah-backed research and parse assists) are\n  intentionally **out of scope for 2.2.0** — Phase 2 / 2.3.0+. The\n  data model is AI-agnostic so Phase 2 layers on without schema\n  changes. See `docs/SPEC-team-survey.md` § Phase 2 for the planned\n  contract.\n- All new code lives under the grandfathered `bw_schema_*` prefix per\n  `CLAUDE.md` § Pre-existing-plugin exception. The 3.0.0 rename will\n  migrate the new keys alongside the existing ones."
}
