Codesala SEO Content Engine

Changelog

1.5.0

  • NEW: Left sidebar navigation + full design refresh. The top tab bar is replaced by a modern vertical sidebar (brand block, icon nav, active-state highlight, sticky on scroll). Every admin page now has a clear page heading, a one-line subtitle and consistent card spacing — the cramped, “stuck together” look is gone. Responsive: the sidebar stacks above the content on narrow screens.
  • NEW: Google Search Console index status. A new “Google” column in the SEO Optimizer shows, per URL, whether Google has indexed it (Indexed / Not indexed / Error). Click “Check Google index status” to inspect every post on the page via the Search Console URL Inspection API. Reuses the same service-account JSON key as the Indexing API — just add the service account to your Search Console property.
  • NEW: One-click “fix not-indexed”. After a status check, every not-indexed URL is automatically submitted to the Indexing API (or delegated to Rank Math Instant Indexing if active), so the crawl request goes out without any extra clicks.
  • Google Site Kit detection. If the Site Kit plugin is installed, the SEO Optimizer notes it (the integration itself uses the stable service-account path, not Site Kit’s private internals).

1.4.5

  • NEW: Auto-index every post / page on publish. The plugin now hooks transition_post_status and submits every published URL (not just plugin-generated content) to Google’s Indexing API. Hand-written posts, imported posts and posts published by other plugins are covered too. Configurable per post type under Settings → SEO & Indexing.
  • NEW: Rank Math Instant Indexing integration. If you have the official Rank Math Instant Indexing plugin active, our auto-submit defers to it (we never duplicate the call), so a single daily quota covers both flows. If you don’t have it, our own service-account JSON key path handles the call directly.
  • NEW: Bulk indexer in SEO Optimizer. A “Submit all published URLs” button now sits at the bottom of the SEO Optimizer screen. It iterates every published post / page in the configured types, 20 URLs per AJAX tick, with rate-limit respecting (≈1 req/sec). Pagination is irrelevant — the whole site is processed.
  • NEW: Indexing activity log. The most recent 50 submissions are kept and shown in the SEO Optimizer with colour-coded status pills (OK, delegated to Rank Math, skipped, error with the exact HTTP message).
  • Google sitemap ping endpoint removed. Google deprecated https://www.google.com/ping?sitemap= in June 2023 — it now returns 404. The plugin no longer fires it. Submit your sitemap once via Google Search Console; per-URL signals go through the Indexing API. Bing sitemap ping is still supported (Bing still accepts it).

1.4.4

  • Auto-migrate stale Gemini model on update. v1.4.3 fixed the default model for new installs, but existing installs with gemini-1.5-flash saved in their settings were still hitting the deprecated endpoint and silently falling back to the offline template engine. v1.4.4 adds a lazy, idempotent migration that detects the dead value and bumps it to gemini-2.0-flash automatically on the next admin page load — no user action needed.

1.4.3

  • Fix: Gemini default model updated. Google deprecated gemini-1.5-flash on the v1beta API — every call returned HTTP 404 “model not found”, silently falling back to the offline template engine. The default is now gemini-2.0-flash. Existing installs that still have the old model saved should change it under Settings → AI Providers → Gemini.

1.4.2

  • Critical: title-body content alignment. When the title says “How to deactivate Instagram account”, the body must contain the actual menu path — not generic productivity advice. The generator prompt now includes a strict ALIGNMENT CONTRACT and an intent-specific instruction block (how-to / buy / review / comparison / definition / hire / news) that tells the LLM exactly what shape the body must take for that keyword’s search intent. Title-as-promise, body-as-delivery — no drift, no padding with “start small, measure each step” filler.
  • Critical: fix provider chain priority. The offline codesala template engine was being tried in 2nd position (before other configured LLMs) because it always reports as configured. It is now strictly LAST in the chain, and only included when the user has explicitly opted in via “Strict AI mode = OFF”.
  • NEW: Strict AI mode setting. When ON (default for new installs), if all configured LLM providers fail (quota / wrong key / rate limit), post generation now ERRORS OUT with a clear message instead of silently producing a generic template post. Find it under Settings → AI Providers.
  • NEW: Per-post provider transparency. Every generated post now stores _csrm_provider_used and _csrm_provider_attempts in post meta — you can see which provider actually generated it and which LLMs were attempted first (with their exact error messages).
  • NEW: Admin notice on offline-generated posts. When a post is opened in the editor and was generated by the offline template engine, a yellow notice appears listing exactly which LLM providers were attempted and their failure reasons, with a deep link to the AI Providers settings tab.
  • Dashboard banner copy updated to reflect Strict AI mode state — “Strict mode ON: if this provider fails, generation errors out” vs “Strict mode OFF: offline template engine kicks in”.

1.4.1

  • Admin UI polish. The empty peach badge next to the plugin title in every admin screen now displays a “CS” monogram (no more broken-image look). The redundant “AI” pill in the AI-status banner — which duplicated the “AI” icon on the left — has been replaced with a context-aware tier label (“Free Tier” / “Paid Tier” / “Offline”) so the banner now conveys useful information at a glance. Header spacing was loosened so the title, version pill and subtitle don’t read as one cramped block.

1.4.0

  • Contextual in-body interlinking. A new linker scans the body of every freshly generated article, finds the first natural mention of an existing post’s focus phrase inside a body paragraph, and wraps it as a real inline <a> link. Up to 5 inline links per post, same-category candidates preferred, longest-phrase matches preferred, never matches inside an existing <a>, and the hook intro and closing paragraphs are left alone. The “Related Reading” list at the end is still produced — the two link types feed different SEO signals.
  • Heading hierarchy is now enforced after generation. Any stray <h1> in the body is demoted to <h2> (the post title is the only H1), orphan <h3> headings appearing before any <h2> are promoted to <h2>, and any heading that skips a level (e.g. <h4> after <h2> with no <h3>) is demoted to the correct level. Attributes are preserved.
  • Per-section image queries. The generator prompt now asks the AI for one distinct visual concept per H2 section. Each inline image is fetched with its own query so the three images on a post aren’t visual duplicates of each other. Featured image still uses the broad base query. Inline ALT text is now derived from the H2 the image sits under, not a generic counter.
  • Stronger schema coverage. Every generated post now emits an ImageObject for the featured image (with width/height) and a BreadcrumbList (Home > Category > Post). The FAQPage block stays. Article schema is now conditionally suppressed when Yoast SEO / Rank Math / All in One SEO is active so validators don’t flag duplicate Article JSON-LD.
  • Accordion FAQ. FAQs render as semantic <details>/<summary> accordions — keyboard-accessible, no JavaScript needed, themeable via .csrm-faq-* classes. Prompt now requests 5-8 FAQ pairs (up from 3-5), each Q must contain the focus keyword or a close LSI variant.
  • Tighter content prompt. Focus keyword is now required in the very first sentence (was “near the start”), in the first 30 characters of the title, and in the first 60 characters of the meta description (Google bolds it in the SERP snippet). Every H2 section MUST name a real, specific entity (brand, product, person, city, price band, percentage, year) — generic “imagine a small business” examples are explicitly disallowed.
  • Outline returned in the JSON payload. The AI is asked to return its outline as a separate outline array and its LSI variants as a separate lsi array so future versions can validate structure before publish.

1.3.0

  • No more external content scraping. The built-in offline engine no longer fetches from Wikipedia, Google News, Wikimedia Pageviews or Reddit for article body content. Articles are composed locally from intent-pattern templates and never include scraped facts, quotes or “References” sections. Google Suggest is still used (autocomplete questions only) to seed FAQ phrasings — but FAQ answers are written locally, never copied from search results.
  • Pure-AI articles via configured LLM. When you plug in a free or paid AI provider (Groq, OpenRouter, Cloudflare Workers AI, Gemini, Mistral, OpenAI, Anthropic), the generator now demands 1,500-2,500 word original articles with 5-7 detailed H2 sections (each 180+ words), real-world examples, named brands / prices / years, at least one H3 sub-section, and explicit trade-off opinions. Every article is fully original — no external citation is requested or accepted in the prompt.
  • Stronger anti-fluff prompt. Banned phrases list extended; demand for concrete numbers in every section; ban on “Why this matters”, “Introduction”, “Conclusion” style headings.
  • Better image integration. Default images per post increased to 3. Featured image plus inline images are now spread evenly across H2 sections (not all stacked at the top). Every image gets a keyword-aware ALT text.
  • Defaults updated. words_min 800 → 1500, words_max 1500 → 2500, images_per_post 2 → 3.
  • Set-up nudge on dashboard. A new warning banner appears when the user is on offline mode OR has no image API key configured, with one-click links to the relevant Settings sub-tabs.
  • Backward compatible. Existing user settings preserved; offline engine still works for anyone who chooses to stay key-free, but is now clearly labelled “Offline mode — template engine”.

1.2.1

  • Fix: duplicated “Why this matters / Key things / Common questions” blocks. The fixer’s word-count, density, external-link and internal-link helpers are now idempotent — calling Fix twice on the same post no longer appends the same content twice. Markers csrm-padding-block, csrm-further-reading, csrm-related-reading, csrm-density-summary are used to detect prior runs.
  • NEW: Keyword-pattern aware practical content. The word-count padding is no longer generic boilerplate. The fixer detects the searcher’s intent from the keyword phrase and outputs sections tailored to it:
    • “hire / freelance X” → “Where to find a X” + “What you should actually pay” (with real rate bands) + “How to vet” + “Red flags” + “Your next step”.
    • “buy / price / best X” → “Decide on the use-case first” + “Where to compare honestly” + “What to ignore” + “Buy vs wait check”.
    • “how to X” → “Before you start” + “Shortest path that works” + “Where people get stuck”.
    • “what is X” → “Plain-English version” + “Why it gets confusing” + “How to spot a reliable explainer”.
    • “X vs Y” → “Better for what” + honest scoring framework.
    • Generic fallback for everything else, still keyword-aware, no boilerplate.
  • Fix: FAQ section no longer echoes news headlines as both Q and A. Built-in engine now derives clean questions from news headlines (“Cost?” → “How much does X typically cost?”), uses real news descriptions as answers (not the title), de-duplicates questions, and refuses answers that are just a verbatim source title.

1.2.0

  • NEW: Human-style writer engine. The generator prompt now puts the LLM into a specific writer persona (Journalist / Expert Blogger / Practitioner / Friendly Teacher / No-fluff Reviewer) and enforces voice rules: contractions, mixed sentence length, concrete specifics over vague quantifiers, at least two first-person asides, and an explicit BANNED-PHRASES list that strips ~40 of the most common AI-tell phrases (“delve into”, “in today’s digital landscape”, “navigate the complexities”, “tapestry”, “leverage”, “synergy”, “paradigm shift”, “embark on a journey”, “in conclusion” and many more).
  • NEW: Humanizer post-processor. After generation, every article is run through a humanization pass that swaps any remaining AI-tell phrases, applies natural contractions, varies sentence openings and (optionally) injects short first-person asides into long paragraphs. Three strengths: light, medium (recommended), aggressive.
  • NEW: Per-post Humanize button on the SEO Optimizer page — turn any existing post (yours, AI-generated or imported) into a more human-sounding piece in one click. Bulk-humanize is also available. Original content is backed up so you can Revert.
  • NEW: Author byline + about-author block (E-E-A-T signal). Optional. Configurable name and short bio. Adds “By <name> · Updated <date>” to the top and an About-author block to the bottom.
  • NEW: Call-to-action block. Optional styled button at the end of every generated post.
  • NEW: Audience selector. Set the target audience once; the generator writes vocabulary, examples and reading level for that group.
  • Built-in Flesch reading-ease scorer (exposed via CSRM_Humanizer::readability() and reported after Humanize).
  • All v1.1 settings preserved — backward compatible upgrade.

1.1.1

  • Fix: SEO plugin score columns now reflect the optimised score. After Fix (or Analyse) runs, the score is pushed into Rank Math (rank_math_seo_score), Yoast SEO (_yoast_wpseo_linkdex + _yoast_wpseo_content_score) and All in One SEO (post meta + wp_aioseo_posts.seo_score direct table update). The “N/A” badge in posts-list views now flips to the actual number.
  • When schema is applied, Rank Math’s rank_math_rich_snippet is set to article and Yoast’s _yoast_wpseo_schema_article_type is set to Article, so the “Schema: Off” indicator flips to “Article”.
  • Posts scoring 90+ get marked as Pillar Content in Rank Math.
  • SEO Optimizer table now falls back to the existing Rank Math / Yoast / AIOSEO score when this plugin has not yet analysed the post — no more empty score column for posts you optimised in the SEO plugin’s editor directly.
  • Score badge in the Optimizer table now colours immediately on first render (green ≥90, amber 60–89, red <60).

1.1.0

  • NEW: Business-aware keywords. A new “Business” sub-tab in Settings auto-detects what your site is about (site name, top categories, product categories, recent topics) and builds a niche profile. You can also override every field manually (products / services, location, target audience). The keyword fetcher then mixes business-relevant seeds straight into the trending pool.
  • NEW: 100/100 SEO Optimizer. A new top-level admin page lists posts / pages / products with their current score and one-click fix buttons. Fixes 19 weighted signals from the Rank Math / Yoast / AIOSEO content-analysis rules: focus keyword in title (and at start), meta description, slug, intro, subheadings and image alts; keyword density; URL length; word count; external DoFollow + internal links; numbers and power words in title; table of contents injection; long-paragraph splitting; image presence.
  • NEW: Auto-fix on save. Optional toggle that runs the fixer whenever any supported post is saved.
  • NEW: Per-post SEO meta backup + Revert button. First fix takes a one-time backup of the original title / content / slug so you can roll back from the SEO Optimizer page.
  • NEW: Generator now produces 100/100 posts. Newly generated articles are automatically passed through the fixer before publish.
  • Settings → 100/100 Fixer sub-tab to choose which post types are eligible, target score, batch size, and whether to allow AI for content rewrites.

1.0.0

  • Initial public release.

Plugin Website
Visit website

Author
Bikas Kumar
Version:
1.5.0
Last Updated
May 26, 2026
Requires
WordPress 5.6
Tested Up To
WordPress 6.9.4
Requires PHP
7.4

Share Post

Join our newsletter.

Get insights into what’s happening at ChangelogWP right in your inbox. We don’t believe in spam.