Unstale – Refresh Old Posts with AI, Fact-Check & Republish
Old posts lose traffic. Unstale researches, fact-checks and rewrites them with your own AI provider, connected in WordPress. No credits, no quota.
Solid choice
Unstale is a solid plugin choice in 2026, with a few things worth checking first. It runs on 100+ sites and was last updated 3 days ago, and scores 68/100 on our health check.
- Actively developed — last update 3 days ago
- Tested with the latest WordPress (7.1)
- Momentum — downloads up 322.1% vs the previous 30 days
- Small user base (100+ active installs)
- Very few reviews so far
- Needs PHP 8.1 or newer
How does it stack up?
Side-by-side on installs, updates, ratings & supportDaily downloads
Download spikes usually follow a new release — each site that auto-updates counts as a download.
Rankings
Where Unstale stands todayWordPress.org search rankings
Live position in the plugin search, top 100| Keyword | Position |
|---|---|
| content refresh | #50 |
| evergreen content | #39 |
| fact check | #1 |
| old posts | #58 |
| republish | #11 |
Version adoption
Share of active sites per release.
About Unstale
From the official readme · v1.38.0Description
Your best posts stopped bringing traffic. Not from a penalty: the prices, the statistics and the year references inside them grew outdated while fresher pages took the rankings. A content refresh fixes that, and Unstale runs one with real AI, through the AI provider you already connected to WordPress.
Point it at a published post. It reads the post, searches the live web, fact-checks its most important claims against what it finds, rewrites the text, updates the SEO metas from the Balanced level up, adds internal links, and hands you the result as a diff to approve. Then it republishes with a fresh date, without breaking your URLs.
What one content refresh actually does
- Live web research. The refresh searches the web while it runs, so the rewrite is based on what is true today and not on what the model remembers.
- Fact-check of the claims that matter. Before the rewrite, the refresh checks the most important figures, prices and dates of the post against the web, and the rewrite corrects the outdated ones. The summary in the review queue and under the editor lists each correction, with a link to the source when it found one. A second pass checks the new figures the rewrite added to the text and flags the ones no source confirms.
- Rewrite at the level you choose. Minimal fixes typos, facts, internal links and the date. Balanced adds the SEO work: optimized metas, an Article JSON-LD on posts only, when the page carries none, key-takeaway callouts, readability.
- Year references that follow the calendar. A year written to say the content is current, “best laptops 2025”, “updated for 2025”, is moved to the current year in the text and, from the Balanced level up, in the title and the metas. A year that dates an event, a release, a study, a law, stays as it is. In the meta title and description the year is written as the current-year variable of your SEO plugin, Yoast SEO, Rank Math, All in One SEO or SEOPress, so it follows the calendar on its own. If you run a current-year shortcode plugin, the text and the title get its shortcode instead, and only where it actually renders.
- Internal linking. Up to 15 relevant internal links per refresh, with natural, varied anchors, one link per target page.
- Alt text and captions that match the image. In posts written with the block editor or the classic editor, the model looks at each image from your media library, up to ten per post, and rewrites the alt text only when it is empty, a file name, generic or wrong. From the Balanced level up it can add a caption where the image has none and one would help the reader. An image whose media library alt text is empty gets the new one there too, and Restore the previous version empties it again. The review queue lists every image it changed. Models that do not read images skip this step at no cost.
- Pages built with Elementor, Divi or SeedProd. The refresh reads the text out of the builder’s own data, sends only that text through, and writes it back where it came from, so your layout and your styling are untouched. Other builders are not recognised out of the box: a page built with one gets no warning and is refreshed like a standard post, so check it before you refresh it.
- A journal per article. Every step, every token count and the real cost, each on its own line.
Find out what has gone stale, for free
Knowing a refresh works is one thing. Knowing which of your 400 posts needs one is another. The Content health screen lists your published content that has not been updated in a while, oldest first, split into three age ranges so you can see how much of your archive has drifted.
It reads nothing but your own database, so looking costs you nothing and needs no AI provider connected. When you are ready, select what you want from that screen and send it off in one batch. Unstale shows an estimated cost before anything starts, and names anything it left out of the batch along with the reason.
Find out what competes with itself, for free
Two posts that cover the same ground do not rank together, they rank against each other, and the newer or thinner one usually loses. The same Content health screen scans your published content and groups the posts that overlap too closely, so you see the competition before Google decides it for you.
The scan compares your own text with itself, on your own server: no AI provider needed, nothing sent anywhere, and it costs nothing to run. Each group names the post Unstale would keep, and why. With an AI provider connected, an optional AI pass reads every group in context and tells two posts that merely share vocabulary from two posts that genuinely chase the same query.
You keep the keys, and you keep the bill
Since WordPress 7.0, providers and credentials live in Settings > Connectors and are managed by WordPress itself. Unstale uses whatever you set up there, so this plugin stores no API key of its own and never sees your credentials.
Your WordPress talks to that provider directly. Your content, published or draft, never passes through our servers. We do not see it.
You pay your provider directly, at its own rates, and nothing to us per refresh. No credits, no monthly quota, no cap on how many old posts you refresh. Unstale shows an estimated cost before a refresh you confirm from the editor, the posts list or Content health, and logs the real one after.
Nothing goes live without you
Every refresh waits in a review queue with a side-by-side diff of the current post and the proposed one. You approve it or you discard it. Automatic publishing, which skips this step, is off by default and switched on in the settings. Before it publishes, Unstale saves the current post as a WordPress revision when revisions are enabled on your site. WordPress does not version Elementor or SeedProd layouts, so for those the job keeps its own copy instead. The Restore the previous version link under the editor puts the post back from either one, after a screen that names what it restores. An AI agent connected to your site prepares refreshes the same way, and cannot approve one unless you allow it in the settings.
Republishing that does not break your URLs
Republishing plugins usually warn you not to use them when your permalinks contain the post date, because bumping the date moves the URL. Unstale skips the bump automatically when the new date would change the post’s address, whichever date tags your permalinks use, and when a refresh changed nothing in the text. To keep dated URLs and still refresh the date, switch to the %unstale_year%, %unstale_monthnum% and %unstale_day% tags: they freeze the original date in the URL for good. Republication also carries position control, randomized timing, allowed days and time windows.
Works with what you already run
Unstale fits the stack you have instead of asking you to change it, and none of this needs a setting: it detects what is active and adapts.
- Page builders: Elementor, Divi and SeedProd. The refresh rewrites the text inside the page the builder already built and puts it back in the builder’s own data, so your layout, your styling, your image files and your builder settings come back exactly as they were. The alt text of an image that already has one counts as text, and the rewrite can change it. On a SeedProd page that uses blocks from SeedProd Pro, the new text lands in the builder and the live page waits for you to reopen it and save, which the journal tells you plainly.
- SEO plugins: Yoast SEO, Rank Math, All in One SEO and SEOPress. The rewritten meta title and description go straight into that plugin’s own fields, not into a second set of fields your theme would ignore. Unstale only adds its own Article JSON-LD to posts, never to pages, and only when the published page carries none, so a refreshed post never ends up with two Article schemas, whichever SEO plugin you run. With no SEO plugin installed, Unstale writes the metas itself.
- Cache plugins: WP Rocket, W3 Total Cache, LiteSpeed Cache, WP Super Cache, WP Fastest Cache and SG Optimizer. Once a refresh is published, Unstale purges the post through that plugin’s own public purge API so the new version is live at once. The purge is always aimed at the refreshed post, never a full-site flush, so the rest of your cache stays warm. Anything not on that list, a CDN for instance, hooks onto the unstale_purged action.
- Editors and content types. Gutenberg and the Classic editor both, on posts, pages and public custom post types.
What Unstale does not do
It does not write new articles. It works only on posts you already published, which is the point: the traffic is easier to win back on an evergreen post that once ranked than on a new one nobody has read. It does not read Search Console and does not rank your archive by traffic lost, so you choose which old posts to refresh, one by one or in batches from the Content health screen. And there is no account to create anywhere.
Two refresh levels are free: Minimal and Balanced, and so is sending a batch off from the Content health screen. The Strong and Maximal levels, scheduled automation and per-category rules are part of Unstale Pro. Automation of the free levels is available through the REST API (unstale/v1), WP-CLI (wp unstale refresh) and WordPress abilities that AI agents reach through the MCP adapter.
Unstale is developed by Web & SEO Ltd, the company that owns and operates unstale.ai.
External services
This plugin relies on two external services.
The Unstale model catalog (unstale.ai)
What it is: a public, static JSON file at https://unstale.ai/api/v1/models.json listing the supported model ids, their prices per million tokens and their notes. It exists so that a new provider model becomes available in your settings without waiting for a plugin update, and so the plugin can show you a cost estimate before a refresh you confirm.
What is sent, and when: nothing but the HTTP request itself. It is an unauthenticated GET, fired by a single scheduled task once every 24 hours. No content, no credentials, no personal data, no site identifier is transmitted, and there is no manual refresh button that could trigger it more often. If the request fails the plugin keeps using the catalog bundled in the plugin files.
This service is provided by Unstale: Terms, Privacy
YouTube oEmbed (youtube.com)
What it is: YouTube’s public oEmbed endpoint at https://www.youtube.com/oembed. During a refresh, Unstale asks it whether each YouTube video embedded in the post is still available, and checks a replacement video the same way before using it.
What is sent, and when: the public address of each YouTube video embedded in the post being refreshed, and of each replacement video before it is used, and nothing else. No content, no credentials, no site identifier. It is an unauthenticated GET, sent only while a refresh runs on a post that embeds YouTube videos. Each answer that says whether a video is available is cached for 24 hours.
This service is provided by Google: Terms of Service, Privacy Policy
A note on AI providers
Unstale does not contact any AI provider itself (Anthropic, OpenAI, Google AI) and declares none of them as its own external service. Prompts are handed to the WordPress AI Client, which routes them to the provider you connected in Settings > Connectors. That provider, its terms and its billing are the relationship between you and them, set up in WordPress and not in this plugin. To check alt text, a refresh also hands the WordPress AI Client the image files of the post, read from your own media library, so they reach that same provider.
Installation
- Install and activate the plugin. WordPress 7.0 or newer is required.
- Go to Settings > Connectors and connect an AI provider if you have not already. Unstale will tell you if none is connected.
- Open Unstale > Get started and follow the checklist: connect a provider, pick a model it serves, refresh one post, then read the diff.
- In the Posts list, click “Refresh with Unstale” on any published post. Review the estimated cost, confirm, then approve the proposed rewrite in Unstale > Review queue.
Video walkthrough: https://www.youtube.com/watch?v=7YLuWUl5jZQ
First refresh, from the estimate to the approval: https://www.youtube.com/watch?v=dzC125M6iek
A whole batch from Content health, then the review queue: https://www.youtube.com/watch?v=cbDa646x19A
Frequently asked questions
How much does a refresh cost?
You pay your AI provider directly, per token. Unstale shows an estimate before a refresh you confirm from the editor, the posts list or Content health, and logs the real cost after. For a 1000-word article at the Balanced level the estimate runs from roughly $0.08 on the cheapest model in the catalogue to roughly $0.70 on the dearest, depending on the model you pick. That estimate is conservative, not a ceiling: its token counts are calibrated on real pipeline runs and it counts every web search the level allows, so the cost logged after the run usually comes in lower. On the cheapest model…
How is this different from a plugin that just changes the publish date?
A date bump moves an old post back to the top of your feeds, but the text stays exactly as outdated as it was. Unstale rewrites the content first: it researches the subject on the live web, corrects the figures and prices that aged, updates the metas and the internal links, and only then republishes. The date bump is the last step of the job, not the whole job, and it is skipped when the refresh changed nothing in the text.
Can I try it on a single post before touching my archive?
Yes, and that is the default path. The Posts list has no bulk action: you refresh one post at a time, review the diff, and approve or discard. Nothing sweeps your archive unless you ask for it, either by ticking the posts you want on the Content health screen, from WP-CLI (wp unstale refresh –all, which asks you to confirm first, because every job spends money at your provider), or through the scheduled rules in Unstale Pro.
Does my content go through your servers?
No. WordPress calls the provider you connected, directly. The only request to unstale.ai is the public model catalog (no content, no personal data).
Which API key does it use?
None of its own. Since WordPress 7.0, credentials live in Settings > Connectors and are managed by WordPress. Unstale never sees, stores or transmits them. If you used an older version of this plugin, the API keys it had stored are deleted automatically when you update.
Can it publish without my approval?
Not by default. Every refresh waits in the review queue with a side-by-side diff. Automatic publishing skips that step, and only runs if you switch it on in the settings.
Can an AI agent such as Claude Code, Codex or Hermes Agent drive Unstale?
Yes. Unstale registers WordPress abilities that list your stale content, estimate a refresh, start it, follow it and read its fact-check. With the MCP adapter plugin active (it is published on GitHub), your agent connects to a dedicated Unstale server with an application password, and the Unstale > AI Agent screen gives the configuration for each client, plus an SSH variant. The agent talks to your site directly: nothing goes through unstale.ai. It prepares refreshes but cannot approve or reject them unless you switch on “Let AI agents approve or reject refreshes” on that same screen. With…
Does it rewrite my titles?
Only the year in them. From 1.15.0, a refresh at the Balanced level or above can update the post title, and the one change allowed there is a year that dates the content: “Best laptops 2025” becomes “Best laptops 2026”, or the shortcode of your current-year plugin where it renders. A title that would differ from the original in any other way is refused and the original stays. The slug never changes, the proposed title is shown in the review queue before anything is published, and the revision taken before publication keeps the previous one.
My permalinks contain the post date. Will the date bump break my URLs?
No: the bump is skipped automatically for any post whose address would change with the new date, whichever date tags your permalinks use (year, month, day, hour, minute or second, or a structure of its own for a post type). To keep dated URLs AND bump dates, switch your structure to the %unstale_year%, %unstale_monthnum% and %unstale_day% tags: they freeze the original date in the URL forever. If you deactivate Unstale later, the plugin automatically restores the core date tags so your site keeps routing (posts whose date was bumped will then use the bumped date in their URL). Deleting the…
Does it work with my page builder, my SEO plugin and my cache plugin?
Page builders: Elementor, Divi and SeedProd. The refresh rewrites the text inside the page the builder already built, so nothing about your layout moves. Out of the box, Unstale recognises no other builder: such a page gets no warning, and the refresh rewrites its standard WordPress content, which may not be what your visitors see. A developer can register a builder with the unstale_builder_detectors filter; if Unstale has no adapter for it, it then asks you to confirm before refreshing its pages. SEO plugins: Yoast SEO, Rank Math, All in One SEO and SEOPress. The meta title and description…
Which models are supported?
The models in Unstale’s catalog, for the provider you connected. Unstale ships model cards for Gemini 3.8 Flash (default on new installs), Claude Sonnet 5.5 and GPT-6 Sol, with pricing and ratings to help you choose. A site that already ran Unstale keeps the model it had. All three are generally available, so the model you pick is the model that runs; if the catalog ever marks one as preview, Unstale runs its fallback instead and states the substitution on the model card and in the job log. The catalog is updated remotely: when a provider ships a new model, it appears in your settings without…
Changelog
Bulk actions in the review queue: approve, reject or cancel several refreshes at once.
1.38.0
- New: select refreshes in the review queue and approve, reject or cancel them in one go.
- New: a notice counts the refreshes acted on, and those skipped because they were not awaiting review or you cannot edit their post.
1.37.1
- Fixed: a post whose structured data cannot be read is no longer treated as having none, so it never gets a second Article.
- Fixed: Article types written as full schema.org addresses, or listed with other types, are now recognized.
- Fixed: Unstale no longer mistakes an older copy of its own Article, served from a page cache, for one added by another plugin.
- Improved: the check of the published post reads at most 2 MB.
1.37.0
- Changed: the Article structured data Unstale adds now goes on posts only, never on pages.
- Changed: a page that received an Article from an earlier refresh no longer prints it.
- New: the unstale_article_post_types filter lets a blog kept in a custom post type receive the Article too.
1.36.0
- Improved: the structured data a refresh adds is now an Article only. Google no longer shows FAQ or HowTo rich results, so asking for them spent tokens for nothing.
- New: before asking for structured data, Unstale reads the published post. If it already carries an Article, none is requested.
- New: with an SEO plugin active, Unstale now adds its Article when the post has none, and removes its own when the post already has one.
- Fixed: the structured data Unstale stores keeps its accented letters and quotes, and Restore puts it back reliably.
1.35.2
- Fixed: the old URL of a post whose slug uses non-Latin letters (Cyrillic, Greek, Chinese and others) now redirects to the post that replaced it, instead of returning a 404.
- Fixed: the Add a redirect form keeps such URLs whole instead of cutting them short.
1.35.1
- Fixed: the research step now sends the opening of the post with its keyword, so Google’s content filter no longer blocks it by mistake on a short product name.
- Improved: a request blocked by Google’s content filter now says so and is not retried, since the same request gets the same refusal.
Screenshots
For developers
Is this your plugin? Show off the numbers.
Add a live badge to your site, docs or GitHub README. It updates on its own — no account needed.
Best Unstale alternatives
All content refresh plugins →FAQ
Unstale: quick answers
Straight answers, pulled from live WordPress.org data.
Live data from WordPress.org · checked Oct 11, 2026
Is Unstale free?
Yes. Unstale is free to download and use from the official WordPress.org plugin directory.
Is Unstale safe to use in 2026?
Unstale is a solid plugin choice in 2026, with a few things worth checking first. It runs on 100+ sites and was last updated 3 days ago, and scores 68/100 on our health check.
How many websites use Unstale?
Unstale is active on 100+ WordPress websites and has been downloaded 4,901 times since it launched in August 2026. It was downloaded 3,736 times in the last 30 days.
Does Unstale work with WordPress 7.1?
Yes. The developer has tested Unstale up to WordPress 7.1.3, the latest release. It requires WordPress 7.0 or newer.
What PHP version does Unstale need?
Unstale requires PHP 8.1 or higher. Most hosts run PHP 8.x today, so it works on any modern WordPress hosting.
When was Unstale last updated?
The latest version, 1.38.0, was released on October 8, 2026 (3 days ago).
Who makes Unstale?
Unstale is developed and maintained by Web & SEO.
What are the best alternatives to Unstale?
The most popular alternatives to Unstale are Auto Republish & Permalink… (100+ installs), Content Refresh Assistant (<10 installs) and CRAI Content Updater (<10 installs).
Powered by PageForge
Want thousands of pages that rank like these? Build them in an afternoon.
This directory runs on the same engine as PageForge. Turn any spreadsheet, CSV or API into thousands of fast, SEO-ready WordPress pages — with schema, internal links and AI-written copy baked in.
- CSV, Google Sheets & API data sources
- AI content, schema & internal links per page
- Works with Elementor, Gutenberg, Yoast & Rank Math
- Free on WordPress.org — no credit card