Title: Content Polisher – Content Quality &amp; Cleanup
Author: kanibolotskiydenis
Published: <strong>October 14, 2026</strong>
Last modified: October 14, 2026

---

Search plugins

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

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

# Content Polisher – Content Quality & Cleanup

 By [kanibolotskiydenis](https://profiles.wordpress.org/kanibolotskiydenis/)

[Download](https://downloads.wordpress.org/plugin/content-polisher.0.3.0.zip)

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

 [Support](https://wordpress.org/support/plugin/content-polisher/)

## Description

Content Polisher checks the text of your posts, pages and public custom post types
for small mistakes that are easy to miss: double spaces, spaces before punctuation,
missing spaces after punctuation, wrong dashes, empty paragraphs and duplicate line
breaks.

Every issue is shown with a clear Before / After preview. Fix issues one by one,
or fix all safe issues of a post at once. Anything that could be intentional is 
only suggested and waits for your review. Every change is backed up and can be undone
from the History page.

Everything runs on your server. Content Polisher works without an account, an API
key or a connection to any external service.

Documentation: [contentpolisher.com/docs](https://contentpolisher.com/docs/)

#### How it works

 1. Open **Content Polisher** and click **Scan Website**.
 2. Review the issues, grouped by type, with a Before / After preview.
 3. Click **Fix** on an issue, or **Fix safe issues in this post**.
 4. Changed your mind? Click **Undo**, in the notice or on the **History** page.

#### Check while you write

In the block editor, the **Content Polisher** panel in the post sidebar checks the
post you are editing — including unsaved changes — with the same rules. Fix issues
one by one or all safe issues at once; fixes change the blocks in the editor, so**
Ctrl+Z** undoes them and saving the post keeps them. Before publishing, the pre-
publish panel shows how many issues are left.

#### Command line (WP-CLI)

Scan, list issues, fix and undo from the command line, e.g. in a deployment or CI
check: `wp content-polisher scan --fail-on=safe --user=admin` exits with code 1 
when safe fixes are found. Commands: `scan`, `status`, `issues`, `fix`, `history`,`
undo` (see `wp help content-polisher`). They use the same permissions, history and
undo as the dashboard.

#### Rules

 * **Double spaces** — “Hello world”  “Hello world”.
 * **Space before punctuation** — “Hello , world”  “Hello, world”. In French, the
   space before ; : ! ? is correct and is kept.
 * **Missing space after punctuation** — “Hello,world”  “Hello, world”.
 * **Typography** — `--`  dash, spaced hyphens between words in Ukrainian, Russian
   and French, non-breaking space before ; : ! ? in French.
 * **Empty paragraphs** — `<p></p>`, `<p>&nbsp;</p>`, empty paragraph blocks.
 * **Duplicate line breaks** — `<br><br>` (suggestion only).

Content languages: English, Ukrainian, Russian, French. Interface languages: English,
French, Ukrainian, Russian.

#### Safe by design

 * Only the visible text is changed. Tags, attributes, links, shortcodes and block
   markup are never modified.
 * Code is never touched: `pre`, `code`, `script`, `style`, code blocks, custom 
   HTML blocks and code shortcodes are skipped.
 * URLs, e-mail addresses, domains, file names, numbers and abbreviations are recognised
   and left alone.
 * Gutenberg blocks stay valid: text is edited only in blocks whose content is stored
   as HTML.
 * Pages built with Elementor, Beaver Builder, SiteOrigin, Brizy, Oxygen, Bricks
   or Thrive Architect are skipped, because their content is stored elsewhere (Content
   Polisher Pro checks Elementor pages through their widgets). Divi and WPBakery
   text is checked without touching shortcode attributes.
 * A backup of the original content is stored before every change; WordPress revisions
   are created as usual.
 * Undo never overwrites later edits: if a post was changed after the fix, you are
   asked first.
 * Posts open in the editor by another user are skipped. Large sites are scanned
   in small batches.

#### Multilingual sites

With the language set to **Automatic**, every post is checked in its own language:
from Polylang or WPML when available, otherwise detected from the text, otherwise
the site language. Language-specific typography is skipped for other languages rather
than applying the wrong conventions.

#### Content Polisher Pro

Content Polisher is complete on its own. An optional add-on, Content Polisher Pro,
adds:

 * duplicate word detection (“this is is”), advanced typography (typographic quotes,
   ellipses, finer French spacing) and extended HTML checks;
 * fixing all safe issues of the whole site in one batched, undoable operation;
 * checking Advanced Custom Fields: Text, Text Area and WYSIWYG fields of posts,
   ACF blocks and options pages, including those inside Repeater, Group and Flexible
   Content, with AI proofreading of those fields;
 * checking pages built with Elementor: the text of their widgets, including Elementor
   Pro and V4 atomic widgets;
 * on-demand AI proofreading with your own Anthropic or OpenAI API key;
 * CSV exports of scan results and of the full change history.

Learn more at [contentpolisher.com/pro](https://contentpolisher.com/pro/). The add-
on is installed next to this plugin and extends it; this plugin contains no locked
features. Upgrade links appear only on Content Polisher’s own screens.

#### External services

**Freemius** (https://freemius.com) — this plugin includes the Freemius SDK, which
manages purchases, licenses and updates of the optional Content Polisher Pro add-
on.

 * After activation, Freemius asks whether you want to opt in to receive security
   and feature notifications and to share basic, non-sensitive diagnostic data (
   site URL, WordPress, PHP and plugin versions, active plugins and theme, admin
   name and e-mail). Nothing is sent if you click **Skip**, and the plugin works
   exactly the same.
 * You can change your choice at any time from the plugins list or the Account page.
 * Post content is never sent to Freemius.
 * Terms: https://freemius.com/terms/ — Privacy policy: https://freemius.com/privacy/

No other external service is used by this plugin.

#### For developers

 * `content_polisher_rules` — add rules (implement `ContentPolisher\Rules\RuleInterface`
   or extend `AbstractTextRule`).
 * `content_polisher_content_sources` — check more text than the post content, such
   as custom fields (implement `ContentPolisher\Sources\ContentSourceInterface`,
   or `SiteContentSourceInterface` for text that belongs to no post); each piece
   of text is fixed, recorded and undone on its own.
 * `content_polisher_site_capability` — capability needed to fix site-wide text 
   such as options pages (default `manage_options`).
 * `content_polisher_proofreader` — provide a `ContentPolisher\Proofreader\ProofreaderInterface`
   engine; its suggestions appear as review-only issues.
 * `content_polisher_available_features`, `content_polisher_feature_enabled` — features
   provided by add-ons (`ContentPolisher\Features\FeatureManager`).
 * `content_polisher_loaded` (action) — Content Polisher is booted; add-ons register
   their hooks here.
 * `content_polisher_categories`, `content_polisher_dashboard_config`, `content_polisher_settings_sections`,`
   content_polisher_dashboard_toolbar`, `content_polisher_history_actions`, `content_polisher_enqueue_assets`—
   extend the screens.
 * `content_polisher_editable_blocks`, `content_polisher_protected_blocks`, `content_polisher_protected_shortcodes`—
   which content may be edited.
 * `content_polisher_capability` — capability to use the plugin (default `edit_others_posts`).
 * `content_polisher_post_types`, `content_polisher_post_statuses`, `content_polisher_post_language`,`
   content_polisher_scan_limit`, `content_polisher_exclude_page_builders`, `content_polisher_page_builder_meta`,`
   content_polisher_scan_post_content`, `content_polisher_upgrade_url`.

## Screenshots

[⌊Scan results: issues grouped by type, with a Before / After preview and one-click
fixes.⌉⌊Scan results: issues grouped by type, with a Before / After preview and 
one-click fixes.⌉[

Scan results: issues grouped by type, with a Before / After preview and one-click
fixes.

[⌊History: every change is listed and can be undone.⌉⌊History: every change is listed
and can be undone.⌉[

History: every change is listed and can be undone.

[⌊Settings: content types, language, rules and exclusions.⌉⌊Settings: content types,
language, rules and exclusions.⌉[

Settings: content types, language, rules and exclusions.

[⌊Check while you write: the Content Polisher panel in the block editor.⌉⌊Check 
while you write: the Content Polisher panel in the block editor.⌉[

Check while you write: the Content Polisher panel in the block editor.

## Installation

 1. In **Plugins  Add New**, search for “Content Polisher” and click **Install Now**,
    then **Activate**. Or upload the ZIP in **Plugins  Add New  Upload Plugin**.
 2. Freemius asks whether you want to opt in to notifications and diagnostics. Choose**
    Allow & Continue** or **Skip**: both are fine.
 3. Go to **Content Polisher  Settings** to choose the content types and language, 
    then run your first scan from **Content Polisher**.

To add Content Polisher Pro, buy it from **Content Polisher  Add-Ons**, then upload
the `content-polisher-pro` ZIP like any plugin and activate it. Keep Content Polisher
active: Pro requires it.

## FAQ

### Will it break my HTML or my blocks?

No. Content Polisher never re-writes markup: it edits text between tags only and
keeps every other byte exactly as it was. Block markup is checked so that edited
blocks stay valid.

### Is my content sent anywhere?

No. Scans and fixes run entirely on your server. Content Polisher never sends post
content to an external service. See “External services” above for the optional Freemius
opt-in.

### Do I need an account or a license?

No. Content Polisher works without an account, a license or an API key. A license
is only needed for the optional Content Polisher Pro add-on.

### Does it check custom fields (ACF)?

Content Polisher checks the post content. Content Polisher Pro also checks the text
fields of Advanced Custom Fields (and Secure Custom Fields) in posts, ACF blocks
and options pages, with the same preview, history and undo, and includes them in
AI proofreading. When ACF is active, Settings  Content sources shows this option.

### Who can use it?

Editors and administrators (users who can edit other users’ posts). Each change 
also requires permission to edit that specific post. Settings require the `manage_options`
capability.

### What happens to Pro if I deactivate Content Polisher?

Content Polisher Pro needs Content Polisher. While Content Polisher is inactive,
Pro does nothing and shows a notice; nothing breaks. Your Pro settings are kept.

### What happens when I uninstall the plugin?

Settings are removed. Scan results and the change history are removed only if you
enabled **Delete all data** in Settings  Advanced. Your posts are never deleted.
Content Polisher Pro data is removed only when Content Polisher Pro itself is uninstalled.

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“Content Polisher – Content Quality & Cleanup” is open source software. The following
people have contributed to this plugin.

Contributors

 *   [ kanibolotskiydenis ](https://profiles.wordpress.org/kanibolotskiydenis/)

[Translate “Content Polisher – Content Quality & Cleanup” into your language.](https://translate.wordpress.org/projects/wp-plugins/content-polisher)

### Interested in development?

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

## Changelog

#### 0.3.0

 * New: check the post you are editing in the block editor, with Fix, Fix all safe
   issues and Ignore, and a summary in the pre-publish panel. Fixes are part of 
   the editor’s undo history.
 * New: WP-CLI commands `wp content-polisher scan|status|issues|fix|history|undo`,
   with `--fail-on` exit codes for CI checks.
 * Improved: a comma or semicolon moved to the next word (“sunset ,with”) is fixed
   in one step (“sunset, with”).
 * Fix: a missing space after a period was not reported when the next word looks
   like a domain ending (“once.It”, “here.In”).
 * New for add-ons: the `content_polisher_scan_post_content` filter lets a page 
   builder add-on check the builder’s own data instead of the generated post content.

#### 0.2.0

 * Initial release.

## Meta

 *  Version **0.3.0**
 *  Last updated **1 day ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.5 or higher **
 *  Tested up to **7.1.3**
 *  PHP version ** 8.1 or higher **
 * Tags
 * [cleanup](https://wordpress.org/plugins/tags/cleanup/)[content audit](https://wordpress.org/plugins/tags/content-audit/)
   [proofreading](https://wordpress.org/plugins/tags/proofreading/)[spaces](https://wordpress.org/plugins/tags/spaces/)
   [typography](https://wordpress.org/plugins/tags/typography/)
 *  [Advanced View](https://wordpress.org/plugins/content-polisher/advanced/)

## Ratings

No reviews have been submitted yet.

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

[See all reviews](https://wordpress.org/support/plugin/content-polisher/reviews/)

## Contributors

 *   [ kanibolotskiydenis ](https://profiles.wordpress.org/kanibolotskiydenis/)

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/content-polisher/)