One-click download of the latest production-ready zip. Always points to the most recent release — rebuilt automatically on every push.
All releases · Install instructions · How-to guide
AI-powered SEO content generator that knows your WordPress site. Generate optimized blog posts with internal linking, structured data, sitemaps, redirects, AI-crawler access control, llms.txt, on-site analytics, GSC integration, a per-post meta editor, Local SEO (LocalBusiness schema with NAP and opening hours), Image SEO (auto-alt + filename sanitization + lazy-load), Crawlers & Files (in-admin editor for /llms.txt and /robots.txt), and Backlinks (manual/CSV-import tracker with daily health monitoring) — on autopilot or on demand.
- What This Plugin Does
- Features
- Architecture
- How Each Subsystem Works
- Installation
- Quick Start
- How-To Guide: Page by Page
- Configuration Guide
- WP-CLI Commands
- REST API
- Developer Reference (Hooks)
- FAQ
- Changelog
StrataWP SEO bundles three things into one plugin:
- An AI content engine that writes site-aware blog posts (Anthropic, OpenAI, Google, xAI) with internal linking, FAQ schema, key takeaways, TOC, and featured/in-content images.
- A complete technical SEO layer — XML sitemaps, redirect manager, breadcrumbs, schema.org JSON-LD, meta editor, search appearance templates, archive SEO, RSS optimization, head cleanup, robots.txt control, and an 8-module audit.
- An AI discoverability layer — robots.txt allowlist for 15 known AI crawlers (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, etc.), a dynamic
llms.txtindex built from your post excerpts, and IndexNow batch submission for instant Bing/ChatGPT indexing.
It's designed to replace Yoast/RankMath/AIOSEO if you want to, or coexist with them (schema and meta output auto-disable when those plugins are detected).
- Multi-provider AI — Anthropic (Claude Opus 4.7, Opus 4.6, Sonnet 4.6/4.5, Haiku 4.5), OpenAI (GPT), Google (Gemini), xAI (Grok)
- Site-aware generation — analyzes existing posts, categories, and internal links before writing
- 7 content templates — Auto, Listicle, How-To Guide, Comparison, Case Study, News Analysis, Tutorial
- Voice profiles — reusable writing personas (tone, formality 1-10, sentence length, vocabulary, person, avoid/preferred phrases, sample text)
- Internal linking — keyword-based and AI-based engines with min/max controls
- FAQ sections — generates FAQ with JSON-LD
FAQPageschema - Key Takeaways — bullet-point summary with
ItemListschema - Table of Contents — auto-linked TOC at post top
- Duplicate detection — title/content similarity check (configurable threshold)
- Content scoring — rates posts on SEO quality; optional gate that holds low-scoring posts as drafts
- Cost tracking — per-provider, per-model token + USD tracking
- Rate limiting — cooldown prevents accidental double-generation
- 4 image providers — Unsplash, Pexels, Pixabay (free stock), Gemini (AI-generated)
- Auto featured image — fetched per post based on derived query
- In-content images — 1-4 contextual images placed within the body, with derived alt text
- Configurable max width — keeps file sizes sane
- Flexible scheduling — daily, twice/three-times weekly, weekly, biweekly, monthly
- Topic queue — pre-load topics with scheduled dates and template preferences (custom post type)
- Content calendar — visual calendar of scheduled and generated content
- Bulk generation — up to 5 posts in one click
- Background processor — long-running generations queued via WP cron
- AI bot allowlist — checkbox grid for 15 known crawlers (GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-Web, anthropic-ai, PerplexityBot, Perplexity-User, Google-Extended, Applebot-Extended, CCBot, Meta-ExternalAgent, Bytespider, Amazonbot, DuckAssistBot)
- robots.txt injection — allowed bots get explicit
Allow: /rules; unchecked known bots getDisallow: / - Dynamic llms.txt — served at
/llms.txt, built from your Site Description (intro) + posts/pages/categories with one-line summaries pulled from meta description → excerpt → trimmed first paragraph - Auto sitemap detection — references Yoast/RankMath/AIOSEO/WP-core sitemap URL automatically
- Sitemap index at
/sitemap_index.xmlwith post type, taxonomy, and author sub-sitemaps - Per-URL control — configurable priority and changefreq
- Image sitemap entries — image metadata in sitemap output
- Per-sitemap exclusion toggles — one-click disable for any sub-sitemap from the Sitemaps admin
- IndexNow — batch submits 50 most recently modified posts to Bing/Yandex/Seznam (Bing's IndexNow feed powers ChatGPT search)
- 301/302/307/410 redirects with exact and regex matching
- 404 monitoring — error log with one-click "create redirect" button
- Auto-redirect on slug change — preserves SEO juice when post slugs change
- Cron-pruned 404 logs — old entries auto-removed
- Keyword engine — finds keyword-anchor opportunities in existing content
- AI engine — uses your configured AI provider to suggest links based on semantic similarity
- Batch processor — runs in chunks via background processing
- Admin UI — review, accept, or skip suggestions per post
- Live SERP preview with character counters
- Per-post meta title/description, focus keyword, canonical URL
- Robots meta controls (noindex/nofollow per post)
- Open Graph + Twitter Card per-post overrides
- Breadcrumb title override
- AI Generate button for one-click meta generation
- SEO checklist with focus keyword analysis
- Conflict detection — auto-disables when Yoast/RankMath/AIOSEO is active
- Title/description templates for posts, pages, archives, taxonomies, search, 404
- Template variables —
%title%,%sitename%,%sep%,%category%,%author%, etc. - Title separator picker
- Per-term meta — title, description, canonical, robots, OG image on category/tag/taxonomy edit screens
- Frontend output — all archive meta rendered on archive pages
- HTML breadcrumbs with inline
BreadcrumbListJSON-LD - Template function, shortcode, configurable separator and home label
- Configurable before/after content injected around RSS items with template variables
- Toggle removal of WP generator tag, RSD link, shortlink, REST API link, oEmbed, emoji scripts
- 8 audit modules — Canonical URLs, XML Sitemap, Open Graph, Twitter Cards, Robots.txt, Meta Robots, Image SEO, Page Speed Hints
- Auto-fix — one-click fixes for canonical tags, OG/Twitter meta, sitemap generation
- Scheduled audits — daily, weekly, or monthly
- Dashboard widget — site health score
- CSV export
- Article (Article, BlogPosting, or NewsArticle) — auto on posts
- BreadcrumbList — on posts, pages, archives, author pages
- WebSite with optional
SearchActionfor Google sitelinks searchbox - Organization or Person with logo and
sameAssocial profiles - FAQPage and ItemList (Key Takeaways)
- Conflict detection — auto-disabled when Yoast/RankMath/AIOSEO is active
- AI keyword suggestions from seed topics
- GSC sync — automatic keyword position tracking via Google Search Console
- Striking distance — surfaces keywords ranking positions 8-20 (best win opportunities)
- On-site analytics — cookie-free, GDPR-friendly (no external services, no consent banner needed)
- Time on page, scroll depth, bounce rate
- Google Search Console OAuth — clicks, impressions, CTR, position
- Unified dashboard with Chart.js visualizations and date range filtering (7/30/90 days)
- Per-post analytics metabox — views, time, scroll depth, top GSC queries
- Sortable "Views (30d)" column in the posts list table
- Configurable retention — 30/90/180/365 days with auto-pruning
- AI Bot Analytics — server-side hit tracking for 15 known AI crawlers (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, Applebot-Extended, Bytespider, etc.) with per-bot dashboards, top crawled pages, AEO gap report, and 404 monitoring
- 30+ filters and actions — extend every part of the pipeline
- WP-CLI commands (
wp swps generate|analyze|status|queue ...) - REST API — programmatic access to generation, voice profiles, audit, analytics
- Encrypted secret storage — sensitive options (GSC client secret, remote endpoint secret) encrypted at rest
- Debug page — last failed AI response saved to a transient and viewable from the admin
- Re-score all published posts — chunked (10 posts per request) with live progress so big sites don't hit PHP timeouts
- AI proposals — concrete
find/replaceedits, plus optional new meta title/description and focus keyword, plus a projected score - Diff review modal — see old vs. new for each edit, check/uncheck individual changes before applying
- One-click apply — only accepted edits are applied; the post is automatically re-scored after
- Threshold control — surface only posts below your score floor (default 75)
- Per-row dismiss — hide posts you don't want optimized
- 30+ business types — LocalBusiness, Restaurant, Plumber, Dentist, Hotel, RealEstateAgent, Attorney, AccountingService, BeautySalon, etc.
- NAP fields — name, address (street/city/region/postal/country), phone, email, price range
- Opening hours per day — 24-hour-format inputs, with a "Closed" tick for off-days
- Geo coordinates — latitude/longitude for
GeoCoordinatesschema - Area served — newline-separated list of cities/regions for service-area businesses (plumbers, electricians)
- Google Place ID — emits a
hasMaplink when set - LocalBusiness JSON-LD on the homepage with
OpeningHoursSpecification,PostalAddress,GeoCoordinates, and the existingswps_schema_logo+swps_schema_social_profileswoven in asimage/logo/sameAs - Schema preview — live JSON-LD preview on the settings page so you can validate before publishing
- Coexists with Yoast / RankMath / AIOSEO — defers automatically when those plugins are active
- Auto-alt on upload — heuristic mode (free, instant — derives alt from filename + parent post title) or AI mode (uses your configured AI provider for a one-line description; falls back to heuristic on error)
- Filename sanitization — strips device prefixes (
IMG_,DSC_,Screenshot), lowercases, dash-separates, on the way into the Media Library - Lazy-loading enforcement — adds
loading="lazy" decoding="async"to any post-content<img>still missing it - Bulk fix tool — page-level button that processes the existing library in 20-image AJAX batches with live progress
- Stats tiles — total images, missing alt, % covered
- Edit /llms.txt — toggle between Auto (StrataWP-generated default built from posts/pages/categories) and Custom (paste your own markdown, served verbatim)
- Edit /robots.txt — toggle between Auto (WP default + AI-bot allow/disallow), Append (auto + your extra rules), or Replace (your content only)
- Side-by-side editor + preview — write your version on the left, see the auto-generated default on the right; one-click "copy auto into editor" to use the default as a starting point
- Physical-file warning — detects
robots.txtin the site root and warns that it overrides the dynamic version - Hooks into the existing pipeline — custom mode rides the existing
swps_llms_txt_contentfilter; robots filter runs at priority 200 so AI-bot rules added at priority 100 are preserved in Append mode
- Manual + CSV import — add backlinks one at a time, or paste/upload a CSV (one URL per line, source/target/anchor CSV, or Google Search Console "Top linking sites" export — all auto-detected)
- Daily health monitoring — WP-cron re-fetches every source page once a day, parses anchors, classifies as Live / Lost / Broken (HTTP error)
- Real anchor text + first/last seen — captured on every successful verify
- AJAX bulk verify — "Verify all" runs in 25-row batches with live progress
- Per-row re-verify and delete
- CSV export — full table export for offline analysis or to import into another tool
- Stats tiles — total tracked, live, lost, broken, +30d gained, 30d lost, unique referring domains
- Dashboard widget — live count + 3 most-recently-verified backlinks with status pills
- No paid index required — tracks links you give it; pair with the GSC "Top linking sites" CSV for a real-world starting set
- Track up to 10 competitor sites — paste URL, get auto-discovered RSS / Atom feed, plus homepage + sitemap.xml fallback
- Daily WP-cron auto-scan — fetches each site's content at most once per day with polite delays between requests
- Per-row "Scan now" — manual refresh whenever you want
- Diff detection per scan — new posts since last snapshot, new JSON-LD schema types, title/H1 changes
- Content velocity — posts-per-week trend across the snapshot history (last 12 snapshots, ~12 days at daily cadence)
- Dashboard widget — 3 most-recently-changed competitors with a one-line summary on the dashboard
- Import from Yoast SEO, Yoast SEO Premium, Rank Math, and Rank Math Pro — auto-detects each source plugin by scanning postmeta + options, shows post counts so users know what they're about to migrate
- Per-post meta (Phase 1, v4.3.0) — meta title, meta description, focus keyword, canonical URL, breadcrumb title, social title/description/image. First non-empty source wins, streamed in 100-post batches via SQL so it scales to large sites without timing out
- Global settings (Phase 2, v4.4.0) — title separator (Yoast
sc-dash/sc-ndash/ etc. codes decoded to literal characters), title templates per post type / taxonomy / archive (author, date, search, 404, post-type-archive), per-post-type noindex flags. Rank Math's single-percent variables (%title%,%sep%,%sitename%,%term%, …) are rewritten to StrataWP's%%var%%syntax with longest-match-first ordering - Redirects (Phase 3, v4.4.0) — Yoast Premium reads
wpseo-premium-redirects-base(and the regex variant), Rank Math Pro reads{prefix}rank_math_redirectionsforstatus='active'rows and expands the serializedsourcesarray. All inserts go throughSWPS_Redirect_Manager::add_redirect()so validation/normalization matches manually-created redirects; 301/302/307/410 supported, regex flag preserved - Phase checkboxes — pick any combination of post meta / settings / redirects per run
- Preview before run — counts what would change without writing
- Conflict policy — when StrataWP already has a value, choose Skip-existing or Overwrite (per run)
- One-click Undo — typed backup snapshot reverts post meta (restores previous values or deletes if they didn't exist), restores option values, and DELETEs the redirect rows the migration inserted, all in one click
- Branded shell — top bar (logo, breadcrumb, search, theme toggle, help) sits above every plugin page
- Dark mode by default with light mode via the toggle (per-user preference, persisted)
- Emerald & Teal palette — brand identity (v4.1.4 — moved off the original gold/black; semantic colors are distinct from brand to keep status pills readable)
- Data-dense template — used by Audit, Redirects, Internal Links, Auto-Optimize, Competitors. Consistent row-card pattern with status dot + name + meta + actions
stratawp-seo/
├── stratawp-seo.php Plugin bootstrap, autoloader, main StrataWP_SEO singleton
├── uninstall.php Clean removal on plugin delete
├── readme.txt WordPress.org plugin readme
├── README.md This file
│
├── includes/ Core PHP classes (one class per file, swps_ prefix)
│ ├── class-ai-provider.php Abstract base + JSON parser with 5-stage repair
│ ├── class-ai-bots.php robots.txt allowlist + dynamic llms.txt
│ ├── class-analyzer.php Site analysis: posts, categories, link graph
│ ├── class-analytics-dashboard.php Admin dashboard rendering + Chart.js data
│ ├── class-analytics-tracker.php Cookie-free pageview/engagement tracker
│ ├── class-api.php Internal API helpers
│ ├── class-audit-module.php Abstract base for audit modules
│ ├── class-background-processor.php Queue + cron for long-running tasks
│ ├── class-breadcrumbs.php Frontend breadcrumb output + schema
│ ├── class-cache-manager.php Transient + object-cache abstraction
│ ├── class-calendar.php Visual calendar for topic queue
│ ├── class-cli.php WP-CLI command registration
│ ├── class-content-scorer.php Quality scoring for generated content
│ ├── class-cost-tracker.php Per-provider/model token + USD tracking
│ ├── class-cron.php Scheduled auto-publish runner
│ ├── class-duplicate-checker.php Title/content similarity detection
│ ├── class-encryption.php AES-256 secret storage
│ ├── class-generator.php The main AI content generation pipeline
│ ├── class-head-cleanup.php wp_head tag removal (generator, RSD, oEmbed, etc.)
│ ├── class-hooks.php Centralized filter/action hub (swps_* prefix)
│ ├── class-image-inserter.php In-content image placement engine
│ ├── class-image-provider.php Abstract base for image providers
│ ├── class-images.php Image utility helpers
│ ├── class-internal-links.php Internal linking orchestrator
│ ├── class-internal-links-admin.php Admin UI for link suggestions
│ ├── class-keyword-tracker.php GSC sync + striking distance detection
│ ├── class-keywords-page.php Keyword research admin page
│ ├── class-link-ai-engine.php AI-powered internal link suggestions
│ ├── class-link-keyword-engine.php Keyword-anchor link suggestions
│ ├── class-meta-editor.php Per-post SEO metabox + frontend output
│ ├── class-migration.php Import settings + post meta + redirects from Yoast / Rank Math
│ ├── class-post-list-seo.php Posts list table SEO column + bulk edits
│ ├── class-provider-factory.php Resolves the active AI/image provider class
│ ├── class-rate-limiter.php Cooldown between generations
│ ├── class-redirect-admin.php Redirect manager admin UI
│ ├── class-redirect-manager.php Redirect matching, 404 logging, slug-change auto-redirect
│ ├── class-rest-api.php REST endpoints (/wp-json/strawp-seo/v1/...)
│ ├── class-rss-optimizer.php RSS feed before/after content injection
│ ├── class-schema.php JSON-LD output (Article, Breadcrumb, WebSite, Org/Person, FAQ, ItemList)
│ ├── class-search-appearance.php Title/description template engine
│ ├── class-search-console.php GSC OAuth + API client
│ ├── class-seo-audit.php Audit orchestrator + dashboard widget
│ ├── class-settings.php All settings registration + admin pages
│ ├── class-sitemap-admin.php Sitemap admin page + IndexNow ping AJAX
│ ├── class-sitemap-manager.php Sitemap generation + IndexNow batch submission
│ ├── class-taxonomy-meta.php Per-term archive meta
│ ├── class-templates.php Content template definitions (listicle, how-to, etc.)
│ ├── class-topic-queue.php Topic queue custom post type + helpers
│ ├── class-voice-profile.php Voice profile CPT + system prompt injection
│ │
│ ├── audit/ 8 audit modules (extend SWPS_Audit_Module)
│ │ ├── class-canonical-module.php
│ │ ├── class-image-seo-module.php
│ │ ├── class-meta-robots-module.php
│ │ ├── class-opengraph-module.php
│ │ ├── class-pagespeed-module.php
│ │ ├── class-robots-module.php
│ │ ├── class-sitemap-module.php
│ │ └── class-twitter-module.php
│ │
│ └── providers/ AI + image provider implementations
│ ├── ai/
│ │ ├── class-anthropic-provider.php
│ │ ├── class-google-provider.php
│ │ ├── class-openai-provider.php
│ │ └── class-xai-provider.php
│ └── images/
│ ├── class-gemini-provider.php
│ ├── class-pexels-provider.php
│ ├── class-pixabay-provider.php
│ └── class-unsplash-provider.php
│
├── templates/ Admin page view files (PHP templates)
│ ├── analytics-page.php
│ ├── audit-page.php
│ ├── calendar-page.php
│ ├── generate-page.php
│ ├── internal-links-page.php
│ ├── keywords-page.php
│ ├── meta-editor-metabox.php
│ ├── migration-page.php
│ ├── redirects-page.php
│ ├── search-appearance-page.php
│ ├── settings-page.php
│ ├── sitemaps-page.php
│ ├── voice-profile-edit.php
│ └── voice-profiles-page.php
│
├── admin/
│ ├── css/ admin.css, calendar.css
│ └── js/ Per-page JS (admin.js shared; sitemaps.js, analytics.js, etc.)
│
├── docs/ Internal docs and notes
└── screenshots/ WP plugin screenshots
stratawp-seo.phploads —require_oncechains pull in everyincludes/class (deliberate dependency order: base classes → providers → factory → consumers).StrataWP_SEO::instance()— singleton runs__construct()which:- Initializes foundation subsystems (cache, duplicate checker, rate limiter, cost tracker, voice profiles, content scorer)
- Resolves the active AI and image providers via
SWPS_Provider_Factory - Instantiates ~30 service classes and stores them as public properties (e.g.,
$this->generator,$this->settings,$this->ai_bots) - Hooks into
init,admin_menu,admin_init,wp_enqueue_scripts,admin_enqueue_scripts,wp_ajax_*,rest_api_init, etc.
- CLI commands registered if
WP_CLIis defined. - First request — providers stay lazy (only instantiated when
chat()/chat_json()is called).
Both AI and image subsystems use the same pattern:
SWPS_AI_Provider (abstract)
├── SWPS_Anthropic_Provider
├── SWPS_OpenAI_Provider
├── SWPS_Google_Provider
└── SWPS_XAI_Provider
SWPS_Image_Provider (abstract)
├── SWPS_Unsplash_Provider
├── SWPS_Pexels_Provider
├── SWPS_Pixabay_Provider
└── SWPS_Gemini_Provider
SWPS_Provider_Factory::create_ai_provider() reads the swps_ai_provider option and returns the right concrete class. Each provider:
- Defines
get_slug(),get_name(),get_api_key_url(),get_available_models() - Implements
chat()(raw text) and inheritschat_json()(5-stage JSON parser with quote repair, control-char sanitization, BOM/fence stripping, Unicode separator removal, brace trimming) - Reports
last_usage(input/output tokens) andlast_stop_reasonfor cost tracking and truncation detection
SWPS_Hooks (in class-hooks.php) is the single entry point for the swps_* filter and action hooks. The generation pipeline calls SWPS_Hooks::filter_system_prompt(), filter_user_prompt(), filter_ai_response(), filter_post_data(), etc. — and any plugin or theme can hook in.
SWPS_Generator::generate( $topic, $template ) walks through:
- Rate limit — block if cooldown active (
SWPS_Rate_Limiter) - Duplicate check — refuse if a published post is too similar (
SWPS_Duplicate_Checker) - Site analysis — fetch existing posts, categories, internal link candidates (
SWPS_Analyzer) - Prompt build — system prompt (with voice profile injection) + user prompt with site context, template instructions, target keywords, internal link list
- AI call —
SWPS_AI_Provider::chat_json()with 16,384 max tokens and a strict JSON schema requirement - JSON parse — 5-stage repair pipeline (see
parse_json_response()inclass-ai-provider.php). Failures save the raw response to a transient and surface a Debug admin page. - Image fetch — featured image from configured provider; in-content images placed by
SWPS_Image_Inserter - Post insert —
wp_insert_post()with full schema metadata - Content scoring —
SWPS_Content_Scorerrates the result; belowmin_content_score→ forced to draft - Hooks fire —
swps_post_created,swps_after_generate
- Hooks
robots_txtfilter at priority 100, appends a# AI crawlers — managed by StrataWP SEOblock withAllow: /per allowed bot andDisallow: /for known bots the user has unchecked. - Default behavior (no option saved): all 15 known bots are allowed.
- Option name:
swps_ai_bots_allowed(array of bot keys fromSWPS_AI_Bots::KNOWN_BOTS).
- Hooks
initat priority 1 (before Yoast or any other plugin can serve/llms.txt). - Returns
text/markdowncontent withX-Robots-Tag: noindex. - Body composition:
# {site_name}+> {site_description}(uses your plugin's Site Description field, falls back to WP tagline)Site:andSitemap:lines (auto-detects Yoast/RankMath/AIOSEO/WP-core sitemap URL)## Posts— 100 most recent published posts## Pages— top-level published pages (excluding home)## Categories— 20 most-used categories
- Per-entry summary uses (in order): plugin meta description → Yoast meta → RankMath meta → post excerpt → trimmed first paragraph (~200 chars at sentence boundary).
- Filterable via
swps_llms_txt_contentandswps_llms_txt_post_limit.
- Generates
/sitemap_index.xmland per-type sub-sitemaps ({post_type}-sitemap.xml,{taxonomy}-sitemap.xml,author-sitemap.xml). - Each sub-sitemap respects the
swps_sitemap_exclude_{key}option. urls_per_pagesetting controls split point (default 1000, max 50000).- Image sitemap entries built from post attachments.
- IndexNow batch submit —
ping_search_engines()posts up to 50 most recently modified posts toapi.indexnow.org, returns{submitted, status, error}for the admin UI to display. - Auto-fires after publish/update via
transition_post_status(when enabled in audit settings).
- Loads 8 modules, each extending
SWPS_Audit_Module:Canonical_Module— checks<link rel="canonical">on key URLsSitemap_Module— verifies sitemap accessibility and indexabilityOpenGraph_Module/Twitter_Module— social meta presenceRobots_Module— robots.txt sanity (disallow rules, sitemap reference)Meta_Robots_Module— per-page robots metaImage_SEO_Module— alt text, image dimensionsPagespeed_Module— basic page speed hints (render-blocking, image weight)
- Each module returns
{score, status, message, issues[], fixable}. - Auto-fix runs registered fixers when
audit_auto_*options are on. - Dashboard widget shows aggregate score; full report has CSV export.
- Filterable:
swps_audit_modules,swps_audit_result,swps_audit_complete.
- Hooks
wp_headand outputs JSON-LD blocks for:- Article / BlogPosting / NewsArticle on posts
- BreadcrumbList on all post types and taxonomies
- WebSite (with
SearchActionif enabled) on the homepage - Organization or Person site representation with logo +
sameAssocials
- Auto-disables completely if
WPSEO_VERSION,RankMath, orAIOSEO_VERSIONis defined. - Each block runs through a
swps_schema_{type}filter for customization.
- Adds a metabox to the post editor for selected post types (default
post,page). - Stores per-post:
_swps_meta_title,_swps_meta_description,_swps_focus_keyword,_swps_canonical_url,_swps_robots_noindex,_swps_robots_nofollow,_swps_og_*,_swps_twitter_*,_swps_breadcrumb_title. - Renders live SERP preview, character counters, SEO checklist (focus keyword presence in title/H1/first paragraph/URL/meta).
- AI Generate button (admin AJAX) calls the active AI provider and fills meta title + description.
- Frontend output via
wp_head— disabled if Yoast/RankMath/AIOSEO is active.
- Cookie-free. Tracks: post URL, referrer, time on page (sendBeacon on unload), scroll depth (max %), bounce status (left in <10s without interaction).
- Tracking script enqueued only on singular posts when enabled.
- Server-side filter
swps_analytics_excludeand data filterswps_analytics_trackfor control. - Stored in custom table
wp_swps_analytics. Cron-pruned to retention setting.
- OAuth flow stores token in
swps_gsc_token(refresh token encrypted viaSWPS_Encryption). - API client wraps GSC
searchAnalytics.queryfor clicks/impressions/CTR/position. - Used by
SWPS_Keyword_Tracker(rank tracking) and the analytics dashboard (top queries).
- Custom post type
swps_voice_profile. - Fields: name, tone, formality (1-10), sentence length, vocabulary level, person (first/second/third), avoid_phrases (array), preferred_phrases (array), example_content (≤500 chars sample).
- When active (selected in settings),
inject_voice_profile()filter prepends a compiledVOICE PROFILEblock to the system prompt at priority 5 (before other system-prompt filters).
- Two engines:
- Keyword engine — looks for
target_keywordssettings + post titles in content of other published posts; suggests anchor text. - AI engine — sends a small batch of post excerpts to the AI for semantic link suggestions.
- Keyword engine — looks for
- Background processor runs in chunks to avoid timeouts.
- Admin UI lets you accept/skip per suggestion.
- Stored in custom table with columns:
source,target,status_code,is_regex,hits,last_hit. - Matched on
template_redirectaction (early enough to short-circuit before the page renders). - 404 logging table feeds the "Create redirect" one-click button on the redirects admin.
- Slug-change hook (
post_updated) auto-creates 301 from old to new slug when enabled.
- Custom WP-Cron schedules registered for biweekly and three-times-weekly cadences.
swps_auto_generatehook firesSWPS_Generator::generate()with the next queued topic (or AI-chosen if queue empty).- Schedule UI shows next run time computed from frequency + day-of-week + time settings.
PRICINGconstant mapsmodel_id => [input, output]USD per 1M tokens.- Records every generation: provider, model, input tokens, output tokens, computed cost.
- Aggregated for the admin dashboard.
- AES-256-CBC via
openssl_*functions, key derived fromAUTH_KEY+AUTH_SALT. - Used for
swps_gsc_client_secretandswps_jon_ai_secret. Saved values prefixed with a sentinel sois_encrypted()can detect them.
- Download the plugin ZIP file
- Go to Plugins → Add New → Upload Plugin
- Upload the ZIP and click Install Now
- Click Activate
- Upload the
stratawp-seofolder to/wp-content/plugins/ - Activate through the Plugins menu
- WordPress 6.0 or higher
- PHP 8.0 or higher
- An API key from at least one AI provider (Anthropic, OpenAI, Google, or xAI)
- Add your API key — StrataWP SEO → Settings, enter your AI provider API key (Anthropic recommended)
- Describe your site — fill in Site Niche and Site Description so the AI understands your audience
- Set your preferences — Tone of Voice, word count range, Post Status: Draft (recommended)
- (Optional) Allow AI crawlers — AI Crawlers section is enabled by default; visit
/llms.txtto see your generated index - Generate your first post — StrataWP SEO → Generate Content, enter a topic, click Generate
- Review & publish — edit the generated draft in WordPress, then publish
Every admin page in the plugin, what it does, and exactly how to use it. Pages are listed in the order they appear in the StrataWP admin sidebar.
The landing page. Shows site health score, recent generations, AI cost (30d), post views, top GSC queries, top issues, the Auto-Optimize queue preview, and the Competitor watch widget. Each tile links to its source page — click "Manage →" on Competitor watch to jump straight to managing tracked sites.
How to use it: load it daily as a temperature check. The welcome line summarizes site health, fixable issues, and 30-day AI spend in one sentence. The KPI tiles use the brand emerald gradient for the four primary numbers. The modules grid at the bottom lets you toggle features on/off — turn off Sitemaps if you're using Yoast/RankMath's sitemap, for example.
The main AI content generator.
- Pick a template (Auto, Listicle, How-To, Comparison, Case Study, News Analysis, Tutorial)
- Enter a topic (or leave blank to auto-pick from queue)
- Optionally select a voice profile to lock the tone
- Set target word count (or use the global default)
- Click Generate — it'll analyze your site, draft, score, attach images, and save as a draft
Tip: if generation takes >2 min, the post is being processed in the background. Check the Calendar to see status.
Visual month-view of every scheduled and generated post. Color-coded by status (draft, scheduled, published). Click any cell to see the post detail or jump to the editor.
How to use it: drag-and-drop is not supported (yet) — to reschedule, edit the post and change its date.
A custom post type that holds upcoming topics for auto-publish. Each entry has a topic, target template, scheduled date, and notes. The cron job picks the next due topic, generates the post, and marks the queue entry as used.
How to use it:
- Add 10-20 topic ideas with target dates
- Settings → Auto-Publishing Schedule: pick "Daily" / "Weekly" / etc.
- Walk away — the cron generates posts automatically on schedule
Finds underperforming published posts, generates AI proposals to fix them, and applies the edits with one click. Manual review queue — every edit is reviewed before it touches your content.
How to use it:
- Click Re-scan all posts — scores all published posts/pages in batches of 10 (live progress bar). Posts below the threshold (default 75) appear in the queue.
- For each row, click Generate proposal — AI returns 2-6 concrete
find/replaceedits, plus optional new meta title/description and focus keyword, plus a projected score - Click Review on a proposal — see the diff (red = old, green = new), check/uncheck individual edits, click Apply selected edits
- Re-score happens automatically after apply — you'll see the new score
Threshold tuning: raise the threshold (e.g. 85) to surface more posts, lower it (e.g. 50) to focus only on the worst.
Dismissing: the trash icon hides a post from the queue permanently (snapshot history is kept; un-dismiss via WP-CLI).
Reusable writing personas. Each profile sets tone, formality (1-10), preferred sentence length, vocabulary level, point of view, avoid/preferred phrases, and a sample text the AI emulates.
How to use it:
- Add new → name it (e.g., "Friendly authority", "Conversational developer")
- Paste a sample paragraph that matches the tone you want
- Mark it Default if it should apply to every Generate without picking explicitly
- In Generate Content, the dropdown lets you override per-post
8-module technical SEO check. Each module reports pass/warn/critical with auto-fix where possible.
How to use it:
- Click Run audit now — takes 2-10 seconds
- Each module card shows status; click Auto-fix on any module that has it (canonical, OG, Twitter, sitemap)
- CSV export for client reporting
Schedule daily/weekly/monthly runs from Settings → SEO Audit. The dashboard widget shows the latest health score.
Configures structured data output (JSON-LD).
How to use it:
- Pick Article schema type — Article, BlogPosting (default), or NewsArticle
- Organization or Person — pick which entity represents your site
- Add logo URL and social profiles (Twitter, Facebook, LinkedIn, etc.) — these become
sameAsin the Organization schema - Toggle WebSite SearchAction to enable Google sitelinks searchbox
Conflict detection: auto-disables if Yoast/RankMath/AIOSEO is active. Enable the override toggle if you want StrataWP's schema regardless.
Configures /sitemap_index.xml and sub-sitemaps.
How to use it:
- Settings tab: toggle individual post types/taxonomies in/out of the sitemap, set per-type priority and changefreq
- Submit tab: the Ping Search Engines button submits 50 most-recently-modified posts to IndexNow (Bing/Yandex/Seznam — Bing's feed powers ChatGPT search). Use after a major content push.
- View raw: click "View sitemap" to see the live XML
Manages 301/302/307/410 redirects and 404 monitoring.
How to use it:
- Add a redirect: From URL → To URL → pick status code → Save
- Regex tab for pattern-based redirects (
^/old/(.*)$ → /new/$1) - 404 Log tab: every unhandled 404 shows up here; click Create redirect to fix it in one click
- Auto-redirect on slug change: enabled by default — when you change a post's slug, a redirect from the old slug is created automatically
Suggests internal links from existing posts to other relevant posts on your site. Two engines:
- Keyword engine: finds anchor opportunities by keyword match
- AI engine: uses your AI provider for semantic suggestions
How to use it:
- Pick a target post
- Click Find suggestions — engine returns candidate anchors with confidence scores
- Accept or skip each one — accepted links are inserted into the post body
Controls how titles and descriptions appear in search results.
How to use it:
- Set separator (
|,–,·, etc.) - Edit per-content-type templates with variables:
%title%,%sitename%,%sep%,%category%,%author%,%date%, etc. - Per-post overrides are still available in the post editor's SEO Meta Editor metabox
Cookie-free on-site analytics + GSC dashboard.
How to use it:
- Date range filter at the top: 7 / 30 / 90 days
- Top stats: Pageviews, Unique visitors, Avg time, Bounce rate
- Charts: Pageviews over time, top posts, top referrers
- GSC tab: clicks, impressions, CTR, position (requires OAuth setup in Settings → Analytics)
Keyword research + rank tracking.
How to use it:
- Generate keywords: enter a seed topic, AI suggests 10-50 related keywords
- Track keywords: add to the watchlist — GSC syncs daily and shows position trends
- Striking distance: the "8-20" tab surfaces ranking opportunities — keywords you're already on page 2 for that could be pushed to page 1 with light optimization
Connects Google Search Console for search data.
How to use it:
- Settings → Analytics: paste GSC OAuth client ID + secret
- Click Authorize → sign into Google → confirm scope → return
- Pick the verified property
- Data syncs daily; available in Dashboard, Analytics, and Keywords pages
Tracks competitor sites for content velocity, schema diff, title/H1 changes.
How to use it:
- Click Add competitor → paste the URL → optional label → Save
- Click Scan now on the row — fetches their RSS (auto-discovered or common-path), homepage, and falls back to sitemap.xml if no feed
- Daily WP-cron auto-rescans every tracked site
- +N new pill on a row indicates new posts since last scan (click to expand the list)
- Schema: chips show their JSON-LD types; new types are highlighted with a
+ NEWindicator - Title/H1 changed pills appear when their homepage
<title>or<h1>flipped between scans - Source pill (RSS / SITEMAP) shows which data source the scan succeeded with
Limit: 10 competitors. Storage: last 12 snapshots per competitor (~12 days of daily history). Out of scope: keyword-gap analysis (needs paid backlink API).
LocalBusiness JSON-LD output for brick-and-mortar and service-area sites. Lives at admin.php?page=swps-local-seo.
How to use it:
- Tick Enable Local SEO schema output at the top of the page. Schema only emits when this is on AND a business name + city are filled.
- Pick the most specific Business type that matches your business — Restaurant, Plumber, Dentist, Hotel, etc. (defaults to generic LocalBusiness). The picker covers 30+ schema.org sub-types.
- Fill Business identity: name, phone, email, price range (
$/$$/$$$/$$$$or a range like$10-30). - Fill Address fields: street, city, state/region, postal code, country (two-letter ISO preferred —
US,GB,AU). - Map & geo (optional but recommended for ranking): open Google Maps, right-click your location, click the lat/lng to copy, paste into the Latitude/Longitude fields. Optionally paste your Google Place ID to emit a
hasMaplink. - Opening hours: for each day, set Open and Close in 24-hour format (
09:00,17:30), or tick Closed for off-days. Days without hours are omitted from the schema. - Area served (service-area businesses): paste one city/region per line, up to 25.
- Click Save. A Schema preview card renders at the bottom showing the exact JSON-LD that will be injected into your homepage
<head>. - Verify the live output with Google's Rich Results Test once the homepage is published.
Coexistence: if Yoast / RankMath / AIOSEO are active, StrataWP defers all schema output to them — turn this off and use their LocalBusiness panel instead.
Auto-fills missing alt text, sanitizes filenames on upload, and enforces lazy-loading. Lives at admin.php?page=swps-image-seo.
How to use it:
- Open the page — the stats tiles at the top show total library size, count missing alt text, % covered, and current auto-alt mode.
- Bulk fix existing library: click the Fix missing alt text button to write alt for every image that doesn't have any. Runs in 20-image batches via AJAX so you can leave the tab open while it works. Uses the auto-alt mode you have selected below.
- Auto-alt on upload card:
- Tick Generate alt text automatically when an image is uploaded to enable.
- Pick Heuristic (free, instant — derives alt from filename + parent post title) or AI (sends filename + post context to your configured AI provider for a one-line description; falls back to heuristic on error or quota).
- Filename sanitization card: tick to clean filenames on upload —
IMG_4523 Vacation.JPGbecomesvacation.jpg. Strips device prefixes (IMG_,DSC_,DSCN,Screenshot, etc.). - Lazy loading card: tick to add
loading="lazy" decoding="async"to any post-content<img>still missing those attributes. Improves Core Web Vitals. - Click Save Image SEO settings.
Tips: AI mode costs a fraction of a cent per image (one short call to your configured provider). For most sites, Heuristic mode is plenty good — it's especially strong when your filenames already have meaningful slugs (e.g. seo-checklist-2026.jpg).
Edits the dynamic /llms.txt and /robots.txt files served by your site. Lives at admin.php?page=swps-crawl-files.
How to use the /llms.txt editor:
- Pick a mode:
- Auto — serve the StrataWP-generated default (built from your most recent 100 posts, top-level pages, and busiest 20 categories with one-line summaries). This is the recommended default.
- Custom — serve the markdown you paste below, verbatim.
- The page shows two textareas side-by-side: Your llms.txt (editable) on the left and Auto preview (read-only) on the right.
- Click ↑ Copy auto-generated content into the editor to start from the auto version, then tweak.
- Save — visit
/llms.txtor click View /llms.txt in the page header to confirm.
How to use the /robots.txt editor:
- If a physical
robots.txtexists in your site root, you'll see a warning — that file always overrides the WordPress dynamic version. Delete it to use the editor. - Pick a mode:
- Auto — what WordPress would normally serve, plus the AI-bot Allow/Disallow rules StrataWP adds.
- Append — Auto + your extra rules (good for adding
Disallow: /private/or extraSitemap:entries). - Replace — serve only your content (full manual control — be careful, since this skips the AI-bot rules).
- Edit your version on the left; auto preview is on the right; "copy auto into editor" works the same way.
- Save — visit
/robots.txtor click View /robots.txt to confirm.
Tip: Append mode is the safest middle ground for most sites — keeps the StrataWP-managed AI bot allowlist intact while letting you add custom rules.
Tracks pages that link to your site, with daily health monitoring. Lives at admin.php?page=swps-backlinks. No paid backlink index required.
How to seed your initial list:
- Option A — manual: use the Add backlink form. Paste the source URL (the page linking to you), optionally the target URL on your site and the anchor text, then click Add & verify. The page is fetched immediately so you see Live/Lost/Broken right away.
- Option B — CSV import (recommended):
- Go to Google Search Console → Links → Top linking sites → click the export button → save as CSV.
- In the Bulk import card, paste the CSV (or just one URL per line) into the textarea.
- Click Import. Existing source URLs are skipped automatically. The page reloads with the new rows pending verification.
- Click Verify all in the page header to fetch every imported row in 25-row AJAX batches.
How rows get classified:
- Live (green) — page loaded and contains at least one
<a href="...">whose href hostname matches yours - Lost (amber) — page loaded fine but no link to your site is on it any more
- Broken (red) — page returned an HTTP error (4xx/5xx) or timed out; the HTTP code shows in the pill
Daily routine:
- A WP-cron job (
swps_backlinks_daily_verify) re-checks every backlink once per day with 250ms politeness delays between requests - Anchor text + first/last-seen dates update automatically when a link is found
- Use the Lost count as a link-reclamation list — those are sites that used to link to you and now don't
Per-row controls: ⟳ re-verifies one row immediately; ✕ deletes it (history is gone — use Export CSV first if you want a backup).
Export: the Export CSV button in the page header downloads everything (source, target, anchor, status, http code, first seen, last seen, last checked) — useful for offline analysis or migrating to another tool.
What this is NOT: this does not discover new backlinks (no paid web index). It tracks the list you give it. To discover new ones, paste the GSC export periodically — that's GSC's view of who links to you.
The control panel — split into tabs:
- AI Provider: API key, model, image provider keys
- Site Details: niche, description, language
- AI Crawlers: allowlist for 15 known bots, llms.txt toggle
- Writing Preferences: tone, formality, word count
- Content Settings: templates, FAQ on/off, Key Takeaways on/off, TOC on/off, internal link min/max, default post status
- Auto-Publishing: schedule, time of day, post-type
- SEO Audit: schedule
- Schema: entity type, social profiles, conflict override
- SEO Meta Editor: enable per-post fields
- Keyword Tracking: GSC OAuth, retention
- Analytics: retention period, GDPR options
- Advanced: cost tracking, rate limit cooldown, debug logging, encrypted secrets
Shows the last failed AI response (raw + cleaned) for diagnosing JSON parse failures. If a generation errored, this is the first place to look.
How to use it: click "Refresh" to fetch the most recent failure. Both raw and post-repair JSON are shown side-by-side.
| Setting | Description |
|---|---|
| AI Provider | Anthropic (Claude), OpenAI (GPT), Google (Gemini), or xAI (Grok) |
| API Key | Per-provider; only the active provider's key is required |
| AI Model | Auto-updates when you switch providers |
Available Anthropic models:
claude-opus-4-7— Most powerful, higher cost (default)claude-opus-4-6— Previous Opus generationclaude-sonnet-4-6— Balanced quality and costclaude-sonnet-4-5-20250929— Previous generationclaude-haiku-4-5-20251001— Fastest, lowest cost
The plugin handles model-specific quirks automatically — for example, Claude 4.6+ models do not support assistant prefill, so the JSON-coercion prefill is disabled for those.
| Setting | Description |
|---|---|
| Auto Featured Images | Fetch a relevant image per post |
| Image Provider | Unsplash, Pexels, Pixabay (free stock), or Gemini (AI-generated) |
| In-Content Images | Insert contextual images within the post body |
| Images Per Post | Number of in-content images (1-4) |
| Image Max Width | Maximum width in pixels (600-2400) |
| Setting | Description |
|---|---|
| Site Niche | Your industry or topic area |
| Site Description | Detailed description of your site, audience, and unique value proposition |
| Setting | Description |
|---|---|
| Allowed AI Bots | Multi-checkbox of 15 known crawlers. Allowed bots get an explicit Allow: / rule in robots.txt; unchecked known bots get Disallow: / |
| Generate llms.txt | Serve a dynamic llms.txt at /llms.txt (overrides Yoast/other plugin output) |
| Setting | Description |
|---|---|
| Tone of Voice | Professional, Conversational, Friendly, Authoritative, Casual, Formal, Witty |
| Voice Profile | Reusable persona (manage under StrataWP SEO → Voice Profiles); overrides tone/style |
| Custom Style Notes | Free-text instructions ("Use short paragraphs, avoid jargon") |
| Target Keywords | Comma-separated keywords woven into generated content + used by the keyword link engine |
| Setting | Description |
|---|---|
| Post Status | Draft (recommended), Pending Review, or Published |
| Post Author | WordPress user assigned as author |
| Default Category | Fixed category, or AI-decided |
| Word Count | Min (300-5000) and max (500-8000) targets |
| Internal Links | Min and max number of links to existing posts |
| FAQ Section | Generate FAQ with FAQPage schema for rich snippets |
| Table of Contents | Linked TOC at the top of each post |
| Key Takeaways | Bullet-point summary with optional ItemList schema |
| Setting | Description |
|---|---|
| Enable | Turn on scheduled generation |
| Frequency | Daily, twice weekly, three times weekly, weekly, biweekly, monthly |
| Day of Week | Starting day for the schedule |
| Time | Time of day to run |
| Posts Per Run | 1-5 posts per scheduled run |
| Setting | Description |
|---|---|
| Auto Canonical Tags | Add canonical tags where missing |
| Auto OG/Twitter Tags | Output OG and Twitter Card meta |
| Sitemap Generation | Generate XML sitemap (auto-disabled if another sitemap plugin is active) |
| Audit Schedule | Daily, weekly, monthly |
| Setting | Description |
|---|---|
| Enable Schema Markup | Output JSON-LD (auto-disabled when Yoast/RankMath/AIOSEO active) |
| Article Type | Article, BlogPosting, or NewsArticle |
| Sitelinks Searchbox | Add SearchAction for Google sitelinks |
| Site Represents | Organization or Person |
| Name | Defaults to site name |
| Logo URL | Min 112x112px |
| Social Profiles | One URL per line — populates sameAs |
| Setting | Description |
|---|---|
| Meta Editor Enabled | Enable/disable the metabox on post edit screens |
| Meta Editor Post Types | Comma-separated post types (default post,page) |
| Auto-Generate Meta | Auto-generate meta title/description on publish |
| Setting | Description |
|---|---|
| Keyword Sync Frequency | How often to sync GSC data (daily, weekly, monthly) |
| Setting | Description |
|---|---|
| Enable On-Site Tracking | Cookie-free pageview/engagement tracking |
| Data Retention | 30, 90, 180, or 365 days |
| Exclude Admins | Don't track logged-in admins |
| Google OAuth Client ID/Secret | For Search Console (secret stored encrypted) |
| Setting | Description |
|---|---|
| Default Template | Default content format |
| Rate Limit | Cooldown in seconds between generations |
| Duplicate Detection | Block posts too similar to existing content |
| Cost Tracking | Track tokens + estimated USD per generation |
| Min Content Score | Posts scoring below are forced to draft (0 disables) |
| Page | Path | Purpose |
|---|---|---|
| Settings | swps-settings |
All plugin configuration |
| Generate Content | swps-generate |
One-off post generation UI |
| Voice Profiles | swps-voice-profiles |
Manage reusable personas |
| SEO Audit | swps-seo-audit |
8-module audit results + auto-fix |
| Search Appearance | swps-search-appearance |
Title/description templates |
| Analytics | swps-analytics |
Unified dashboard |
| Keywords | swps-keywords |
Keyword research + GSC tracking |
| Calendar | swps-calendar |
Visual content calendar |
| Topic Queue | edit.php?post_type=swps_topic |
Topic queue (custom post type) |
| Internal Links | swps-internal-links |
Link suggestions admin |
| Sitemaps | swps-sitemaps |
Sitemap status + IndexNow ping |
| Redirects | swps-redirects |
Redirect manager + 404 log |
| Auto-Optimize | swps-auto-optimize |
Re-score + AI proposals for low-scoring posts |
| Competitors | swps-competitors |
Competitor site tracker (RSS/sitemap diff) |
| Local SEO | swps-local-seo |
LocalBusiness JSON-LD: NAP, hours, geo, area served |
| Image SEO | swps-image-seo |
Auto-alt, filename sanitization, lazy-load, bulk fix |
| Crawlers & Files | swps-crawl-files |
Edit /llms.txt and /robots.txt (auto/custom modes) |
| Backlinks | swps-backlinks |
Manual + CSV-import backlink tracker with daily verify |
| Migrate | swps-migration |
Import settings + per-post meta + redirects from Yoast / Rank Math |
| Debug | swps-debug |
Last failed AI response (raw + cleaned) |
# Generate a post
wp swps generate # AI-chosen topic
wp swps generate "WordPress security best practices"
wp swps generate "How to speed up WordPress" --template=how-to
# Analyze site
wp swps analyze # JSON
wp swps analyze --format=table
# Plugin status (version, provider, model, schedule, costs, queue size)
wp swps status
# Manage topic queue
wp swps queue list
wp swps queue add "Topic title"
wp swps queue add "Topic" --date="2026-04-01 09:00:00" --template=listicle
wp swps queue remove 123
wp swps queue clearAvailable templates: auto, listicle, how-to, comparison, case-study, news, tutorial
All endpoints under /wp-json/swps/v1/:
| Method | Endpoint | Purpose |
|---|---|---|
GET |
/voice-profiles |
List voice profiles |
POST |
/voice-profiles |
Create voice profile |
PUT |
/voice-profiles/{id} |
Update voice profile |
DELETE |
/voice-profiles/{id} |
Delete voice profile |
POST |
/generate |
Generate a post (topic + template) |
GET |
/audit |
Run full SEO audit |
GET |
/analytics/summary |
Aggregate analytics for date range |
All endpoints require manage_options capability and X-WP-Nonce header.
StrataWP SEO provides 30+ filters and actions via SWPS_Hooks. All hooks use the swps_ prefix.
swps_system_prompt — Modify the system prompt sent to the AI.
add_filter( 'swps_system_prompt', function( string $prompt, string $tone, string $style ): string {
$prompt .= "\nAlways include a call-to-action at the end.";
return $prompt;
}, 10, 3 );swps_user_prompt — Modify the user prompt sent to the AI.
add_filter( 'swps_user_prompt', function( string $prompt, string $topic, string $site_context ): string {
return $prompt;
}, 10, 3 );swps_ai_response — Modify the parsed AI response before post creation.
swps_post_data — Modify WordPress post data before insertion.
swps_llms_txt_content — Modify the full llms.txt body before output.
add_filter( 'swps_llms_txt_content', function( string $content ): string {
return $content . "\n## Custom Section\n- ...\n";
} );swps_llms_txt_post_limit — Number of posts included (default 100).
swps_voice_compile — Modify the compiled voice-profile prompt block.
swps_image_query — Modify the image search query.
swps_content_images_queries — Modify in-content image search queries.
swps_image_selection — Modify selected image data before insertion.
swps_schema_article — Modify Article JSON-LD before output.
add_filter( 'swps_schema_article', function( array $schema, int $post_id ): array {
$schema['author']['sameAs'] = 'https://twitter.com/yourhandle';
return $schema;
}, 10, 2 );swps_schema_breadcrumb — Modify BreadcrumbList JSON-LD.
swps_schema_organization — Modify Organization/Person JSON-LD.
swps_faq_schema — Modify FAQ JSON-LD.
swps_takeaways_schema — Modify Key Takeaways ItemList JSON-LD.
swps_audit_modules — Add or remove audit modules.
add_filter( 'swps_audit_modules', function( array $modules ): array {
$modules['my_custom_check'] = new My_Custom_Audit_Module();
return $modules;
} );swps_audit_result — Modify an individual module's audit result.
swps_analytics_track — Filter tracking data before storage. Return empty array to block.
swps_analytics_exclude — Filter whether to exclude a page from tracking.
swps_gsc_data — Filter Google Search Console API response data.
swps_meta_title — Filter the meta title output for a post.
swps_meta_description — Filter the meta description output for a post.
swps_meta_robots — Filter the robots meta directives for a post.
swps_seo_checklist — Filter or add SEO checklist items in the metabox.
swps_keyword_suggestions — Filter AI-generated keyword suggestions.
swps_score_weights — Adjust content scoring weights.
swps_before_generate — Fires before content generation starts.
swps_after_generate — Fires after successful generation.
swps_post_created — Fires after the WordPress post is inserted.
add_action( 'swps_post_created', function( int $post_id, array $ai_result, array $post_data ): void {
// Add custom meta, trigger workflows
}, 10, 3 );swps_generation_failed — Fires when generation fails.
swps_score_complete — Fires after content scoring completes.
swps_image_inserted — Fires after an in-content image is inserted.
swps_audit_complete — Fires after a full audit run completes.
add_action( 'swps_audit_complete', function( array $results, int $overall_score ): void {
if ( $overall_score < 50 ) {
wp_mail( get_option( 'admin_email' ), 'SEO Score Alert', 'Score dropped to ' . $overall_score );
}
}, 10, 2 );Anthropic (Claude) is recommended for the best content quality. Opus 4.7 for highest quality, Sonnet 4.6 for the best price/performance, Haiku 4.5 for high-volume cheap generation. OpenAI and Google are also excellent alternatives.
No. Schema and meta-tag output automatically disable themselves when Yoast, RankMath, or AIOSEO is detected. Sitemaps, content generation, audit, redirects, breadcrumbs, analytics, and AI Crawlers/llms.txt features all work alongside any SEO plugin.
Yes — StrataWP SEO → Migrate (added v4.3.0, expanded v4.4.0). Imports per-post SEO meta (title, description, focus keyword, canonical, breadcrumb title, social overrides) from Yoast SEO / Yoast Premium / Rank Math / Rank Math Pro, plus global settings (title separator, title templates with variable rewriting, per-post-type noindex) and redirects (Yoast Premium and Rank Math Pro). Preview before run, choose skip-existing or overwrite on conflicts, and one-click Undo restores everything.
Yes. Each generation is original, based on your site context. The optional duplicate detection (configurable threshold) prevents content too similar to existing posts.
Yes — set Post Status to "Draft" (recommended) or "Pending Review". Set a Minimum Content Score to automatically hold low-quality generations as drafts.
The plugin is free. You pay only for AI API usage. A typical 1,500-word post costs $0.01-0.05 depending on provider/model. Enable Cost Tracking to monitor usage.
Visit StrataWP SEO → Debug. The plugin saves the full raw AI response (and the cleaned version) to a transient on every parse failure, so you can see exactly what the model returned.
Yes — use the swps_audit_modules filter to register your own module extending SWPS_Audit_Module.
Article schema outputs on the standard post type only. Breadcrumb schema works on all post types and taxonomies. Use swps_schema_article to extend.
Yes. Cookie-free, no external services, no personal data stored. No consent banner needed.
No — GSC integration is optional. On-site analytics works entirely without it.
Two things: (1) writes Allow: / rules in robots.txt for the AI bots you've checked, and (2) serves a dynamic llms.txt at /llms.txt — a markdown index of your site that AI agents read instead of crawling everything. This dramatically improves how often your content shows up in ChatGPT, Claude, Perplexity, and Google AI Overviews.
Click Sitemaps → Ping Search Engines and the plugin submits your 50 most recently modified posts to api.indexnow.org. Bing, Yandex, and Seznam pick these up within minutes — and Bing's IndexNow feed is what powers ChatGPT's web search.
No. The Backlinks page tracks the links you provide it (manually or via CSV) and re-checks them daily. Pair it with the Google Search Console "Top linking sites" CSV export to seed a real-world list — that's GSC's view of who links to you, free. A direct paid-partner integration (Ahrefs/Moz/SE Ranking) is on the roadmap for a future release.
The Organization/Person schema configured under System → Settings → Schema (name, logo, social profiles) keeps emitting on the homepage. The new LocalBusiness schema is a separate JSON-LD block, but it reuses your existing logo (swps_schema_logo) as the image/logo property and your social profiles (swps_schema_social_profiles) as the sameAs property — so you don't have to re-enter that data. If Yoast/RankMath/AIOSEO is active, both blocks defer.
Heuristic is free and instant — it derives alt text from the image filename plus the parent post's title (e.g. an image called seo-checklist-2026.jpg attached to a post titled "10 Steps to Better SEO" gets reasonable alt text without any API call). AI mode sends filename + parent context to your configured AI provider for a one-line description; it costs a fraction of a cent per image and is most useful when filenames are device-camera junk like IMG_4523.JPG. AI mode automatically falls back to Heuristic on error or quota.
Only if you choose Replace mode — that serves your content verbatim with no auto rules. Append mode preserves everything (the WP defaults plus the StrataWP-managed AI-bot Allow/Disallow block) and adds your custom rules underneath. Use Append unless you have a specific reason to fully take over.
- New — AI Bot Analytics: server-side tracking of hits from 15 known AI crawlers (GPTBot, OAI-SearchBot, ChatGPT-User, ClaudeBot, Claude-Web, anthropic-ai, PerplexityBot, Perplexity-User, Google-Extended, Applebot-Extended, CCBot, Meta-ExternalAgent, Bytespider, Amazonbot, DuckAssistBot). New
SWPS_Bot_Analytics_Trackercaptures onshutdownpriority 999 so the post ID,is_404()state, andhttp_response_code()are settled; writes one row per bot request into{$wpdb->prefix}swps_bot_hits, then a daily cron rolls anything older than 7 days intoswps_bot_hits_dailyand prunes perswps_bot_analytics_retention(default 90). Excludes admin / AJAX / cron / REST / WP-CLI and configurable path prefixes (/wp-admin,/wp-json,/feed,/xmlrpc.phpby default). Optional 0–100 % sample rate for high-traffic sites viaswps_bot_analytics_sample_rate. No IP or referrer storage — keeps the GDPR-friendly stance of the existing pageview tracker. - New — "AI Crawlers" section on the Analytics page: total bot hits (with % delta vs prior 30 days), distinct active bots, 404s to bots, per-bot breakdown with last-seen, top crawled pages with 404 counts, AEO gap report (published posts no AI crawler has fetched in 30 days — actionable for sitemap re-submission and internal linking), and recent bot 404s for redirect candidates.
- New — REST API:
GET /wp-json/swps/v1/bot-analytics/summary,/top-pages(with optionalbotfilter),/gaps. - New — WP-CLI:
wp swps bot-stats [--days=N] [--bot=KEY] [--format=table|json]. - New — Per-post stats: the post-edit Analytics metabox now includes bot hit counts (7d / 30d) and last-seen, so editors see "GPTBot crawled this 4× last week" next to human pageview stats.
- New — Extension points:
swps_ai_bots_knownfilter (add custom bots — shared by robots.txt allowlist and analytics),swps_bot_analytics_capture(veto a hit),swps_bot_analytics_normalize_uri(custom URI bucketing), andswps_bot_analytics_hitaction (fires per captured hit).
- Fix — Scheduled posts had no images: WP-Cron-generated posts were being saved without a featured image or in-content images, and nothing was reaching
debug.log. Root cause was PHPmax_execution_timekilling the worker mid-image-download — AI text + Gemini featured image + 3 in-content Gemini images stack well past the 30–60s default cron limit, anderror_log()calls inside the catch paths can't fire when PHP dies insidewp_remote_post.SWPS_Generator::generate_post()now calls@set_time_limit(0),wp_raise_memory_limit('admin'), andignore_user_abort(true)before kicking off the pipeline. Manual generation worked already (admin-ajax has its own request context); the fix covers cron, background processor, REST, CLI, and bulk AJAX entry points. Any real provider errors (blocked prompts, missing keys, decode failures) now surface through the existing handlers inclass-gemini-provider.phpinstead of being swallowed by a timeout.
- Fix (#24): Saving the Google (Gemini) API key from the Settings screen had no effect. The same
swps_google_api_keyfield was registered in both the AI Provider and Featured Images sections, so the form contained two inputs with the same name. The hidden Featured Images duplicate (empty by default) was submitted last and overwrote the value the user typed in the AI Provider section. The Featured Images section now shows an info row pointing to the AI Provider key instead of duplicating the input.
- Migration tool (StrataWP SEO → Migrate): new admin page that imports settings from Yoast SEO, Yoast SEO Premium, Rank Math, and Rank Math Pro into StrataWP SEO. Auto-detects installed source plugins by scanning postmeta + options, shows post counts, offers Preview before Run, lets users choose skip-existing vs overwrite, and keeps a typed backup so any migration can be undone with one click.
- Per-post meta: meta title, meta description, focus keyword, canonical URL, breadcrumb title, social title/description/image. First non-empty source wins; streamed in 100-post batches so it scales to large sites.
- Global settings: title separator (Yoast separator codes like
sc-dashdecoded to literal characters), title templates per post type / taxonomy / archive (author, date, search, 404, post-type-archive), per-post-type noindex flags. Rank Math template variables (%title%,%sep%,%sitename%,%term%,%search_query%, …) are rewritten to StrataWP's%%var%%syntax with longest-match-first ordering to avoid partial replaces. - Redirects: imports active redirects from Yoast Premium (
wpseo-premium-redirects-base+ regex variant) and Rank Math Pro (wp_rank_math_redirectionstable,status='active'rows). All inserts go throughSWPS_Redirect_Manager::add_redirect()for validation; 301/302/307/410 supported; regex flag preserved. - UI: phase checkboxes (post meta / settings / redirects), preview and report show counts for all three phase types, and the Undo button reverts everything atomically — restores post meta values (or deletes them if they didn't exist before), restores option values, and DELETEs the redirect rows the migration inserted.
- GitHub-based auto-updates: when a new release is published on the official GitHub repository, all installs see "Update available" on the WordPress Plugins screen and can one-click update directly — no manual zip download needed. Cached for 12 hours to respect GitHub's rate limits.
- Fix — Sitemap Disable/Enable toggle: button label and row state were stuck because the JS read the wrong response field. Backend exclusion was already honored. (#20)
- Backlinks (Insights → Backlinks): new manual + CSV-import backlink tracker. Custom DB table, daily WP-cron health verification (live/lost/broken), AJAX bulk-verify with 25-row batches, per-row re-verify and delete, CSV import (auto-detects Google Search Console "Top linking sites" exports), CSV export, dashboard tile + recent-activity list. Replaces the previous "coming soon" placeholder with a real, working feature.
- Crawlers & Files (SEO → Crawlers & Files): new page to edit
/llms.txt(Auto / Custom modes) and/robots.txt(Auto / Append / Replace modes) directly from the admin. Side-by-side editor + auto preview, one-click "copy auto into editor", warning when a physical robots.txt would override the dynamic version.
- Local SEO (SEO → Local SEO): LocalBusiness JSON-LD output for brick-and-mortar and service-area sites. 30+ business types (Restaurant, Plumber, Dentist, Hotel, etc.), full NAP fields, opening hours per day, geo coordinates, area served, Google Place ID. Live schema preview. Defers to Yoast/RankMath/AIOSEO when active.
- Image SEO (SEO → Image SEO): auto-alt on upload (Heuristic free mode or AI mode using the configured provider), device-prefix-stripping filename sanitization, lazy-loading enforcement on
the_content, bulk-fix tool for the existing media library with batched AJAX progress, library coverage stats. - Modules registry: Local SEO and Image SEO unlocked with NEW badges; Backlinks added as a "soon" entry; WooCommerce SEO retained as the only remaining "soon" module.
- Dashboard: backlinks tiles updated to honest framing ("BYO API key" / "integration in development") prior to 4.2.2 lighting them up with live data.
- Critical fix: moved
swps_render_optimize_row()andswps_render_competitor_row()declarations to the top of their templates. PHP doesn't hoist conditionally-declared functions, so calling them from the queue/list loop before theif ( ! function_exists() )block ran was a fatal once any post had a cached score. Fixes "There has been a critical error" on Auto-Optimize and Competitors pages.
- Auto-Optimize re-scan now chunked — scans 10 posts per request with live progress (
Re-scoring 30/137 (22%)). Newswps_optimize_scan_chunkAJAX endpoint +score_chunk()server method. 90sset_time_limitper chunk; per-post try/catch so a single corrupt post doesn't kill the batch. Fixes "Request failed" on busy sites.
- Auto-Optimize: added
set_time_limit(180),wp_raise_memory_limit('admin'),ignore_user_abort(true), and a server-side try/catch to surface real errors instead of generic 500s. JS upgraded from$.postto$.ajaxwith a 4-min client timeout and clearer fail messages (HTTP status, "timed out").
- Brand palette overhaul — switched from gold/black to Emerald → Teal (
#10B981 → #14B8A6dark,#059669 → #0D9488light). Brand gold was clashing with status warn/info colors that also used gold tints; the new emerald-teal brand sits cleanly alongside the new semantic palette. - Status palette refreshed — green for good (
#22C55E/#16A34A), red for bad (#EF4444/#DC2626), orange for warn (#F97316/#C2410C), blue for info (#3B82F6/#2563EB), violet for AI (#8B5CF6/#7C3AED), sky for "new" highlights (#0EA5E9/#0284C7). - Killed the colored halo on primary CTAs —
--swps-accent-glowis now a clean depth shadow instead of a yellow neon glow. - Cleaned up every hardcoded brand-gold rgba in
tokens.css,components.css,shell.css,templates.css,pages/dashboard.css,admin.css.
- NEW: AI Auto-Optimize page — finds underperforming posts, generates AI edit proposals, applies edits with diff review. Manual review queue: every change is reviewed before it touches content. AJAX-driven, lives at
Create → Auto-Optimize. - NEW: Competitor Watch page — tracks up to 10 competitor URLs. Daily WP-cron auto-scan via RSS / Atom (auto-discovered) with sitemap.xml fallback; always also fetches homepage for
<title>, first<h1>, and JSON-LD schema types. Diff between last two snapshots surfaces new posts, new schema types, title/H1 changes. Lives atInsights → Competitors. - Dashboard widget — Row 4 "Competitor watch" shows the 3 most-recently-changed competitors with one-line summaries, plus a Backlinks placeholder tile.
- Plugin self-registration —
SWPS_Auto_OptimizeandSWPS_Competitorsnow register their own admin submenus and AJAX handlers (cleaner than the old dashboard-registered scaffolds).
- Admin shell redesign — branded top bar (logo, breadcrumb, search, theme toggle, help) on every plugin page, replaces the old in-shell sidebar nav (now uses WP's native admin sidebar). Per-user dark/light theme toggle persisted to user meta.
- Tokens-based design system —
admin/css/tokens.cssfor:rootand[data-swps-theme="light"]variables;admin/css/components.cssfor buttons, tiles, toggles, badges, chips, status pills;admin/css/templates.cssfor the data-dense template;admin/css/pages/*.cssfor per-page layout. - Dashboard rebuild — KPI tiles, recent generations, AI cost (30d), top issues, top GSC queries, modules grid with on/off toggles per feature, and slot-in widgets for Auto-Optimize and Competitors.
- IndexNow batch submit — replaces the dead Google/Bing sitemap ping endpoints (retired 2023). Submits 50 most recently modified posts to
api.indexnow.org(Bing's IndexNow feed powers ChatGPT search). - Yoast replacement — fully implements the meta-editor + sitemap + breadcrumbs + redirects layer from v3 with conflict detection.
- IndexNow batch submission replaces the dead Google/Bing sitemap ping endpoints (retired in 2023). Ping now submits 50 most recent posts and reports real status.
- Fixed Sitemaps admin page:
[object Object]ping result, blank Settings tab (missingdata-tabattributes), permanent "Loading..." (wrong nonce object reference).
- Sitemaps admin: fixed nonce reference (
swps_admin→swpsAdmin), addedswps-adminJS dep, fixed tab contentdata-tabattributes.
- New AI Crawlers settings section with multi-checkbox allowlist for 15 known AI bots (GPTBot, ClaudeBot, PerplexityBot, Google-Extended, Applebot-Extended, CCBot, Meta-ExternalAgent, Bytespider, Amazonbot, DuckAssistBot, etc.)
- New
SWPS_AI_Botsclass hooksrobots_txtto injectAllow/Disallowrules. - Dynamic llms.txt generator served at
/llms.txtwith site description intro, posts/pages/categories, and one-line summaries from meta description → excerpt → trimmed first paragraph. - New
multi_checkboxsettings field type anddefaultarg support for checkboxes.
- New Debug admin page (StrataWP SEO → Debug) showing the last failed AI response (raw + cleaned) for diagnosis.
- AI JSON parser: 5th repair attempt combining quote repair + control-char sanitization. Strips Unicode line/paragraph separators (U+2028/U+2029) up front. Persists raw response to a transient on parse failure.
- Added Claude Opus 4.7 to the model dropdown (released April 2026).
- Cost tracker pricing entry for Opus 4.7.
- Fixed JSON prefill incorrectly enabled for Claude 4.6+ models. Broadened the "no prefill" check to cover all 4-6, 4-7, 4-8, 4-9, 5-x model ID patterns. Resolves "This model does not support assistant message prefill" error.
- Admin visual refresh — Slate & Coral palette across calendar, modals, SERP preview, progress, all component colors. Polish on stats grid, result cards, and previews. Responsive styles + loading states.
- Chart.js v4 fixes (CDN version pinning, canvas height constraint to prevent infinite scroll).
- Updated AI model defaults.
- Redirects, sitemaps, and internal linking system added.
- Full Sitemap System — Sitemap index with post type, taxonomy, and author sub-sitemaps. Per-URL priority/changefreq control. Image sitemap entries. IndexNow support.
- Search Appearance — Title/description templates with template variables. Title separator picker.
- Taxonomy & Archive SEO — Per-term meta on category/tag/taxonomy edit screens.
- Redirect Manager — 301/302/307/410 with exact and regex matching. 404 monitoring with one-click redirect creation. Auto-redirect on slug change.
- Frontend Breadcrumbs — HTML breadcrumbs with inline schema. Template function, shortcode, configurable separator.
- RSS Feed Optimization — Configurable before/after content with template variables.
- wp_head Cleanup — Toggle removal of generator tag, RSD, shortlink, REST API link, oEmbed, emoji scripts.
- Keyword Research & Tracking — AI keyword suggestions, GSC rank tracking, striking distance opportunities (positions 8-20).
- SEO Meta Editor — Per-post meta title/description, social previews, robots controls, live SERP preview, character counters, SEO checklist with focus keyword analysis, AI Generate button.
- 5 new developer hooks for meta/keyword extensibility.
- On-site analytics — page views, time on page, scroll depth, bounce rate (cookie-free, GDPR-friendly).
- Google Search Console OAuth — clicks, impressions, CTR, position.
- Unified analytics dashboard with charts, metric cards, date range filtering.
- Per-post analytics metabox, sortable Views (30d) column on posts list.
- Configurable retention (30/90/180/365 days), 3 new analytics hooks.
- Schema / Structured Data (Article, Breadcrumb, WebSite, Organization/Person JSON-LD).
- Yoast/RankMath/AIOSEO conflict detection.
- 7 schema settings fields with developer filter hooks.
- Technical SEO Audit with 8 modules (Canonical, Sitemap, OG, Twitter, Robots.txt, Meta Robots, Image SEO, Page Speed).
- Auto-fix for canonical tags, OG/Twitter meta, sitemap generation.
- Dashboard widget with site health score.
- Voice profiles, in-content image insertion, content scoring with quality gate.
- Topic queue, content calendar, cost tracking, rate limiting, duplicate detection.
- Bulk generation (up to 5 posts), WP-CLI commands, REST API.
- Multi-provider AI and image support, 7 content templates, Key Takeaways with schema.
- 20+ developer hooks.
- Initial release. AI content generation with Anthropic Claude. Featured images via Unsplash. FAQ schema. Internal linking. Scheduled publishing.
StrataWP SEO is licensed under the GPL v2 or later.