🚀 Launch Offer: 20% off your first year for new customers with code WPCWP20 — until 31 October 2026
WPCWP

Home / Changelog

Changelog

Every release of WP Content Writer Pro, newest first. Currently on 2.22.0. Updates are delivered through WordPress, and each package is signed and checked before it installs.

2.22.0

  • Fixed: "Search topics with AI" suggested topics you had already written or already queued. It now checks every suggestion against your topic queue, your archived topics and your existing posts before showing it, instead of only asking the model to avoid them. Suggestions it removes are counted on screen, so a request for ten that returns six tells you why. This catches repeats and rewordings; a heavier paraphrase can still get through, and the "Duplicate title threshold" setting controls how close is close enough.
  • Fixed: generating with some NVIDIA NIM models failed with "frequency_penalty 0.2 is immutable for this model, got 0.2". Certain models refuse that setting entirely rather than objecting to its value, so no number you could enter would have worked. The plugin now notices the refusal, resends without the setting, and remembers that model so it does not happen twice.
  • Fixed: columns in the Topic Queue did not line up, most visibly the Category column. The table mixed two kinds of column width that added up to more than the space available, so the browser resolved it by shrinking columns unevenly. The same fault was present on twelve other screens — Agents, Logs, Metrics, Schedules, Prompt Library and others — and is fixed there too, most noticeably on narrow screens and tablets.
  • No database changes; schema stays at 1.13.0.

Security 2.21.0

  • AI assistant connections are now off unless you switch them on. Until this release every site carried a connection endpoint whether it had any use for one or not. With the switch off there is nothing to connect to at all — the endpoint is not registered, so there is nothing on your site for anyone to find. Find it at Settings → Connected Assistants.
  • If you already have an assistant connected, it keeps working. Sites with a live connection are switched on automatically so nothing you set up stops working. Every other site starts off.
  • Connecting now requires an administrator. It previously required only an account that could review content — an editor, or a freelancer whose account was still active — which meant someone other than you could connect this site to their own AI assistant and start agent runs on it.
  • Connecting now also requires a pairing code that you issue. Knowing your site's address is not enough, and neither is being signed in. You issue a code on Settings → Connected Assistants, it is good for fifteen minutes, and it works once. If you are reconnecting an assistant, issue a code first — the approval page will ask for it.
  • Issuing a code, and switching connections on or off, are administrator actions. Switching connections off cancels any code you had outstanding.
  • No database changes; schema stays at 1.13.0.

2.20.2

  • Fixed: a post skipped because its title matched an existing one was reported as an error. It was never a failure — the plugin decided not to write a near-duplicate, and the message has always started with "Skipped:". It is now recorded as "Nothing to do", and no longer counts against you on the dashboard or the activity chart. The "Generate anyway" button still appears, on old entries as well as new ones.
  • Fixed: "Nothing to do" entries still showed a red badge. 2.20.1 stopped calling them errors but the badge beside them stayed red, which is the part you actually read when scanning the page. Content History now shows three states — Written, Nothing to do, and failures — each labelled in words rather than by colour alone.
  • Which topic was passed over is now recorded on the entry, so a run that skipped several tells you which ones.
  • No database changes; schema stays at 1.13.0.

2.20.1

  • Fixed: Content History reported an error when your topic queue was empty. Nothing was wrong — the schedule ran and found nothing to write. It is now recorded as "Nothing to do" rather than as a failure, with a message telling you to add topics in Topic Manager. This showed up worst on a site that had just been set up, which is exactly when it is hardest to tell a real problem from an idle one.
  • Fixed: an idle site reported failures on the dashboard and drew a busy activity chart. Both counted every "nothing to do" entry — the first as a failure, the second as an attempt.
  • Repeated "nothing to do" entries are collapsed, so an hourly schedule against an empty queue leaves one marker rather than twenty-four identical rows a day. The entry is still recorded, because "did my schedule even run?" is the question an empty log cannot answer.
  • Content History can now filter to these entries, listed as "Nothing to do".
  • A topic you asked for by name that no longer exists is still reported as an error, because that is a real fault — something was pointed at that is not there.
  • No database changes; schema stays at 1.13.0.

2.20.0

  • Security: an account with review-only permission could change things it should not. Six form handlers accepted any account that could use the plugin at all, rather than the permission level their own screen requires. Most seriously, the Tools screen could clear your generation log and AI usage log — the record you would read to find out what happened — and could rotate your cron token or start a generation. Each handler now requires the permission its screen is registered under. If you have only ever granted people full administrator access, nothing about your site changes.
  • Security: hardened how the assistant connection reads your settings. The code that tells a connected assistant what your site writes about was reading the whole settings group to take one harmless field, and that group holds your API keys in decrypted form. No key was ever sent anywhere — only your subject, audience, tone and language were — but the keys no longer travel to that code at all.
  • You do not need a paid AI account. A new install now starts on Google Gemini, which has a free tier, instead of a provider that requires a funded account. The provider list is grouped into "Has a free tier" and "Paid account required", and says what each free option involves — including that Google may use what you send on its free tier to improve its products, which the paid tier does not. Existing sites keep the provider they chose.
  • Claude and ChatGPT can use your prompt library. Templates you have saved now appear in your assistant as commands you can pick, with your own placeholders as fields to fill in.
  • Long lists no longer stop at the first page. An assistant could not see past the first 50 posts on a large site, and had no way to know it was looking at a fraction. It can now work through the whole archive.
  • Edit up to 20 posts in one instruction, recorded as a single run you can undo in one go.
  • A connected assistant can no longer overload your site. Requests are capped per connection, so an assistant that gets stuck retrying is refused rather than left hammering your database.
  • Your site now reports which version it is running when it checks its licence, instead of only when the licence was first activated.
  • No database changes; schema stays at 1.13.0.

2.19.0

  • This update teaches your site to trust a second signing key. Updates to this plugin are cryptographically signed, and your site only installs an update it can verify. Until now there was one key; from this version your site accepts two, which is what allows the key to be replaced later without any site being locked out of updates.
  • Nothing changes about how you update. This release is signed with the same key as every release before it, so it installs exactly as usual. The second key signs nothing yet — a future release will use it, and by then your site will already accept it.
  • Why replace the key at all: the current one is recoverable by anyone who obtains a copy of the plugin's source repository. The replacement has never been stored there. This is precautionary — no site has been affected, and a signed release still cannot be forged without the secret half.
  • If you have set WPCWP_UPDATE_PUBKEY in wp-config.php to pin your own key, nothing here affects you: your setting continues to override the built-in list entirely.
  • No database changes; schema stays at 1.13.0.

2.18.0

  • Connect Claude or ChatGPT to your site, without giving it an API key. Add this site as a custom connector in your assistant, approve it once on a page that says exactly what it will and will not be able to do, and it can work on your content directly using its own model. You can disconnect it at any time from Settings -> Connected Assistants.
  • Reaching the plugin from an assistant used to mean a WordPress application password — the full rights of your account, no limits, no expiry, and no way to narrow it. A connection now carries one of two permissions: read only, or read and draft. Neither can reach your settings, API keys or licence, because that permission is not offered at any level.
  • An assistant can now do the work, not just look at it. It can find and read your posts, write new drafts, edit existing ones, run this plugin's own generation pipeline, make featured images, and manage the topic queue.
  • It cannot publish, and it cannot delete. Anything it writes arrives as a draft; anything it edits keeps the status it already had. There is no tool that removes a post, a page, an image or a topic.
  • Everything it changes can be undone, post by post or all at once, from Agent Runs — the previous version of each post is saved before it is touched. Its work is grouped into one run rather than scattered across dozens, so undoing an afternoon is one action.
  • Work that spends your API credit is capped. Asking this site to generate an article uses your own provider key, so those requests run in the background and stop at your daily limit, plus an hourly ceiling on how much an assistant can start unattended.
  • Fixed: undoing a run did not put back the featured image. Restoring returned the text and kept the image the agent had chosen, while reporting that the run had been put back as it was. The image is now part of what is saved and restored; the newer image stays in your media library rather than being deleted.
  • Database: schema 1.13.0 adds two tables for assistant connections. Additive — nothing existing is altered or removed.

2.17.0

  • "Refresh model lists now" button on AI Settings. 2.16.0 fetched each provider's model list once a day, but spread that check randomly across a twelve-hour window so every site does not hit the same APIs at once — which meant that if you had just found out your model was withdrawn, you could only wait. Now you can ask immediately, and it does not rely on WordPress's scheduler running on your host.
  • A fresh update fetches its lists straight away rather than waiting for the first daily check.
  • AI Settings shows, for each provider, how many models were found, when it was last checked and why the last check failed. Those three facts tell apart "the provider is having a bad day", "no API key is saved" and "scheduled tasks are not running on this site" — until now all three looked the same: a model list that would not update.
  • No database changes.

2.16.0

  • Fixed: models that your provider had withdrawn stayed selected and kept failing. Only NVIDIA's model list was ever refreshed. Anthropic, OpenAI and Gemini were fixed lists written when the plugin was released and never checked again — so when Google withdrew Gemini 2.5 Flash from new projects, this plugin still offered it as "recommended" and every article failed with a 404 that read like a broken plugin rather than a model that had moved.
  • Every provider's model list is now fetched once a day, from that provider's own catalogue. What you see in the dropdown is what your account can actually use, including models added since the last plugin release.
  • A withdrawn model is replaced automatically with the closest one from the same provider, and you are emailed about it. Your provider and API key are never changed — that is your decision, not the plugin's. If nothing in the catalogue is a close enough substitute, nothing is changed and the email says so, because an unrelated model quietly writing your articles would be worse than generation stopping.
  • Your fallback model is checked too, not just the main one. A fallback that has quietly gone dead is worse than none at all: it is only used when the first model is already failing.
  • If a provider cannot be reached, the previous list is kept rather than emptied — an outage on their side should not look like this plugin losing your settings.
  • Fixed: OpenRouter's "Provider returned error" is no longer reported as rate limiting. It means the model's upstream provider bounced the request, which happens most on the shared free tiers. It is still retried, and the message now says what actually happened and that a paid model of the same family is the fix if it keeps happening.
  • No database changes.

2.15.0

  • New playbook: "Stock the prompt library". A new install's Prompt Library is empty and asks you to write reusable templates before you have written any content, which is the wrong way round. This reads your Business Profile and drafts a set suited to your business — you see every name and brief before anything is created, and nothing is added until you approve.
  • It refuses to run if the Business Profile is empty and says which field to fill in. Prompts written for a business nobody has described are prompts for a generic company, and ten wrong templates are worse than one sentence telling you what is missing.
  • Duplicates of what you already have are dropped rather than proposed, and so are near-duplicates of each other — but two prompts that merely share an opening ("guide to managed hosting", "guide to shared hosting") are correctly kept as separate templates.
  • Undoing this run removes what it added, rather than restoring anything: it never edits existing content, so there is nothing to put back. The button says so, and warns that unlike putting a post back, deleting an entry leaves no revision behind.
  • The NVIDIA image model setting moves in with the other image settings, under Image provider keys, instead of sitting beside the NVIDIA API key. Its key still comes from the NVIDIA NIM section, which is noted where it now lives.
  • No database changes.

2.14.0

  • Fixed: NVIDIA images have been failing on every site that never changed the model. The id this plugin shipped as its default — stabilityai/stable-diffusion-3-medium — is no longer in NVIDIA's catalogue, and both halves of it moved: the vendor prefix as well as the version. So it fails as an unknown model, and every image request returned a 404. If your NVIDIA image model still reads stabilityai/..., open Settings → AI Settings, pick another from the list and save. The screen now says so where the old id appears. Existing settings are not changed for you — which model draws your pictures is your decision, not something to switch behind your back.
  • The NVIDIA image model list is no longer empty. It now offers the five text-to-image models NVIDIA documents: FLUX.1 schnell and dev, FLUX.2 klein, Stable Diffusion 3.5 Large, and Qwen-Image. These could never appear before because the plugin looked for them in NVIDIA's chat catalogue, and images come from a different service entirely.
  • Editing and 3D models (qwen-image-edit, FLUX.1 Kontext, TRELLIS, Wan2.2) are deliberately not offered: they need an input image or video and cannot draw a picture from a title, so choosing one would fail in a way that reads like a billing problem.
  • You can also type a model id yourself, for anything NVIDIA adds later. New installs now default to FLUX.1 schnell, the fastest and cheapest of the five.
  • Featured images now match the article. The image request used to be the keyword string on its own, so every post on a subject asked for the same picture and none of them were about the post. It is now built from the article's title, its focus keywords and the words the body keeps coming back to. It stays deliberately short — past a few dozen words an image model averages the prompt instead of following it — and your own image prompt still wins outright if you have set one. Templates gain a {subject} placeholder.
  • No database changes.

2.13.0

  • Update in one click. Settings → Tools now has "Update plugin to latest version", which fetches the newest release and installs it. The old button only refreshed the check and then sent you to Dashboard → Updates to finish the job. Every package is still refused unless its checksum matches and its signature verifies against a key built into the plugin, so a substituted or tampered download cannot install — that check sits on the download itself, so nothing can skip it. Installing an update needs permission to update plugins on the site, and the button is hidden from anyone without it.
  • Undo now works post by post. A run's undo lists every post it changed, with "This post" on each row, "Undo selected" for the ticked ones, and "Undo everything". Each row can show what putting it back would restore — the title, meta description and length as they were before the run. Undo selected with nothing ticked does nothing rather than undoing everything, because the difference is your whole archive.
  • A proposal is easier to read. Each finding is now a single line you can open. Inside is why it was raised, what the page's SEO title and meta description are right now, and what the fix would do. The new wording is not shown because it does not exist yet — it is written when the job runs, and the page is saved beforehand so it can be put back.
  • The ask box is on Agent Runs too, not just the Dashboard, since that is the screen you are on when you want to start the next thing. The button now reads "Ask AI".
  • No database changes.

2.12.1

  • Google Search Console and Analytics are now set up in Settings, on their own tab, instead of part-way down Search & Links. They are configured together because they share one credential — the same service account key serves both, so there is no second key to create. Search & Links keeps the CSV import and now says where its figures come from.
  • Fixed: the connection forms needed a permission the screen did not. Saving them has always required settings permission, but they sat on a screen that only needs review permission — so someone able to open Search & Links could fill in the service account form and then be refused when they saved it. They are now on a screen whose permissions match.
  • No database changes.

2.12.0

  • Ask box on the dashboard. Type what you want in plain language — "audit my SEO", "what should I write next?", "how much have I spent?" — and it either answers or suggests one of the agent runs. It only does things inside this site: it picks from a fixed list of actions and cannot reach anything outside your WordPress install.
  • It never changes anything on its own. A question is answered straight away because answering changes nothing. Anything that would do work is shown as a suggestion with a button, and the run that button starts then works out its plan and stops again for your approval. Two separate confirmations between typing a sentence and a page being edited.
  • Every agent run can now be undone. Before an agent touches a post, its title, content, excerpt and SEO fields are saved. The run's page has an "Undo this run" button that puts every post it changed back as it was. Restoring is itself reversible — each post keeps a revision — so undoing an agent never destroys what it did.
  • This replaces relying on WordPress revisions, which are a fine rollback until a site has them switched off or limited. A restore that is only sometimes there is not a restore.
  • Agent Runs is now the second item in the menu, directly under the Dashboard. A run that has stopped and is waiting for you changes nothing until you go and look at it, so it should not be at the bottom of a long list.
  • You can now get a run out of the plugin. The run page has a "Download this run" button that saves the decision log and the full proposal as a file, and wp aihpp run <id> prints a short summary. A real audit is hundreds of findings — far too much to copy off a screen when somebody needs to see it.
  • Database schema 1.12.0: one new table, holding the saved state that makes undo possible. Additive; no existing table or column is changed.

2.11.0

  • Google Analytics. Visitor figures now appear on Search & Links: sessions, visitors, new visitors, page views, bounce rate and average visit length, plus your most-read pages and where visitors came from. This is a different product from Search Console, which reports what happened in Google — impressions, clicks and position. Search Console impressions are not traffic, and the screen previously showed only the first, which made it look like the traffic figures were missing.
  • It reuses the service account key you already added for Search Console, so there is no second credential to create — grant that address Viewer access on the Analytics property and paste the numeric Property ID.
  • Fixed: the screen hid its own emptiness. If the daily traffic fetch failed, the run still reported "succeeded" and the whole performance section simply vanished. A broken fetch, a property that was never connected and a genuinely quiet fortnight all looked identical — a page with the figures absent. Both sections now say which of those happened and what to do about it, and a failed fetch is reported as failed.
  • Fixed: the SEO audit always reported a clean site. It queried a table name that does not exist, which returns no rows rather than an error, so every keyword check silently found nothing.
  • Fixed: Site Scanner's Issues column. A fixed-width table splits its width equally between columns that do not declare one, so "Post" and "Issues" each got half of what was left — and Issues is the widest thing on the screen. The same fault was in Schedules (eight columns, none of them sized), Logs, Prompt Library and three more tables.
  • Tables now behave on a narrowing screen. The rule that lets a wide table scroll instead of pushing the whole page sideways only applied below 782px, leaving the band between 782 and 960px — where the admin menu still takes room — with no fallback at all. Long values now break rather than forcing the page wider.
  • Numeric settings fields had been sized one at a time and ended up at seven different widths down a single form. Two sizes now, with figures that line up in a column.
  • Deactivating the plugin now clears both Google fetch schedules; the Search Console one was previously left behind.
  • Database schema 1.11.0: two new tables for visitor data. Additive; no existing table or column is changed.

2.10.1

  • A withdrawn licence no longer tells you to renew. If a licence is retired — a superseded product, or a key issued internally — the plugin used to report it as expired and suggest renewing, which would have taken a payment without restoring anything. It now says the licence has been withdrawn and that support can move you to a current one. A retired licence never could generate; only the explanation was wrong.
  • A withdrawn licence is also no longer described as "revoked" or "invalid". Both denied correctly, but "revoked" reads as action taken against you, and this usually is not that. The licence screen shows it as "Withdrawn".
  • No database changes.

2.10.0

  • SEO audits, as an agent run. A new "Full SEO audit" playbook checks the site across five areas — tracking, tags, links, keywords and link building — and proposes what it can safely fix. Missing meta descriptions, over-long titles, images without alt text and pages nothing links to are offered as fixes; duplicate titles, two of your own pages competing for one search, a hidden page that is still getting clicks and broken links are reported and never touched, because which page should win is a decision about your site and getting it wrong costs the traffic you already have.
  • Link checking is bounded rather than a crawl: a fixed budget of checks per run, cached results, and a link that could not be reached is reported as nothing at all. Telling you a working link is broken is worse than staying quiet about it.
  • If Search Console is not connected, the keyword checks say nothing instead of reporting a clean bill of health they cannot support.
  • Licence keys are now sent in a header and signed. Your key used to be the entire credential on every call, which meant a key copied out of a log or a support ticket was enough to deactivate your site. Your install now gets its own secret when it activates and signs every later check with it, so a key on its own is no longer enough. Existing installs keep working exactly as before and are never asked to sign until they re-activate on this version.
  • An expired or withdrawn licence no longer lets agents edit your pages. Generation already stopped; agent runs did not, so an agent could still have rewritten published articles on a lapsed licence. Nothing is ever deleted, unpublished or hidden — your articles stay published, exports keep working, and settings stay editable so you can paste a new key. Only the making of new work stops.
  • Fixed: Search & Links columns did not line up. Three tables right-aligned their numbers but left-aligned the headers above them, and gave a full URL the same width as a two-digit score.
  • Fixed: the Agent Runs table sat alongside the status filter instead of below it.
  • The playbook editor no longer scrolls sideways. It was an eight-column table wider than any admin screen; it is now one stacked row per playbook, with the limits grouped together.
  • A run's history is now drawn as a sequence rather than a five-column table, so the reasoning gets the room and the step number does not.
  • The dashboard shows agent runs, with anything waiting on your decision first.
  • Search & Links no longer claims nothing is fetched — it has pulled from Search Console since 2.6.0. Setup moved below the figures so it stops interrupting them.
  • No database changes.

2.9.0

  • Playbooks. A saved recipe for an agent run — which agent, how much work to take on, and what it may spend. "Weekly tidy-up", "Monthly content plan" and "Catch-up sweep" are provided to start with, and you can add your own. One click runs the job you already decided on instead of reconstructing the same three answers every week.
  • Every playbook shows its ceilings on the row, because what a run may spend belongs in front of you before you click rather than after. Only agents that PROPOSE can be run from a playbook, so "run this every Monday" can never become "rewrite forty articles every Monday without asking" — you still read the plan and approve it.
  • Editing playbooks needs settings permission; running one needs content permission. Someone trusted to publish is not automatically trusted to raise the budget they publish on.
  • Fixed: the Agent Runs tables were misaligned. WordPress list tables divide width equally between columns unless told otherwise, and this screen was not telling them — so a row-number column was as wide as a paragraph. Column widths are now set properly, and the tables scroll rather than squeeze on narrow screens.
  • Fixed: the figures on a run's detail were set at headline size together with their ceiling, so "0.4212 of 1.0000" wrapped mid-number. The figure and its ceiling are now separate.
  • No database changes.

2.8.0

  • Approval emails now ask you to confirm. Clicking Approve or Reject opens a page with a single button instead of acting immediately. This is not friction for its own sake: mail gateways, link-safety scanners and chat previews routinely fetch links in a message before anyone reads it, and with the action on the link itself one of those could publish your article — and use up the one-time link, so your own click would then say "expired" and you would never know it had happened. One extra click removes that entirely.
  • The cron token can now be sent as a header (X-WPCWP-Token) instead of in the URL, keeping it out of your web server's access log. Existing cron commands using ?token= keep working exactly as before; the Tools page shows the header form for anyone setting one up fresh.
  • Reviewed every way this plugin can be reached from outside — REST routes, AJAX, form handlers, shortcodes and the public llms.txt file — and added automated checks so those protections cannot be quietly dropped in a future release.
  • No database changes.

2.7.1

  • Fixed: "Plan what to write next" always reported nothing to do. A malformed comparison in the query behind it meant the database rejected the statement, and the empty result read as "no opportunities". If you tried the editorial planner on 2.7.0 and it found nothing, that is why — it will now use your search data properly.
  • Fixed: the traffic comparison on Search & Links was measured against an uneven period. The current window was a day longer than the one it was compared against, and ended today even though Google's data lags about three days. Both periods are now the same length and both end on the newest day you actually have data for, so the change figures mean what they say.
  • Fixed: a tool exposed over the MCP endpoint without an implementation reported the wrong kind of error and logged a PHP warning.
  • No database changes.

2.7.0

  • Search positions now fetch themselves. Connect a Google service account on Search & Links and the last 28 days are pulled in daily — no more exporting a CSV. The manual import stays as the fallback, and remains the only route for backlinks: Google's API has no links report at all, so there is nothing to fetch automatically for those.
  • Search performance is actually shown. Clicks, impressions, click-through rate and average position, each against the period before it, with best-performing pages and searches. These figures were being fetched and stored on every run and never displayed anywhere.
  • A lower average position is better, so a fall in that number is shown as an improvement — and every change carries an arrow and a sign, not just a colour.
  • Agent Runs and Search & Links now match the rest of the plugin. Both screens were built with plain WordPress table markup; they now use the same type, spacing and status treatments as every other screen.
  • wp aihpp selftest-agents exercises the whole agent lifecycle against your real database and cleans up after itself — useful for confirming an upgrade landed properly.
  • Database schema 1.10.0: one new table for the day-by-day traffic series. Additive; no existing table or column is changed.

2.6.0

  • NVIDIA models are checked daily. If the model you selected stops being available to your account, the closest remaining model is used instead and you are emailed — otherwise every article simply fails with an error that reads like a typo in your settings. The replacement is chosen by matching vendor, model family and size. If nothing is a close enough substitute, nothing is changed and the email says so: an unrelated model quietly writing your articles would be worse than generation stopping.
  • AI Settings now shows when your model was changed for you rather than by you.
  • Citations are gathered in a loop. URLs that turn out dead, off-list or off-topic are reported back to the model so it can propose better ones, instead of being silently dropped. It still stops after three rounds — an article with no citations is correct, a fabricated one is not.
  • Editorial planner: finds subjects you already appear for in search but do not win, and proposes articles for them. It will not propose something you have already published (that article wants improving, not a rival), nor a plural of a topic it just proposed. Approving adds topics to the queue; nothing is generated at that point.
  • Model per task (optional, off by default): send quick checks, short writing and article prose to different models. Deciding whether a stock photo is on-topic is a one-word answer that runs once per candidate image — there is no reason to bill it at article-writing rates. Anything unrecognised is treated as article prose, so new work is never quietly downgraded.
  • MCP endpoint, so an external agent can drive this site. It can read everything and propose work; it cannot approve a plan, change settings, or delete anything — approval stays with a person in wp-admin. Authenticated with a standard WordPress application password.
  • Agent run detail now shows the full proposal — the list of topics or articles you are actually approving — rather than a one-line summary.
  • Fixed: the AI usage log recorded the provider and model from your settings rather than the one that actually answered, so a call served by a fallback provider was attributed to the primary.

2.5.0

  • Licensing moves to the WP Content Writer License Manager's signed API. Every response now carries an Ed25519 signature verified against a key pinned in the plugin, so a redirected or counterfeit licence server cannot switch your plugin off. A response that cannot be verified is treated as "no answer", never as a denial.
  • Offline grace now uses the window the licence server supplies (14 days) instead of a fixed local 7. Installs upgrading from an older version keep the 7-day fallback until the server has told them otherwise.
  • Autonomous agents, all off by default and all bounded. Ceilings for steps, spend, tokens and wall-clock time are set on Settings -> Workflow, and a run stops at whichever it reaches first and records which one. Spend is measured from the AI Usage Log, so it reflects what was actually billed rather than an estimate.
  • Revise a draft against its own quality review. Reads the Quality Guardrails verdict, revises to address it, re-reviews, and stops -- when it passes, when it runs out of allowance, or when a revision stops reducing the problems. It refuses to "fix" a plagiarism match or an article too close to one you have already published by rewriting, and hands those back to you instead.
  • Archive refresh agent. Reads your latest site scan, ranks what is worth fixing, and shows you the full list before touching anything. Planning is free and changes nothing.
  • Agent Runs screen (Workflow Suite): every run, what it cost, what stopped it, and a step-by-step record of why it did what it did.
  • Search & Links screen: import search-position and backlink exports as CSV from Search Console, Ahrefs, Semrush or Moz. No API key, nothing fetched. Two position imports let the plugin show what is slipping, and the refresh agent uses that to decide what to work on first.
  • Citations are now gathered in a loop: URLs that turn out dead, off-list or off-topic are reported back to the model so it can propose better ones, rather than being silently dropped. It still stops after three rounds, because an article with no citations is correct and a fabricated one is not.
  • Database schema 1.9.0 -- four new tables, all additive. No existing table or column is changed.

Security 2.4.0

  • Security: API keys are no longer sent back to the browser. Every key field used to render the real key as the value of a password input, which hides it from someone reading over your shoulder and from nothing else — changing the input type in the browser inspector revealed every configured key. Fields now render blank; type a key to replace one, leave it blank to keep it, or tick "Remove the saved key" to delete it.
  • Security: provider error messages are redacted before they reach the log, the screen or an email report. NVIDIA's 404 quotes your account identifier back at you, and all four AI image backends were passing it through verbatim.
  • Featured Images: one Provider list covering stock search and each AI engine. Gemini and NVIDIA were previously reachable only through a second dropdown further down the page, so the first list read as though they were unsupported. Stored settings are unchanged — no migration.
  • Featured Images: only the settings that apply to the engine you picked are shown. Google's "limit: 0" quota error is now reported as what it is — a project with no image quota — rather than a rate limit worth retrying.
  • Settings: NVIDIA's key, model discovery and image model are one section, shown when NVIDIA is in use for text OR for images. The image model is a dropdown from NVIDIA's own catalogue rather than a free-text box.
  • Content & Categories: "Suggest with AI" drafts an image prompt template from your own site — its Business Profile, name and domain, and what it has already published. It fills the box in only — nothing is saved until you click Save.
  • Content & Categories: Target audience is a picker over broad reader types, plus your own list, replacing a free-text box whose placeholder assumed web hosting.
  • Content & Categories: authority links can cite standards, security, web platform, software and OS vendors, health, research, statistics, public policy and general reference — and "Also trust these hosts" lets you add your own field's primary sources. The list was previously almost entirely hosting and Linux documentation, so the feature quietly worked for one kind of site only.
  • The default system prompt and the niche fallback no longer assume web hosting. Installs that already saved the old hosting system prompt keep it — your saved settings are not rewritten — but AI Settings now tells you when the stored prompt is that old default, and every article on the site is being written from it. Worth checking after upgrading.
  • Workflow: optional "Clear failed drafts" moves an empty draft to the Trash when generation failed and left it behind. Off by default, and only ever touches an empty draft this plugin created and recorded as failed — never one you wrote, and never anything with a body, a featured image or attached media. Trash, never deletion.

2.3.0

  • Added: "Generate content with AI" on a draft. A new action in the Posts list, next to "Humanize with AI" and shown only on drafts. The draft's title is the brief: it becomes the topic, and the article is written with your active provider and model using your configured template. It fills the draft in rather than taking it over — your title, your slug, the author and the draft status are all left exactly as they are, so a draft you are still working on can never publish itself. A category you picked by hand is kept. Generation runs in the background, so there is nothing to keep open and no page to time out; the draft updates itself when it is done. Any content already in the draft is replaced, and the previous text is kept as an ordinary WordPress revision you can restore from the editor.
  • Fixed: the stock photo relevance check could not be switched on, and switched itself off. Its control sat on the Categories & Content screen while the setting belongs to the Media Suite group, so ticking the box saved nothing — and because the Media Suite screen did not show it, saving that screen switched it off. As it ships switched on, the effect was that it worked on a new install, then turned off for good the first time Media Suite settings were saved. That is the check which stops an article about the "Docker" software being illustrated with a shipping container, so it is worth confirming it is ticked after updating. The control now lives on the screen that saves it.

2.2.0

  • Added: the Google image model is now selectable. The Gemini image engine previously always used Gemini 2.5 Flash Image. Settings → Categories & Content now offers that model under a Free tier heading, and Nano Banana 2 under a Paid tier heading. Both use the same Google API key, so switching between them needs no new credential. The tier headings follow Google's own tiers and are a guide rather than a check — this plugin cannot see your account's billing status, so what a model costs you is whatever Google's pricing page says. Nano Banana 2 is a preview model, which providers can change or withdraw at short notice.
  • Added: image prompt controls. Until now the prompt sent to an image model was whatever the article's metadata pass happened to write, with no way to steer it. There is now an editable image prompt with {title}, {keywords}, {image_prompt}, {niche} and {audience} placeholders; an image style (photographic, editorial illustration, flat vector, technical diagram or 3D render) so pictures across a site look like a set; and an option to ask the model not to draw text, captions, watermarks or logos — garbled lettering being the most common reason a generated image cannot be used. There is no default prompt text and all three are off by default, so nothing about your images changes until you deliberately set one.
  • Fixed: "Append configured CTA buttons" switched itself off. Saving Settings → Categories & Content wrote over settings that screen does not show, because that one form was missing the field list every other form on the same settings group already declared. Two settings were affected: the CTA toggle, and AI usage logging — so saving that tab also silently switched off the usage tracking added in 2.1.0. The pre-publish safety checks were never affected.
  • Fixed: CTA "Auto-detect" always reported "No matching Pages found". Detection was never broken. The message only counted fields it actually filled, and a field that already has a value is deliberately never overwritten — so once your CTA links were populated, it reported that your site has no Contact page, forever. It now distinguishes links filled in, links found but left alone, and genuinely nothing matched, and the last case says what it searched for.

2.1.0

  • Fixed: a generation timeout cost nine minutes, three billed articles, and no failover. The cURL error 28 ... 0 bytes received reported during post generation was three faults compounding. An article is requested in one piece, so the provider sends nothing until the whole thing is written — receiving 0 bytes is the normal shape of this failure, not a network fault. The 180-second limit was fixed in code and the default Max tokens of 8000 can legitimately exceed it; the timeout was then retried three times, and because the model had already finished writing, each attempt was billed for an article that was thrown away; and the failure reached the plugin carrying no diagnosis, which made the fallback chain treat it as "no evidence the provider is unhealthy" and refuse to try your next provider. Timeouts are now attempted once, are understood well enough for failover to act on them, and report what to do instead of raw cURL text. Other connection failures (DNS, refused, reset) are cheap to repeat and still retry exactly as before.
  • Added: the completion timeout is now configurable via the WPCWP_AI_TIMEOUT constant, defaulting to 300 seconds. Raising it is not automatically right, which is why it moves in both directions: the limit that actually applies is the lowest of this, PHP's own execution limit, and any timeout your web server enforces in front of PHP — so on a server that cuts off at 120 seconds, a larger value here only trades a clear plugin error for a blank 502. Long articles are best generated from cron, where no such limit applies.
  • Added: every AI call is now recorded, and the calls that produced one article are grouped together. Seven of them previously spent tokens without leaving any record — research, metadata, the article body itself (the most expensive call the plugin makes), the pipeline outline, image relevance, image alt text and the grammar check. Worse, the image, humanizer and pipeline calls each use their own connection to the provider, so their tokens appeared in neither the generation log nor the usage log: that spend was invisible everywhere. AI Usage Logs now shows a Run column so the calls behind one article read as a set, and the total for an article includes the three calls made before the post existed.
  • Note: this release updates the database (adds one column and an index to the AI usage table). It runs automatically on first load after updating. Take a backup before updating, as with any release that touches the schema.

2.0.2

  • Changed: the author is now WP Content Writer (wpcontentwriter.com), in the plugin header, the plugin-details modal and the update manifest.
  • Fixed: three paths in a historical changelog entry that the 2.0.0 rename had rewritten, making the record describe something that was never true at that version.

2.0.1

  • Fixed: 2.0.0 shipped with no working update channel. The rename changed the key used to obfuscate the built-in channel URL but not the string encoded with it, so the URL decoded to noise and updates were silently disabled with no error shown anywhere. Caught before any install ran it.
  • Changed: the update channel is now updates.wpcontentwriter.com, with the previous channel kept as an automatic fallback so that sites which updated before the new host was live are not stranded. A host that answers with an HTML page — what a parked domain does — now fails cleanly and falls through instead of being read as "no update available".

2.0.0

  • The plugin is renamed to WP Content Writer Pro. This is not an automatic update — read the upgrade steps below before installing.
  • Changed: the folder becomes wp-content-writer-pro, the main file wp-content-writer-pro.php, and every CSS class, element id, menu slug and JavaScript identifier moves from aihpp/AIHPP to wpcwp/WPCWP.
  • Changed: wp-config.php constants are now WPCWP_ANTHROPIC_KEY, WPCWP_OPENAI_KEY, WPCWP_UPDATE_MANIFEST_URL and so on. The old AIHPP_ names keep working indefinitely — they live in your own wp-config.php, and ignoring them would unconfigure every API key on update while looking like a provider authentication failure. There is no deprecation deadline.
  • Not changed, deliberately: nothing in your database moves. Settings, topics, schedules, prompts, FAQs, history, per-post metadata, capabilities and scheduled events all keep their existing keys. Renaming them would mean a live data migration whose only benefit is cosmetic. Your content and configuration carry over untouched.
  • Upgrading from 1.24.0 or earlier: WordPress identifies a plugin by its folder, so this cannot arrive as a normal update. (1) Take a backup. (2) Rename the directory on disk from ai-hosting-publisher-pro to wp-content-writer-pro, and the main file inside it to wp-content-writer-pro.php, then upload this release over it and reactivate. (3) Do not use "Delete" on the old plugin from the Plugins screen — that runs uninstall.php, which drops every table and option the plugin owns, including all your topics, schedules and history. Renaming the directory does not.

Earlier security releases

Releases before 2.0 shipped under the product's previous name. They are not listed in full here, but the ones that fixed a security problem are, because that is a thing worth being able to look up.

Security 1.15.0

  • This is the 1.15.0 released on the signed-updates line, which branched from 1.14.4. A different 1.16.0 and 1.15.0 shipped on the other line -- see 1.20.0 above.
  • Added: multi-provider failover (Settings → AI Settings). List up to five provider/model combinations in order; if the one above fails, the next is used instead of the article failing. Off by default — each provider in the list needs its own API key. Once an article falls back it stays on the fallback model for the rest of that article, because switching models mid-article produces a noticeable change in writing voice.
  • Added: the plugin now tells the difference between a failure worth retrying and one that never will. Previously every rate-limit-shaped error was retried three times with a wait in between, even when the provider was really saying "your plan cannot use this model at all" — which wasted time on every article and could never succeed. Those now fail fast and switch models instead.
  • Added: a dashboard banner and one email (at most twice a day) when generation moves onto a fallback provider, so a broken primary cannot quietly keep producing articles from your second-choice model. Both clear themselves once the primary works again.
  • Added: optional independent fact-check (Settings → Categories & Content). The existing pre-publish factual and brand review runs on the model that wrote the article, which cannot reliably catch its own mistakes. Turn this on and a different provider does that review instead. Off by default: it needs a second provider's API key, costs one AI call per post, and will hold a post back as a draft rather than publish it unreviewed.
  • Added: models refused by a provider are listed on the AI Settings tab with the reason, and can be re-enabled with one click once you have fixed the cause. They also return on their own after 7 days.
  • Added: each generated post now records which provider and model actually wrote it, so an article that reads badly weeks later can be traced to the model rather than the prompt.
  • Security: fixed an issue where an AI-generated article title containing HTML could run script in an administrator's browser on the Generate and Bulk Generate screens. Anyone able to queue a generation — which includes Editors, if team permissions are on — could have triggered this.
  • Security: provider error text is no longer stored or emailed verbatim, since some providers echo account identifiers back in their error responses.

Security 1.12.0

  • Added: AI Readiness Score — passive voice, sentence length, and transition-word usage are now scored (targets configurable on Settings → SEO, shown live in the AI Sidebar Assistant), with an optional Quality Guardrails gate.
  • Fixed: in-content images are now scored for topic relevance before being used (matched against the post's own title/focus keywords) — a stock photo that doesn't clear the bar is skipped and logged instead of inserted; the featured image always falls back to the best available match so a post is never left without one. Extra content images now also vary per section (using that section's own heading) instead of every image reusing an identical generic search query.
  • Changed: extra in-content images now wrap left/right with the surrounding text instead of sitting centered/full-width.
  • Added: comparison articles ("X vs Y") are now explicitly guided to cover one subject fully before the next, or use a comparison table, instead of interleaving details.
  • Added: configurable Call-to-Action buttons (Contact Us, Buy Now, Chat Now, Subscribe to Newsletter, Call Us) appended to generated posts — Settings → Business Profile, with an auto-detect button that scans your existing Pages for likely Contact/Newsletter/Pricing links.
  • Added: a read-only "Focus Keywords" box on the post edit screen, showing keywords as separated tags instead of a single comma-separated string.
  • Changed: the FAQ block is now a native expand/collapse accordion instead of a flat list of headings.
  • Security: license activation now issues a per-activation secret token; deactivating an activation requires it, so knowing a license key alone is no longer sufficient to deactivate (and steal) another site's activation. Existing activations from before this update continue to work unchanged.

Security 1.10.1

  • Security: removed the "Include API keys and SMTP password" option from Settings export — the export now unconditionally strips every secret, with no way to include one.
  • Security: AI provider error messages (which can echo back a fragment of an invalid key) are now redacted before being stored or displayed anywhere — AI Usage Log, generation log, queue job history, Content History, Quality Guardrails reports, the Health page, WP's own Site Health "Copy site info" export, REST responses, and email report summaries.

Security 1.7.2

  • Security fix: saving the "Save NVIDIA key" or "Save NVIDIA image model" forms could silently downgrade sibling API keys (Anthropic/OpenAI/Gemini, or all image-provider keys) from encrypted to plaintext storage. Fixed at the root — secret fields can no longer be written unencrypted by any narrow-save form, present or future.
  • Fixed: NVIDIA image generation could crash (uncaught fatal, on the WP-CLI/REST-cron paths) if a diffusion model's response nested its image data in an object; now type-checked before decoding.
  • Improved: NVIDIA image requests now send both the Stability-lineage and a flatter Flux-compatible prompt shape, since the two model families expect different request formats.
  • Fixed: the AI client no longer silently substitutes an arbitrary/unrelated NVIDIA model when a saved model id drops out of the (possibly live-discovered) list — falls back to the curated default id directly instead of whatever happens to sort first in a catalog snapshot.
  • Fixed: "Refresh models from NVIDIA" could silently change your saved model to an unrelated one if your current model wasn't in the freshly discovered list; it now keeps your current selection visible with a clear prompt to pick a replacement instead.
  • Fixed: the "fetched live from NVIDIA" message could display false information (claiming a live catalog while actually showing the built-in fallback list).
  • Added: a notice when a selected NVIDIA model's cost estimate is a generic placeholder rather than model-specific pricing.
  • Tightened the reasoning-model detection pattern for NVIDIA models to reduce false-positive matches from live-discovered catalog ids.
  • Fixed: selecting "NVIDIA NIM" as the AI provider no longer leaves an empty gap where a key field would normally appear; a wp-config-locked NVIDIA key now also gets the same automatic startup connection check other locked provider keys get.

Start creating content

Updates arrive through your WordPress dashboard like any other plugin. Nothing installs unless its signature checks out.

Choose a plan