WP Manifestindependent plugin directory
manifest / seo / smart-seo-fixer-v2

Smart SEO Fixer WP Registry grade A. No security issues foundWP RegistryNo security issues foundOpen the reportA

AI-powered SEO optimization plugin for WordPress

★ 0stars
v2.1.2latest · 1mo ago

Install

Download source zip No release zip yet

This is the repository archive. It installs, but the folder name will carry the branch suffix and updates will not flow.

Install straight from GitHub with WP-CLI:

wp plugin install https://github.com/mbheramil/smart-seo-fixer-v2/archive/refs/heads/main.zip
Updates itself. It ships its own updater, so new versions appear under Dashboard → Updates.

AI-powered SEO optimization plugin that analyzes and fixes SEO issues using AWS Bedrock (Claude), OpenAI, Anthropic, or Google Gemini.

Description

Smart SEO Fixer is a powerful WordPress plugin that uses AI to analyze and optimize your website's SEO. Choose your AI provider — AWS Bedrock (Claude, the default), OpenAI, Anthropic Claude, or Google Gemini. It automatically detects issues and generates optimized titles, meta descriptions, and alt text — with zero gaps.

Key Features:

  • SEO Analysis - Comprehensive analysis of titles, meta descriptions, content, headings, images, and links
  • AI-Powered Generation - Generate optimized SEO titles, meta descriptions, and focus keywords using AWS Bedrock (Claude), OpenAI, Anthropic, or Gemini
  • 4-Layer SEO Protection - Auto-generate on publish/update, background cron, dashboard alerts, and bulk fix
  • SEO Score - Get a score from 0-100 for each post/page with detailed feedback
  • Readability Scoring - Flesch Reading Ease, sentence length, passive voice detection
  • Bulk Analysis & Fix - Analyze and AI-fix all posts at once
  • Schema Markup - Automatic JSON-LD structured data for articles, pages, products, and local business
  • XML Sitemap - Built-in sitemap generator with automatic search engine pinging
  • Meta Tags - Full control over titles, descriptions, canonical URLs, and robots meta
  • Open Graph & Twitter Cards - Automatic social media meta tags with image fallbacks
  • Social Previews - Live Google, Facebook, and Twitter preview in the editor
  • Redirect Manager - 301/302 redirects, auto-detect slug changes, 404 tracking
  • Breadcrumbs - Schema-enriched breadcrumbs via shortcode or PHP function
  • Local SEO - Multiple business locations with LocalBusiness schema
  • WooCommerce SEO - Product schema, category SEO, brand/GTIN fields
  • Search Console Fixer - Detect and fix trailing slash issues, redirect chains, canonical conflicts
  • Migration Tool - Import from Yoast, Rank Math, AIOSEO, SEOPress, The SEO Framework
  • Auto-Updater - GitHub-based updates with private repo support
  • Theme Compatibility - Works with any theme, including those without title-tag support

What Gets Analyzed:

  • Title length and keyword placement
  • Meta description length and content
  • Content length and keyword density
  • Heading structure (H1, H2, H3)
  • Image alt text
  • Internal and external links
  • URL/slug optimization
  • Readability metrics

Installation

  1. Upload the plugin files to /wp-content/plugins/smart-seo-fixer/
  2. Activate the plugin through the 'Plugins' menu in WordPress
  3. Go to Smart SEO → Settings and configure your AI provider (AWS Bedrock, OpenAI, Anthropic Claude, or Google Gemini)
  4. Click Analyze All Posts on the dashboard to get started
  5. Enable Auto Meta Generation in Settings for hands-free SEO

Frequently Asked Questions

Do I need an AI API key?

Yes, to use the AI-powered features (title generation, meta description generation, keyword suggestions), you need credentials for one provider: AWS Bedrock (access key + secret), OpenAI, Anthropic Claude, or Google Gemini.

The plugin will still work for manual SEO analysis without an API key.

What OpenAI model should I use?

We recommend GPT-4o Mini for the best balance of quality and cost. It's fast, affordable, and produces excellent SEO content.

How much does it cost to use?

The plugin itself is free. OpenAI charges based on usage. GPT-4o Mini costs approximately $0.15 per million input tokens and $0.60 per million output tokens - very affordable for SEO content generation.

Will this conflict with other SEO plugins?

Smart SEO Fixer includes a migration tool to import data from Yoast, Rank Math, and others. You can also enable "Disable Other SEO Output" in settings to prevent duplicate meta tags.

Is my content sent to OpenAI?

When you use AI features, relevant content is sent to OpenAI for processing. OpenAI does not use API data for training.

Does this work with any theme?

Yes. The plugin forces title-tag support for themes that don't declare it, and includes a fallback output buffer to ensure titles always render correctly.

Screenshots

  1. Dashboard showing SEO health scores and statistics
  2. SEO analysis metabox in post editor with social previews
  3. Bulk analysis and AI fix of all posts
  4. Search Console Fixer for URL consistency
  5. Redirect Manager with 404 tracking
  6. Settings page with API configuration

Changelog

2.0.86

  • IMPORTANT FIX: The Settings page's AI Provider status badge showed "Not configured" for a Bedrock site with no AWS keys of its own, even when that site is actually working correctly via the automatic broker connection added in 2.0.85 — the badge only ever checked for a raw access/secret key pair and had no idea the broker exists. It now reflects the real, broker-aware configuration state, and shows a clear note when a site is running on the automatic connection with no AWS keys of its own. "Test Connection" also no longer requires typing in an Access Key/Secret Key just to test the connection a site is actually using — leave both blank to test the real, current connection (broker or otherwise).

2.0.85

  • Bedrock now automatically tries a central broker first on every AI request, with zero configuration. On infrastructure the broker recognizes, AI works the moment the plugin is active — no wp-config.php changes at all. On any other site, this is invisible: it falls straight through to that site's own configured AWS credentials, or the normal "not configured" message, exactly as before this existed. SSF_BEDROCK_BROKER_TOKEN remains available for individually granting a specific site access outside that recognized infrastructure.
  • Bulk/parallel AI runs now use the fast concurrent path whenever a site has its own AWS credentials configured, regardless of the broker; only a site with no credentials of its own falls back to the slower sequential path.

2.0.84

  • Bedrock broker mode is now simpler to turn on: only SSF_BEDROCK_BROKER_TOKEN needs to be set in wp-config.php. The broker's URL ships as a built-in default — it's not sensitive on its own (a request without a valid per-site token gets nothing but a 401), only the token needs to stay out of the codebase. SSF_BEDROCK_BROKER_URL remains available to override the default if you ever point a site at a different broker deployment.

2.0.83

  • NEW: AWS Bedrock broker mode. Set SSF_BEDROCK_BROKER_URL and SSF_BEDROCK_BROKER_TOKEN in wp-config.php to route Bedrock requests through a small proxy that holds the real AWS credential centrally (never on any WordPress site). Each site instead gets a cheap, disposable per-site token — worthless if copied via a migration/backup/clone, and instantly revocable without touching AWS. Fully backward compatible: without these constants defined, behavior is unchanged. Bulk/parallel AI runs fall back to sequential requests when broker mode is active (correct, just not the fast concurrent path).

2.0.82

  • Internal: This release retargets the auto-updater to a new repository (mbheramil/Smart-SEO-Fixer-v2). No functional changes. Future updates will be checked and downloaded from the new repository going forward.

2.0.81

  • Fix: Content Suggestions treated a WooCommerce product exactly like a blog post — a suggestion could read "change title from 'Wedding Cigar Station' to 'Cigar Station for Weddings & Events'", which looks like it's proposing to rename the product itself. It never actually touched the product name (title suggestions only ever update the separate SEO title tag), but the wording didn't say that. Suggestions for products (and any custom post type you register via the ssf_content_suggestions_named_entity_post_types filter) now say explicitly that the name/title stays unchanged, and the AI is instructed never to propose a rename for these post types in the first place.
  • NEW: Suggestions that can't be generated automatically (missing image, missing internal/external link) now include a "View Live" link to the actual page, so there's a real next step instead of a dead-end error message.

2.0.80

  • NEW: "Generate & Insert" button on every Content Suggestions card. Click it and AI writes the fix and saves it immediately — a new SEO title, a new meta description, or an added content section, depending on what the suggestion is about. Suggestions about a missing image or a missing link are left advisory-only, since fabricating a fake image or link target would do more harm than good.
  • Fix: The content score circle only ever reflected the rules pass and went stale the moment AI suggestions were added below it — a page could show a healthy "85" while several AI-found high-priority issues sat unfactored beneath it. The score now recalculates from every suggestion actually on the page.
  • Fix: The "Select a post to analyze" search gave no feedback for zero matches or a failed request — it just silently showed nothing, indistinguishable from a broken search box. It now shows "Searching…", "No posts found.", or the actual error.

2.0.79

  • Fix: The "View Details" popup on the Plugins page no longer shows a clickable link on the author name or a "Plugin Homepage »" link in the sidebar.

2.0.78

  • Fix: The "View Details" popup on the Plugins page (Plugins → Smart SEO Fixer → View details) showed "mbheramil" as the author, out of sync with the plugin header's "Author: mbh". Now shows "mbh" consistently.

2.0.77

  • NEW: Address autocomplete on the Local SEO page. Start typing a street address and pick a suggestion to auto-fill city, state, ZIP, country, and coordinates — for both the main business address and additional locations. Manual typing still works exactly as before either way.
  • Requires a Google Maps/Places API key set via the SSF_GOOGLE_MAPS_API_KEY constant in wp-config.php — not a Settings field. This key is billed per request, so it is never stored in the database or committed to this (public) repository; it lives only in wp-config.php on each site, the same way AWS Bedrock credentials can be set via SSF_BEDROCK_ACCESS_KEY. Without that constant defined, the address fields behave exactly as before.

2.0.76

  • Local SEO: Saving now shows exactly what schema markup was generated, right on the settings page — a "Generated Schema" panel appears with the JSON-LD after every save, so you can confirm it worked without having to check your site's page source. If "Enable Local Business Schema" is off, the panel says so clearly.
  • Local SEO: Added a proper error message if a save request fails over the network, instead of the button just re-enabling with no explanation.
  • Fix: Local Business schema generation could throw PHP warnings (visible in debug logs, and potentially leaking into page output) if the stored settings were ever missing their "hours" or "social" keys.

2.0.75

  • IMPORTANT FIX: Content Suggestions never worked — every request hit a PHP fatal error (the AJAX handler called a method that doesn't exist on the analyzer class) and the page was stuck on "Analyzing content..." forever with no error shown, because the request also had no failure handler to report it. Fixed the method call so analysis actually runs, and added an error message for network/server failures instead of an infinite spinner.

2.0.74

  • Removed the two remaining links to Client Report — the row on the Settings page and the shortcut tile on the Dashboard. Client Report is no longer reachable from anywhere in the admin UI.

2.0.73

  • Admin menu: Removed "Client Report" from the Smart SEO sidebar menu — it's linked from the bottom of Settings instead, so it isn't a separate nav item. The page itself still works exactly as before for anyone using that Settings link.

2.0.72

  • Settings: Removed the GitHub Token field. It only mattered if this plugin's update repository were private, and it is public, so the field was unused. The last row on the Settings page now links to Client Report instead.
  • Admin menu: Removed "Code Audit" and "Performance" from the Smart SEO menu, along with their Dashboard shortcuts.

2.0.71

  • Cleanup: When AWS Bedrock credentials are set via wp-config.php constants, Settings no longer shows the masked Access Key ID / Secret Access Key / AWS Region fields (which were disabled and uneditable anyway). It now shows a simple Configured / Not configured status instead, with Test Connection still available.

2.0.70

  • Fix: One-click GA4 property creation could fail with "The value for the 'time_zone' field must be a valid value from the IANA timezone database." This happened on sites where Settings > General > Timezone is set to a manual UTC offset (e.g. "UTC+2") rather than a city — WordPress returns that as a raw offset string, which Google Analytics rejects outright. Auto-setup now converts whole-hour manual offsets to the equivalent IANA zone and falls back to UTC for anything else, so property creation succeeds regardless of how the site's timezone is configured.

2.0.69

  • IMPORTANT FIX: When the AI could not actually look at an image, the plugin used to ask it to describe the picture from the file address alone. A model that cannot see the image will happily invent what is in it, and that invented description was saved and reported as an AI description. Alt text that confidently describes the wrong thing is worse than none — it misleads screen-reader users and search engines. The plugin now refuses to guess: if the image cannot be seen, it falls back to the filename and tells you so.
  • NEW: "Test AI Vision" button in Settings. It sends one image from your Media Library to your AI provider and shows you the description it came back with, so you can confirm the AI is really looking at your images. If it cannot, the test names the exact cause — missing credentials, a model that does not support images, or an unreadable image file — and what to do about it.
  • NEW: Every alt text run now reports whether descriptions came from the AI or from filenames, and when filenames were used, why. Previously a run could report "Done! 12 updated" with no hint that all twelve were guesses from filenames.
  • NEW: The Media Library Alt Text column marks any description that came from a filename with "(from filename)", so text that was never based on the actual image is easy to spot and redo later.
  • Settings now warns you up front if AI vision is not working, instead of only discovering it after a run.
  • Fix: A model that cannot analyse images was treated as "AI ready" purely because credentials were saved. Bulk runs were therefore throttled to tiny batches waiting on API calls that never happened, and new uploads were needlessly delayed by 15 seconds.
  • Fix: Automatic alt text on upload runs in the background where nobody sees the result. It now records in the plugin log when it had to fall back to the filename, so "why is my new image's alt text just the file name?" is answerable.
  • Applies to all four providers: AWS Bedrock, OpenAI, Anthropic Claude and Google Gemini.

2.0.68

  • NEW: Alt text is now editable right in the Media Library. A new "Alt Text" column shows each image's current alt text, or a red "Missing" marker, with a Generate button on every row (Rewrite when text is already there). No need to open each image.
  • NEW: "Generate with AI" button under the Alternative Text field, on both the attachment edit screen and the media popup you get when inserting an image into a post. The field is filled in place so you can review or edit before saving.
  • NEW: "Generate alt text (Smart SEO)" bulk action in the Media Library — tick several images, pick it from the Bulk actions dropdown, and get a summary of how many were described, already had text, or could not be described. To protect your work it only fills images that are MISSING alt text; use Rewrite Existing Alt Text in Settings to replace text.
  • Yes, new uploads are still described automatically — that behaviour is unchanged and controlled by "Automatically generate alt text for new image uploads" in Settings. The new buttons are for images already in your library, or when you want to redo one by hand.
  • Fix: Loading plugin assets on the Media Library could have blanked the post editor's script configuration, because WordPress replaces (rather than merges) a repeated script localization. The Media Library now reuses the editor's configuration instead of declaring a second one.
  • Per-image generation is permission-checked per attachment, so editors can describe their own uploads without needing full administrator rights.

2.0.67

  • NEW: The Bulk Generate Alt Text panel now shows live counts — total images in the Media Library, how many have alt text, how many are missing it, and your coverage percentage. Previously there was no way to see the size of the job before starting it.
  • NEW: "Rewrite Existing Alt Text" button. The old button only filled in images with an EMPTY alt field, so images already holding weak filename-based text (or text left over from the 2.0.66 naming bug) were invisible to it and the run reported "0 updated". The new button regenerates alt text that already exists.
  • Alt text this plugin generated is now tagged as such, so rewriting can safely replace its own output while leaving alt text you wrote by hand untouched. An opt-in checkbox is available if you really do want to overwrite everything.
  • Fix: Alt text on upload was generated twice by two different handlers hooked to the same event. The older synchronous one won the race and blocked the media uploader with an AI request, which meant the background processing added in 2.0.66 never actually took effect. There is now a single upload path.
  • Fix: The older upload handler used its own copy of the filename cleaner that still contained the pre-2.0.66 bug and did not sanitise AI output. It now delegates to the single maintained implementation.
  • Fix: Alt text counts now exclude images in the Trash, so the totals match what you see in the Media Library.
  • Enhanced: Rewrite results show the old text struck through next to the new text, so you can see exactly what changed.
  • Enhanced: Counts refresh automatically as a run progresses, plus a "Refresh counts" link.

2.0.66

  • CRITICAL FIX: Image alt text was being corrupted. The filename cleaner stripped a leading letter from ordinary words, so "party-rentals.jpg" became "Arty Rentals", "photo-booth.jpg" became "Hoto Booth", "pool-slide.jpg" became "Ool Slide", and "video-tour.jpg" became "Eo Tour". Camera prefixes (IMG, DSC, PXL_) are still removed, but only when followed by a separator or digits — never when they are part of a real word.
  • CRITICAL FIX: Corrupted alt text already saved to your site is repaired automatically on update. Only values that exactly match the old buggy output are touched; anything you wrote by hand is left alone.
  • CRITICAL FIX: "Generate Missing Alt Text" could loop forever. Images with no usable filename (IMG_1234.jpg) were never excluded from the next batch, so the progress never completed and the browser kept hammering the server. Undescribable images are now flagged and skipped, with a "Retry skipped images" link.
  • NEW: Bulk alt-text generation now uses AI vision — the image itself is sent to the model, which describes what is actually in the picture instead of guessing from the filename. Works with Bedrock (Claude), OpenAI (GPT-4o), Claude API, and Gemini.
  • Fix: The parallel (fast) alt-text path used when fixing a post's images sent only the image URL as text, so the model never saw the image and invented descriptions. It now sends the actual image bytes.
  • Fix: Alt text generated for images in post content is now also saved to the Media Library (attachment alt field), so themes, page builders, and the "missing alt text" counters pick it up.
  • NEW: Gemini now supports vision for alt text (previously URL-only, which could not see the image).
  • Enhanced: Alt-text generation on upload runs in the background, so uploading images is no longer slowed down by an AI request.
  • Enhanced: Bulk generation shows a real progress bar, live sample results labelled AI or filename, a Stop button, and resumes where it left off if a request fails.
  • Enhanced: AI output is cleaned up — wrapped quotes, "Alt text:" labels, and "Image of…" preambles are stripped, and long descriptions are trimmed to a screen-reader-friendly length.
  • Fix: Settings no longer claim uploads are described by a vision AI when no AI provider is configured; it now tells you it is using filenames and how to change that.

2.0.65

  • Fix: Existing broken-link false positives are now cleared automatically. Links that older versions flagged as broken but are really just bot-blocked, auth-protected, or rate-limited (403, 401, 429, and LinkedIn's 999 — e.g. YellowPages, LinkedIn, many directories) are removed from the list on update. New scans already ignore these (v2.0.64); this cleans up the ones already recorded.

2.0.64

  • CRITICAL FIX: Broken Link Checker "Scan Now" did nothing on real sites. It tried to scan up to 50 posts (each link waiting up to 10s) in a single request, which always exceeded the PHP time limit — the request died with no feedback and the button spun forever. The scan now runs in small batches with a live progress bar, resumes if a batch times out, and updates the stat cards when done.
  • Enhanced: Far fewer false positives. Link checks now use a browser-like user agent, retry with a ranged GET when a server rejects HEAD (403/405/400/501), and treat auth/bot-block/rate-limit responses (401, 403, 429, LinkedIn's 999) as working links rather than "broken."
  • Enhanced: Broken-link stat cards refresh instantly after a scan or filter without a page reload.

2.0.63

  • New: Refresh button on the 404 Error Log (Redirect Manager) to re-check entries on demand.
  • New: The 404 log now shows a green "Redirected" badge on any entry that's already covered by an active redirect rule (exact or path-preserving wildcard), so you can instantly see which 404s are resolved vs. still need attention.

2.0.62

  • New: Path-preserving wildcard redirects. When the "From" ends with and the "To" ends with a slash (or ), the rest of the request path is carried across — so a single rule like /wp-content/uploads/* → https://cdn.example/wp-content/uploads/ forwards every file to the same path on a CDN, keeping the filename. Previously wildcard redirects sent everything to one fixed URL. Ideal for moving a folder or catching offloaded-media 404s (e.g. WP Offload Media / CloudFront) that a media player references by hardcoded URL.
  • Fix: The redirect "From" field now also accepts a full URL (its path is used), so a pasted absolute URL matches correctly instead of silently never firing.

2.0.61

  • Fix: A bogus "Some pages could not be fixed: Unknown fix type" popup appeared when running the orphaned-pages "Fix All with AI" bulk action. The orphan fix was actually working — a second (generic) click handler was double-firing on the same button and sending an unknown fix type. The generic handler now correctly ignores the orphaned-pages button, which has its own handler.

2.0.60

  • New: IndexNow instant indexing. New and updated pages are pushed to Bing, Yandex, Seznam, Naver and other IndexNow engines the moment they publish — crawled in minutes instead of days. Enabled by default; a verification key file is served automatically. Replaces the old Google/Bing sitemap "ping" calls, which both engines retired in 2023.
  • New: Image sitemap. The XML sitemap now lists each page's images (featured + in-content) so they can be discovered and rank in Google Images.
  • New: Crawl & index hygiene. Internal search-results pages, 404s, and paginated archive subpages (page 2+) are now noindexed, so Google spends crawl budget on real pages and doesn't index thin/duplicate listings.
  • Fix: Open Graph image dimensions now reflect the actual image instead of a hardcoded 1200×630, so social/SERP previews render correctly.
  • Improved: The AI Content Suggestions analysis is now keyword-ranking-focused — it tells you the specific subtopics, searcher questions (People Also Ask style), related terms, internal links, and depth changes to add so a page can rank for its target keyword, grounded in the actual content (no invented facts).

2.0.59

  • CRITICAL FIX: The Search Console "AI Generate" / "AI Generate All Missing" buttons showed "Fixing X/Y…" but left every row marked "Missing" with no explanation. Two causes, both fixed: (1) the bulk loop silently swallowed every failure, so a run where all AI calls failed looked identical to a successful one; (2) even successful fixes never updated the row text. Each row now shows ✓ Fixed (with the new title/description) or ✗ with the actual error, and the run ends with a clear "X fixed, Y failed" summary plus the real failure reason.
  • Fix: Automatic AI model fallback. If Claude Haiku 4.5 isn't enabled for your AWS Bedrock account/region, the plugin now automatically falls back to Claude 3.5 Haiku so AI generation keeps working instead of failing silently — and logs a one-line notice in the Debug Log telling you to enable the newer model under AWS Console → Bedrock → Model access.

2.0.58

  • Fix: Reduced AI hallucination in generated titles, meta descriptions, and focus keywords. Every generation prompt now carries an explicit grounding rule — the model may only use facts present in the post content and is forbidden from inventing statistics, prices, locations, dates, awards, ratings, or unfounded superlatives ("best", "#1", "top-rated", "leading"). Applies to the per-post buttons, Bulk AI Fix, and the background cron, across both AWS Bedrock and OpenAI.
  • Fix: Lowered the generation temperature to 0.3 for titles/descriptions/keywords (was 0.5–0.7), keeping output much closer to the actual content.

2.0.57

  • CRITICAL FIX: The XML sitemap was being served with an HTTP 404 status on many sites — valid XML, but Google rejects any sitemap that doesn't return HTTP 200, so nothing got indexed from it. The sitemap now always responds 200 OK.
  • Fix: Sitemap stylesheet declared XSLT 2.0, which no browser can render — viewing /sitemap.xml showed a blank or raw page. Corrected to XSLT 1.0.
  • Fix: Sitemap rewrite rules are now re-flushed automatically on update, so /sitemap.xml and all sub-sitemaps resolve without a manual Settings → Permalinks save.
  • Fix: Post-type sub-sitemaps are no longer listed in the index when all their published posts are noindex (which produced empty sitemaps Google flags as errors).
  • Change: AI model upgraded to Claude Haiku 4.5 on AWS Bedrock (us.anthropic.claude-haiku-4-5-20251001-v1:0) — newer, sharper SEO copy at the same low cost. Existing sites are migrated automatically.

2.0.56

  • Fix: Migration engine rewritten — Rank Math template variables (%title%, %sitename%, %sep%) are now resolved instead of being imported as literal text, and Rank Math's robots array no longer crashes the import on PHP 8.
  • Fix: All in One SEO v4 data is now read from its custom database table (titles, descriptions, focus keyphrase, canonical, robots, social) — previously v4 sites migrated almost nothing.
  • Feature: Migration now imports social media data (Open Graph + Twitter titles, descriptions, images), nofollow flags, and AIOSEO v4 smart tags (#post_title etc.).
  • Feature: SEOPress and The SEO Framework migration support (previously claimed but not implemented).
  • Fix: Drafts, scheduled, pending, and private posts are now migrated (previously silently skipped — published-only).
  • Fix: Posts with only a focus keyword, canonical, or robots flag (no title/description) are now picked up by migration.
  • Fix: Migration errors now surface as readable messages in the progress UI instead of breaking the progress loop.
  • UI: Migration page now states exactly what is and isn't migrated; preview shows resolved titles exactly as they will be saved.

2.0.55

  • UI: Complete admin design-system refresh — modern layered shadows, refined color palette, larger radii, gradient primary buttons, polished inputs with focus rings, table row hover states, filter chips, animated progress bars with shimmer, modal backdrop blur with spring entrance, staggered stat-card animations, styled scrollbars, and page fade-in.
  • UI: Visible keyboard-focus outlines for accessibility; all motion respects prefers-reduced-motion.
  • UI: WordPress core buttons, inputs, selects, and list tables restyled consistently across all plugin screens (scoped to plugin pages only — the post editor and the rest of wp-admin are untouched).

2.0.54

  • Fix: Redirects created from the 404 Monitor never actually fired (wrong flag key, no ID) — now routed through the Redirect Manager, and existing broken rules are auto-repaired via DB migration v8.
  • Fix: Background job queue is now protected by a cross-request lock — concurrent cron/loopback/poll workers could previously process the same batch twice (duplicate AI calls, corrupted progress counts).
  • Fix: Stuck-job detection now tracks real progress — large bulk jobs running longer than 30 minutes were being killed mid-run even while still advancing.
  • Fix: Consolidated the two parallel 404 logging systems into the DB-backed 404 Monitor; the Redirects page tab and Search Console scan now read from it.
  • Fix: 404 log growth is now capped (least useful entries pruned automatically) and stale job/404 cleanup routines actually run.
  • Fix: Slug-change auto-redirects now compute the old URL safely (previously corrupted URLs when the slug appeared elsewhere in the path).
  • Security: Plugin deletion now removes ALL stored credentials (OpenAI/Claude/Gemini API keys were previously left in the database) plus every option, transient, and cron event.
  • Security: GitHub updater token is now only sent to verified github.com hosts (was vulnerable to substring-match spoofing).
  • Performance: Table-existence checks run once per plugin version instead of on every admin page load.
  • Reliability: Queue loopback tick no longer rejected at hour boundaries.

2.0.53

  • Chore: Version bump.

2.0.52

  • Fix: Version bump to trigger auto-update on sites still running older versions.

2.0.51

  • Feature: Instant auto-update — plugin checks GitHub every 5 minutes via WP-Cron and silently applies new versions without requiring a manual click.

2.0.50

  • Chore: Remove Plugin URI and Description from plugin header to hide author/repo info on WP Plugins page.

2.0.49

  • Fix: Haiku 3.5 on Bedrock also requires the us. cross-region inference profile prefix — on-demand direct invocation is not supported. Correct model ID: us.anthropic.claude-3-5-haiku-20241022-v1:0.

2.0.48

  • Fix: Haiku model ID still invalid — segment order was wrong (claude-haiku-3-5 → claude-3-5-haiku). Correct Bedrock ID is anthropic.claude-3-5-haiku-20241022-v1:0.

2.0.47

  • Fix: "The provided model identifier is invalid" error on Bedrock after Haiku switch. Claude 3.x models use the direct Bedrock model ID (anthropic.claude-haiku-3-5-20241022-v1:0) without the us. cross-region prefix — that prefix is only for Claude 4.x inference profiles.

2.0.46

  • Fix: Orphaned page "Add Link with AI" always failed with "Could not find a natural placement" for location/service-area pages (e.g. "Inspections in Webster Groves, MO"). Root cause: no other page on the site mentions the city name, so AI correctly returns {found:false} for all candidates — and the fallback page also fails. Added a guaranteed last-resort: when all AI placement attempts fail, the plugin now appends a Related: [page title] link paragraph to the highest-relevance candidate page, ensuring every orphan gets at least one incoming internal link.

2.0.45

  • Change: Switched AWS Bedrock model from Claude Sonnet 4.6 to Claude 3.5 Haiku (us.anthropic.claude-haiku-3-5-20241022-v1:0) — same quality for SEO tasks at 4x lower cost.

2.0.44

  • Fixed: Image alt-text generation was producing hallucinated / generic output because every provider (Bedrock, Claude, OpenAI) was sending only the image URL as plain text — the AI could not actually see the image, it was just guessing from the filename slug. Now uses true vision: the image bytes are fetched, base64-encoded, and sent as a multimodal message block. Claude on Bedrock (vision-capable), Anthropic Claude, and OpenAI GPT-4o/4-turbo all receive the actual pixels and describe what they see. Images larger than 4 MB are auto-resized to Claude's recommended max 1568px edge. Non-vision models (Llama / Mistral / Titan on Bedrock) fall back to the URL-only prompt.
  • Added: SSF_AI::fetch_image_as_base64() helper that reads images from local uploads (fast path) or falls back to wp_remote_get, sniffs media type, and rejects unsupported formats (accepts jpeg/png/gif/webp only).

2.0.43

  • Fixed: Bulk AI Fix silently capped at ~999 posts per run no matter how many the user selected. Root cause: the frontend sent post_ids[] as an array, which on large selections exceeds PHP's default max_input_vars = 1000 and gets silently truncated by PHP before WordPress ever sees it. With 1453 selected, only the first 999 (ordered by post_date DESC) reached the server — and those were the same 999 that prior runs had already filled in, so every run returned "0 generated · 999 skipped — already has SEO data". Frontend now sends the selection as a single CSV field (post_ids_csv), so the entire list reaches the server in one input var regardless of size. Applied the same defense to bulk_fix and bulk_analyze endpoints.

2.0.42

  • Fixed: Applied the v2.0.41 enriched-context helper (post_content + post_excerpt + public post_meta + image alt/caption) to EVERY remaining AI generation entry point, not just Bulk AI Fix. Previously these paths still read raw $post->post_content and silently skipped page-builder / location-template CPTs the same way Bulk AI Fix did: post-save cron auto-SEO (smart-seo-fixer.php + class-admin.php), per-post meta-box Generate buttons for title / description / keywords / analyze, Fix Issue (title & description), bulk_fix sequential + parallel, bulk_ai_fix in-request + sequential fallback, ai_fix_single, Search Console duplicate-regen, fix_missing_seo_data, not-indexed AI fix (keyword + title + description), generate_unique_title, generate_unique_desc, content suggestions generator, and the job queue process_not_indexed_fix sequential path. All of these now pass the same enriched string used by the parallel Bulk AI Fix pipeline, so page-builder and location CPTs produce real SEO output across every UI surface.

2.0.41

  • Fixed: Bulk AI Fix reported "999/999 completed" but post_meta wasn't actually written for page-builder / location-template post types. Root cause: post_content on those CPTs is empty (real content lives in post_excerpt, ACF/page-builder meta, or attached image alt text), so the word-count gate skipped every post silently as "content too short" and counted the skip as success. Both the parallel and sequential bulk paths now call a new enrich_post_context() helper that combines body + excerpt + public meta + image alt/caption before the word-count gate and before prompting the AI.
  • New: Completion screen now shows a real outcome breakdown — "N generated · M skipped · K failed" with per-reason skip counts. If every post was skipped, a warning is surfaced so the user knows the job was a no-op instead of quietly assuming success.
  • Changed: ssf_get_job response now includes a summary object with generated / skipped / failed / reasons.

2.0.40

  • Fixed: Job Queue page always said "OpenAI Rate Limit" even when the site was wired to AWS Bedrock, Claude, or Gemini. The card now reflects the active AI provider's label and reads that provider's actual rate-limiter bucket. No behavior change — the bulk pipeline was already using the correctly configured provider; only the label was wrong.
  • Fixed: Job Queue page description said "10+ posts, 5 items per minute" which no longer matched the current parallel pipeline. Updated to "5+ posts, batches of 20 in parallel on Bedrock".

2.0.39

  • Fixed: Job Queue page "Recent Jobs" was always empty even when jobs existed in the database. The ssf_get_jobs response returned items but the view expected jobs, so the table never rendered. Now returns both keys and also computes the progress percentage per row.
  • Fixed: Bulk AI Fix progress bar stuck at 0/N. The ssf_get_job polling endpoint was reading non-existent columns (processed_count/failed_count instead of processed_items/failed_items), so it always reported zero progress even while batches were actually being processed.
  • Fixed: Non-Bedrock bulk jobs (OpenAI, Claude, Gemini) stalled at 0/N on low-traffic sites because the loopback self-tick only re-fired for Bedrock-parallel jobs. Every job type now chains its own next batch, turning long bulk runs from "1 post per minute via WP-Cron" into "continuous processing".
  • Fixed: Added a belt-and-braces self-kick inside the progress polling endpoint — if the job is pending/processing, each UI poll nudges the queue forward. On hosts where wp_remote_post non-blocking loopbacks get swallowed by caching/reverse-proxy layers, the browser itself now keeps the pipeline moving.

2.0.38

  • Fixed: Bulk AI Fix now routes batches of 5+ posts through the Job Queue so they are visible on the Background Jobs page (previously the client-side loop never triggered queuing because it fragmented into batches of 5).
  • Fixed: Bulk AI Fix is dramatically faster. Instead of the browser firing 299 sequential HTTP requests of 5 posts each (each request doing 10 sequential AI calls), the entire selection is now sent once and processed server-side in parallel batches of 20 with curl_multi. For 1,494 posts this drops processing from hours to minutes on Bedrock.
  • New: Live progress bar on the Bulk AI Fix page polls the Job Queue every 2 seconds and shows processed/total count + status. Progress stalls automatically trigger a queue self-tick so you don't have to wait for WordPress cron.
  • New: ssf_get_job AJAX endpoint returns a single job's progress (id, status, total, processed, percent, failed, error) for live UI polling by third-party integrations.
  • In-request fast path: batches of <5 posts still run synchronously and now use the same parallel curl_multi Bedrock call for instant results.

2.0.37

  • New: Thin-content auto-noindex. Posts below the word threshold (default 50 words) are automatically marked noindex so Google won't count them against your site's SEO. Applies to image-only posts and super-short "thank you" style reviews. If a post grows above the threshold later, the plugin lifts the noindex automatically. Fully configurable in Settings → General → Thin Content Auto-Noindex.
  • New: Image-only SEO enrichment. When a post is mostly images (e.g. a client-review gallery), the plugin now feeds every image's alt text, caption, title, and description to the AI — so it can still generate a relevant SEO title, meta description, and focus keyword instead of skipping the post.
  • New: Thin-content warning in the SSF meta box. You now see a clear message in the post editor if your content is below the threshold, with one-click guidance to either expand the content or leave it noindexed.
  • Improved: Reports & Search Console reconciliation now exclude noindex posts from the "missing title / missing description / missing keyword" counts — you won't be nagged abo

This README is longer than the copy stored here. Read the rest on GitHub →

Releases

21 releases.

Tag
Published
v2.1.2 latest
Aug 31, 2026 1mo ago
Aug 31, 2026 1mo ago
Aug 29, 2026 1mo ago
Aug 29, 2026 1mo ago
Aug 29, 2026 1mo ago
Aug 29, 2026 1mo ago
Aug 29, 2026 1mo ago
Aug 29, 2026 1mo ago
Aug 29, 2026 1mo ago
Aug 29, 2026 1mo ago
Aug 29, 2026 1mo ago
Aug 29, 2026 1mo ago
Aug 29, 2026 1mo ago
Aug 29, 2026 1mo ago
Aug 29, 2026 1mo ago
Aug 29, 2026 1mo ago
Aug 28, 2026 1mo ago
Aug 28, 2026 1mo ago
Aug 28, 2026 1mo ago
Aug 28, 2026 1mo ago
Aug 27, 2026 1mo ago

These releases are tags only. The author does not attach a packaged zip, so there are no download counts to report.

A grade

Security

Smart SEO Fixer 2.1.2 · audited by WP Registry

No security issues found.

Audited release
2.1.2
Findings
none
Worst severity
—
Content hash
886ad1c9c7876aea92bd7a11…

WP Registry hashes the installable build and reports on that exact bytes-for-bytes copy. Embargoed findings are withheld until they are disclosed, so a clean verdict means nothing public is outstanding. WP Manifest does not audit code itself.