Title: Unstale &#8211; Refresh Old Posts with AI, Fact-Check &amp; Republish
Author: Web &amp; SEO
Published: <strong>02 Avost 2026</strong>
Last modified: 09 Setember 2026

---

Search plugins

![](https://ps.w.org/unstale/assets/banner-772x250.png?rev=3683324)

![](https://ps.w.org/unstale/assets/icon-256x256.png?rev=3683324)

# Unstale – Refresh Old Posts with AI, Fact-Check & Republish

 By [Web & SEO](https://profiles.wordpress.org/webandseofr/)

[Download](https://downloads.wordpress.org/plugin/unstale.1.17.1.zip)

 * [Details](https://lmo.wordpress.org/plugins/unstale/#description)
 * [Reviews](https://lmo.wordpress.org/plugins/unstale/#reviews)
 *  [Installation](https://lmo.wordpress.org/plugins/unstale/#installation)
 * [Development](https://lmo.wordpress.org/plugins/unstale/#developers)

 [Support](https://wordpress.org/support/plugin/unstale/)

## Description

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, checks every
figure and price against what it finds, rewrites the text, updates the SEO metas,
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 every number.** Outdated figures, prices and dates are fact-checked
   against the sources the refresh just read. A step that cannot verify a claim 
   says so in the journal instead of inventing one.
 * **Rewrite at the level you choose.** Minimal fixes typos, facts, internal links
   and the date. Balanced adds the SEO work: optimized metas, JSON-LD when no SEO
   plugin already emits it, 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, 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.
 * **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. A page built
   with a builder Unstale does not support is flagged before anything runs instead
   of being rewritten behind your back.
 * **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 the total your provider will bill 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 each launch 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. An optional full-auto mode
exists for people who want it, off by default. Approved changes are applied as a
normal WordPress revision, so one click rolls them back when revisions are enabled
on your site.

#### 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 your permalink structure uses the core date tags. 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 images and your builder settings come
   back exactly as they were. 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 also stops emitting its
   own JSON-LD while one of them is active, so a refreshed post never ends up carrying
   two Article schemas. With no SEO plugin installed, Unstale writes the metas and
   the structured data 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](https://unstale.ai/). Automation
of the free levels is available through the REST API (unstale/v1) and WP-CLI (wp
unstale refresh).

Unstale is developed by [Web & SEO Ltd](https://webandseo.dev/), the company that
owns and operates unstale.ai.

### External services

This plugin relies on one external service.

#### 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
each refresh.

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](https://unstale.ai/terms), [Privacy](https://unstale.ai/privacy)

#### A note on AI providers

Unstale does not contact Anthropic, OpenAI or Google itself 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.

## Screenshots

[⌊Content health: which published content has gone stale, and by how much⌉⌊Content
health: which published content has gone stale, and by how much⌉[

Content health: which published content has gone stale, and by how much

[⌊Side-by-side diff before approval⌉⌊Side-by-side diff before approval⌉[

Side-by-side diff before approval

[⌊Review queue with per-job actions⌉⌊Review queue with per-job actions⌉[

Review queue with per-job actions

[⌊Settings: connected AI provider, model cards, and what each refresh level costs
per 1,000 words⌉⌊Settings: connected AI provider, model cards, and what each refresh
level costs per 1,000 words⌉[

Settings: connected AI provider, model cards, and what each refresh level costs 
per 1,000 words

[⌊Journal: every refresh with its token counts and real cost, exportable to CSV⌉⌊
Journal: every refresh with its token counts and real cost, exportable to CSV⌉[

Journal: every refresh with its token counts and real cost, exportable to CSV

[⌊The Unstale block under the post editor: start a refresh, then read what it changed⌉⌊
The Unstale block under the post editor: start a refresh, then read what it changed⌉[

The Unstale block under the post editor: start a refresh, then read what it changed

[⌊Get started: the five posts that have waited longest, and one button to queue 
them all⌉⌊Get started: the five posts that have waited longest, and one button to
queue them all⌉[

Get started: the five posts that have waited longest, and one button to queue them
all

## Installation

 1. Install and activate the plugin. WordPress 7.0 or newer is required.
 2. Go to Settings > Connectors and connect an AI provider if you have not already.
    Unstale will tell you if none is connected.
 3. Go to Unstale > Settings, pick a default model and refresh level.
 4. 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.

## FAQ

### How much does a refresh cost?

You pay your AI provider directly, per token. Unstale shows an estimate BEFORE each
launch 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.73 on the dearest, depending on the model you pick. That estimate bounds the 
worst case (it assumes every web search the level allows is spent), so the cost 
logged after the run is lower: on the cheapest model, measured runs land around 
two cents.

Models whose provider grants a monthly allowance of free web searches are estimated
with that allowance applied, and the confirmation screen says so. A site that refreshes
enough articles in one month to exhaust the allowance will pay for the searches 
beyond it, which the estimate does not yet track.

Web search fees are part of the estimate shown before a refresh, but not of the 
cost logged after it. None of the three provider plugins passes the number of searches
back to WordPress today, so the plugin cannot price them once the run is over. The
journal says so instead of showing a zero, and the estimate remains the honest figure
for that part of the bill.

### 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.

### 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.
You can enable full-auto publishing in the settings if you want it.

### 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 when your permalink structure uses the core
date tags. 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 plugin files manually without deactivating
skips that safety net: re-save your permalink structure in that case.

### 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. Unstale 
asks you to confirm before refreshing any builder-built page, whichever builder 
it is, so nothing is ever rewritten behind your back.

SEO plugins: Yoast SEO, Rank Math, All in One SEO and SEOPress. The meta title and
description go into their own fields, and Unstale stops emitting its own structured
data so you never get two Article schemas on one post. With no SEO plugin, Unstale
writes both itself.

Cache plugins: WP Rocket, W3 Total Cache, LiteSpeed Cache, WP Super Cache, WP Fastest
Cache and SG Optimizer. Only the refreshed post is purged, never your whole cache.
A cache or CDN outside that list plugs onto the unstale_purged action.

None of it needs configuring: Unstale detects what is active on your site and adapts.

### Which models are supported?

Whichever models the provider you connected exposes. Unstale ships model cards for
Claude Sonnet 5 (default), GPT-5.6 Terra and Gemini 3.8 Flash, with pricing and 
ratings to help you choose. 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 a plugin update.

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“Unstale – Refresh Old Posts with AI, Fact-Check & Republish” is open source software.
The following people have contributed to this plugin.

Contributors

 *   [ Web & SEO ](https://profiles.wordpress.org/webandseofr/)

[Translate “Unstale – Refresh Old Posts with AI, Fact-Check & Republish” into your language.](https://translate.wordpress.org/projects/wp-plugins/unstale)

### Interested in development?

[Browse the code](https://plugins.trac.wordpress.org/browser/unstale/), check out
the [SVN repository](https://plugins.svn.wordpress.org/unstale/), or subscribe to
the [development log](https://plugins.trac.wordpress.org/log/unstale/) by [RSS](https://plugins.trac.wordpress.org/log/unstale/?limit=100&mode=stop_on_copy&format=rss).

## Changelog

#### 1.17.1

 * Fixed: on a site whose year comes from a date shortcode plugin (Dynamic Month&
   Year, Runthings, Current Year Shortcode, Shortcode for Current Date, WP Date 
   and Time Shortcode), a refresh could end on “A shortcode placeholder was lost
   during the rewrite” and publish nothing, after every step had run. The year now
   travels as the refresh marker instead of a shielded shortcode, and comes back
   as your plugin’s shortcode.

#### 1.17.0

 * New: a search box on Content health filters the list by title and slug, case 
   and accents ignored, without reloading the page. The age threshold, the tranches,
   your exclusions and the noindex rule keep their meaning.
 * Improved: the meta title and description carry your SEO plugin’s current-year
   variable (Yoast SEO, Rank Math, All in One SEO, SEOPress) instead of a fixed 
   year, at Balanced and above.
 * Fixed: on an Elementor page, a style edit made in the builder while a refresh
   waited for review was undone on approval. Publication now refuses, without writing
   anything, if the layout changed since the refresh started.
 * Fixed: a refresh that leaves an Elementor, Divi or SeedProd layout unchanged 
   keeps its point of return, which 1.16.0 dropped.

#### 1.16.0

 * New: Restore the previous version now works on pages built with Elementor, Divi
   and SeedProd. Each builder records what the refresh is about to overwrite, layout
   included, and puts it back on click.
 * Fixed: on an Elementor page, visitors could see the old text for up to a day 
   after publication. Elementor’s element cache is now cleared on every write.
 * Fixed: the restore link and its notices say what will actually be put back on
   a builder page, and a restore completed halfway is logged and can be tried again.

#### 1.15.0

 * New: year references now follow the calendar. “In 2025” or “updated for 2025”
   reads the current year after a refresh, in the text at every level, in the title
   and metas at Balanced and above. A year that dates an event stays as it is.
 * New: with a current-year shortcode plugin active, the refresh writes its shortcode
   instead of a fixed year, only where it has been measured to render. Five plugins
   are recognised, and the unstale_year_token filter sets your own token per surface.
 * New: the post title is refreshed at Balanced and above, by its year only. The
   slug never moves, and a title you edited during the refresh is never overwritten.
 * Unstale Pro 1.6.0 needs this version. Update the free plugin first and Pro second.

#### 1.14.4

 * Fixed: a step that failed twice in the same paid way no longer buys a third identical
   attempt. Failures that cost nothing keep their three tries, and a manual retry
   always starts with the full budget.

#### 1.14.3

 * Fixed: a long post could fail its refresh over and over with “The answer from
   the model was cut off at the output limit”. Batches are now sized on what is 
   actually sent, not on a word count that ignored block markup.
 * Fixed: the room allowed for a rewritten batch was shared with the model’s thinking.
   It is now twice as large, at no extra cost.
 * Fixed: updating Unstale halfway through a long rewrite could publish a post with
   one passage duplicated and another missing. The rewrite now starts over when 
   the split changed.

#### 1.14.2

 * Fixed: when the AI found no cannibalization in a group, Content cannibalization
   said “AI could not confirm this group”, which reads as a breakdown. A verdict
   now reads as a verdict.
 * Fixed: roughly one verdict in seven was paid for and never delivered, cut short
   at 1024 output tokens. The room allowed is now four times larger, and the price
   shown before you click does not change.

#### 1.14.1

 * Fixed: Confirm with AI answered “This cannibalization group no longer exists”
   for every group as soon as any post on the site had been saved since the scan.
   The groups are now recomputed and matched by their posts.
 * Fixed: the Excluded tab listed every item of a content type Unstale never refreshes,
   one line each. Such types now appear once, with a count, and the count above 
   the list covers only what you can reintegrate.

#### 1.14.0

 * Fixed: Confirm with AI answered “AI could not confirm this group” for every group.
   A 200-token cap cut the verdict off before it began; it is now 1024, and a cut-
   off answer shows as a failure with its cause.
 * Fixed: the AI check used the catalog’s recommended model instead of the one you
   chose in the settings.
 * Fixed: the cannibalization scan no longer groups content Content health already
   excludes, noindex pages and posts you excluded by hand. The Pro weekly sweep 
   applies the same rule.
 * Fixed: titles in the cannibalization cards could show raw HTML entities.
 * Fixed: a server reply that was not JSON, a maintenance page for instance, is 
   reported as a failed request instead of an empty verdict.

#### 1.13.0

 * New: a notice tells you when your default refresh level is one your plan no longer
   allows, and what repairs it. Your setting is never rewritten behind your back.
 * Fixed: the settings screen shows the refresh level you actually saved, even a
   locked one, and saving a locked level overwrites nothing.
 * Fixed: a model that leaves the catalog stops the job by name instead of quietly
   calling another provider.
 * Fixed: the bulk refresh screen stops on a level your plan has locked, instead
   of blaming your AI provider.
 * Fixed: an Elementor floating button is no longer treated as refreshable content
   nor picked as an internal-link target. Any content type its developer keeps out
   of navigation menus is left alone; WooCommerce products stay.

#### 1.12.0

 * New: content your SEO plugin marks noindex is left out of Content health. Read
   from Yoast SEO, All in One SEO, SEOPress and Rank Math, each measured on a real
   site; any doubt keeps the page in the list.
 * New: an Excluded tab on Content health lists what Unstale never refreshes and
   who decided it: a content type with no search surface, a manual exclusion, or
   a noindex set in your SEO plugin, which is named.
 * Fixed: refusing to refresh an excluded post now points to the posts list, where
   the Reintegrate link actually is.

#### 1.11.0

 * New: an Exclude link, next to Refresh, in the posts list and on Content health.
   An excluded post leaves every list Unstale works from, and a refresh started 
   on it is refused. The link then reads Reintegrate.
 * Fixed: content types with no search surface, Popup Maker popups or Elementor 
   templates for instance, no longer appear as posts to refresh or as internal-link
   targets. WooCommerce products stay.
 * Fixed: a bulk refresh that refuses a post now says why.

#### 1.10.0

 * New: a refresh now fact-checks the figures it added itself, at every level, and
   lists on the review screen the added figures that are outdated or unconfirmed,
   with a source link. No model is called when nothing was added.
 * Fixed: the count of checked facts reads “checked in the original article”, with
   the added figures on their own line below.
 * Fixed: the Journal no longer reports 0 searches for refreshes that did search
   the web. No provider plugin passes that count on yet, the Journal says so, and
   the logged cost is documented as a floor.

#### 1.9.1

 * Fixed: when the catalog replaces a model with a newer one from the same family,
   your site follows the upgrade, Gemini 3.7 Flash to Gemini 3.8 Flash for instance.
   A replacement that would change provider is refused.

#### 1.9.0

 * Fixed: a refresh could change how your article speaks to its reader, informal
   to formal for instance. Unstale now measures the voice before rewriting and holds
   every step to it, the meta description included.
 * New: the Unstale block under the editor says, before you start, whether the refresh
   will move the publish date.
 * Fixed: the model catalog records when a model is renamed, so a site that chose
   Gemini 3.7 Flash keeps its choice and its rate the day it becomes Gemini 3.8 
   Flash.

#### 1.8.3

 * Fixed: on a site made of short pages, Content health could miss two pages that
   said the same thing word for word. A pair is now measured against the shorter
   of the two posts. Long posts score exactly as before.

#### 1.8.2

 * Fixed: on a site written in Chinese, Japanese, Thai, Lao, Khmer or Burmese, Content
   health found very few competing posts. The comparison now switches on the writing
   system itself, at any length. Korean and every spaced language are unchanged.

#### 1.8.1

 * Fixed: on Content health, a group of more than 25 posts sharing a vocabulary 
   is a template, never sent to the AI pass. It said “AI could not confirm this 
   group”; it now says the pages share a layout and that no model was called.

#### 1.8.0

 * New: Content health now finds published posts that compete over the same topic,
   grouped with the post Unstale would keep and why. It runs on your own site, with
   no AI provider and at no cost. An optional AI pass, priced before you start, 
   tells shared vocabulary from a shared query.
 * If you use Unstale Pro, groups found by its weekly sweep now show on this screen
   too. Needs Unstale Pro 1.3.0 or newer.

#### 1.7.0

 * New: a Get started screen, opened on first activation, lists the five posts that
   have gone longest without an update and queues all five in one click, through
   the usual estimate screen. It stays in the Unstale menu.

#### 1.6.0

 * New: a Restore button in the Unstale block puts a post back as it was before 
   its refresh: text, publish date and SEO metas, field by field, and only what 
   the refresh changed.
 * New: a notice across the admin when refreshes are waiting for your review.
 * New: the Unstale column in the posts list colours the age of the last refresh,
   on the same thresholds as Content health.
 * New: an Export CSV button on the Journal, carrying the current filter.
 * New: the refresh level slider in Settings shows what each level costs per 1,000
   words, Pro levels included.

#### 1.5.1

 * New: with Unstale Pro 1.0.3 or newer, the Unstale block under the editor says
   what the automation decides for the open post, and warns when a rule excludes
   it.

#### 1.5.0

 * New: an Unstale block under the post editor, in both editors. Pick a level, start
   the refresh and follow it step by step without leaving the page.
 * New: once a refresh is ready, that block lists everything it did: length change,
   corrected facts and their sources, metas, structured data, internal links and
   inserted blocks.
 * New: on the free plugin, picking Strong or Maximal shows what that level would
   add to the open post, without inventing numbers.

#### 1.4.2

 * Fixed: on Content health, posts never refreshed carried an empty line in their
   Unstale cell, stretching every row of a fresh install.

#### 1.4.1

 * Fixed: the bundled model catalogue still expected Claude Sonnet 5 to get more
   expensive on 1 September. Anthropic made its $2 / $10 per million tokens permanent
   on 10 August.
 * New: with Unstale Pro, its licence key field now also appears in Unstale > Settings.

#### 1.4.0

 * Fixed: on a site using All in One SEO, a refresh wrote its title and description
   where nothing read them. Unstale now writes through AIOSEO’s own interface.
 * Fixed: the cost announced on Google models was about fifteen times too high: 
   search results are not billed as input tokens there, and the free monthly search
   allowance is now counted. On a 500-word article at Balanced, 24 cents became 
   4.
 * Fixed: Elementor, Divi and SeedProd pages no longer raise a page builder warning.
   It is kept for builders without an adapter, and says what would really happen.
 * Fixed: a builder section holding a script or style block could carry that code
   into the rewritten text.
 * Improved: the cost question in this readme gives the real range across the catalogue.

#### 1.3.2

 * Fixed: on PHP 8.1 the plugin did not work at all, one file using syntax that 
   only exists from PHP 8.2. Nothing changes on PHP 8.2 or later.

#### 1.3.1

 * Improved: when a refresh updates a SeedProd page inside the builder but not the
   live page, the journal says so and names the one step left: open the page in 
   SeedProd and save.

#### 1.3.0

 * New: pages built with SeedProd can now be refreshed, layout, styling and images
   untouched. Elementor and Divi were already supported.
 * On SeedProd pages using SeedProd Pro blocks, the new text lands in the builder
   but the live page keeps its text until you reopen it in SeedProd and save.

#### 1.2.0

 * New: pages built with Elementor or Divi can now be refreshed. Only the text goes
   through the refresh; layout, styling and settings stay as they were. An unsupported
   builder is flagged before anything runs.
 * New: shortcodes are lifted out before the rewrite and put back afterwards, exactly
   as they were.
 * New: SEOPress is detected like Yoast, Rank Math and All in One SEO.
 * Fixed: a long article could be published with a hole in the middle when the model
   cut a batch short. A cut-off answer is now refused and retried.
 * Fixed: a SeedProd page built from a theme template was not recognised as a builder
   page, and its refresh was lost.
 * Fixed: an Elementor or Divi page containing anything shortcode-shaped failed 
   at the publishing step every time.
 * Fixed: the guard against overwriting an edit made while a job waited in the review
   queue was switched off on Elementor and Divi pages.
 * Fixed: backslashes in your content were dropped on publication.
 * Improved: an unreadable model answer is quoted at both ends in the journal, not
   just its first 300 characters.
 * Improved: a builder field holding a structure rather than plain text is left 
   alone instead of being replaced by the word “Array”.
 * Improved: the word count used to size a refresh no longer counts shortcode markup.

#### 1.1.3

 * New: after two weeks of real use and at least three published refreshes, Unstale
   asks for a review on wordpress.org, on its own screens only. “Do not ask again”
   means exactly that.

#### 1.1.2

 * Fixed: refreshing a post a second time no longer stacks a second set of key-takeaway
   boxes on the first.
 * Fixed: the key-takeaway boxes are valid blocks wherever they come from, so an
   add-on can add its own without the editor flagging the content.

#### 1.1.1

 * Added: two filters (`unstale_prompt`, `unstale_rewrite_prompt`) so an add-on 
   can serve its own system prompts.

#### 1.1.0

 * New: a Content health screen lists the published content you have not touched
   in a while, oldest first, in three age ranges. It reads only your database and
   works with no AI provider connected.
 * New: select several items there and send them in one batch, capped at 50, with
   the total cost shown before anything starts and every left-out item named with
   its reason.
 * New: a setting decides how long content has to sit untouched before it counts
   as stale, 180 days by default.
 * Improved: up to 15 internal links per refresh, instead of 10.

#### 1.0.7

 * Fixed: the boxes added by the enrich step were plain HTML between two blocks,
   which the editor reported as invalid content. They are now regular blocks.
 * Improved: the review queue compares the text your readers see, not the block 
   markup. On a real refresh the comparison went from 100 rows to 31.
 * Improved: at Balanced, a dense paragraph hiding a series of steps or figures 
   is restructured into a list or a table.
 * Improved: the comparison heading names the level that produced it.

#### 1.0.6

 * Fixed: on a long article, the metas and structured data step could hit the output
   limit mid-answer and retry under the same limit. The limit is now high enough,
   and a cut-off answer says so in the journal.

#### 1.0.5

 * Fixed: a refresh could die on an article with nothing to fact-check, the model’s
   reply being written in a way the plugin could not read. Those answers are now
   understood.

#### 1.0.4

 * Fixed: a model answering with reasoning only killed the refresh outright. It 
   is now treated like any other step failure: logged, counted in the cost, and 
   retried.

#### 1.0.3

 * Fixed: the cost shown could be lower than what your provider billed, a failed
   step dropping the tokens it had spent. Every call that reaches the provider is
   now counted on its own line.
 * Fixed: the journal quotes what the model actually sent back when its answer could
   not be read.

#### 1.0.2

 * Fixed: a refresh that died mid-step always reported the same generic reason. 
   The journal now records what the worker actually reported.

#### 1.0.1

 * Fixed: a refresh could fail for good during a short provider outage, all three
   attempts falling inside 90 seconds. Retries are now spaced 2 and 10 minutes apart.

#### 1.0.0

 * Initial release: pipeline on the WordPress AI Client (analyze, web research, 
   fact-check, rewrite, enrich, internal links, cleanup, review, publish), review
   queue with diff, journal, SEO-safe republication, targeted cache purge, REST 
   API and WP-CLI.

## Meta

 *  Version **1.17.1**
 *  Last updated **7 hours ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 7.0 or higher **
 *  Tested up to **7.1**
 *  PHP version ** 8.1 or higher **
 *  Language
 * [English (US)](https://wordpress.org/plugins/unstale/)
 * Tags
 * [content refresh](https://lmo.wordpress.org/plugins/tags/content-refresh/)[evergreen content](https://lmo.wordpress.org/plugins/tags/evergreen-content/)
   [fact check](https://lmo.wordpress.org/plugins/tags/fact-check/)[old posts](https://lmo.wordpress.org/plugins/tags/old-posts/)
   [republish](https://lmo.wordpress.org/plugins/tags/republish/)
 *  [Advanced View](https://lmo.wordpress.org/plugins/unstale/advanced/)

## Ratings

No reviews have been submitted yet.

[Your review](https://wordpress.org/support/plugin/unstale/reviews/#new-post)

[See all reviews](https://wordpress.org/support/plugin/unstale/reviews/)

## Contributors

 *   [ Web & SEO ](https://profiles.wordpress.org/webandseofr/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/unstale/)