Title: SEOMedic Simple Grammar Checker
Author: andrewmurray
Published: <strong>July 28, 2026</strong>
Last modified: July 28, 2026

---

Search plugins

![](https://ps.w.org/seomedic-simple-grammar/assets/banner-772x250.png?rev=3625660)

![](https://ps.w.org/seomedic-simple-grammar/assets/icon-256x256.png?rev=3625660)

# SEOMedic Simple Grammar Checker

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

[Download](https://downloads.wordpress.org/plugin/seomedic-simple-grammar.1.17.0.zip)

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

 [Support](https://wordpress.org/support/plugin/seomedic-simple-grammar/)

## Description

**Simple Grammar scans every published post for spelling, grammar, and style mistakes—
and turns cleaning them up into an ongoing SEO habit.**

Most sites publish a post once and never touch it again. But search engines favour
content that’s actively maintained: when you revisit an older post and genuinely
improve it, you refresh its “last updated” signals — one of the freshness factors
Google uses to decide what to rank. Simple Grammar makes those small, legitimate
improvements easy to do at scale, so tidying your writing doubles as content maintenance
that keeps older pages competitive.

**Why grammar fixes are more than cosmetic**

 * **Freshness signals** — meaningful edits to existing posts tell Google the content
   is current and cared for, which can help older pages hold or regain rankings.
 * **User trust & conversions** — clean, error-free copy reads as more credible 
   and keeps readers on the page.
 * **Site-wide, not one page at a time** — scan your whole archive from a single
   screen and fix issues without opening each post.

**Proprietary Post Score**

Every scanned post gets a colour-coded **Post Score** (0–100, Good / Fair / Needs
work) shown right in the results. It’s a blended quality score that combines three
signals — grammar (errors relative to length), readability (reading ease), and average
sentence length — into one at-a-glance number, with a hover breakdown. Use it to
spot your weakest pages first and prioritise the updates that matter, then watch
the score climb as you fix issues.

**Key features**

 * **Whole-site scan** — check any number of posts in one session; long posts are
   split into chunks automatically so nothing gets missed.
 * **One-click fixes** — each error shows up to five suggestions; click to apply
   the one you want and the post is updated instantly.
 * **Post Score** — a per-post quality score so you can prioritise which content
   to refresh first.
 * **Custom dictionary** — add brand and product names so they’re never flagged 
   again.
 * **Disable error types** — switch off whole categories (e.g. repetitions) site-
   wide from Settings.
 * **Find Posts** — search your content by word or anchor text for quick editorial
   audits.
 * **Ignore list** — dismiss individual errors globally if you choose to keep a 
   non-standard usage.
 * **Offset-accurate replacements** — fixes map back to the exact bytes in the original
   HTML, so tables, blockquotes, and formatted text are never corrupted.
 * **No account required** — uses the free public LanguageTool API; no sign-up, 
   no API key.

Refreshing your back catalogue is one of the highest-leverage SEO tasks most site
owners skip. Simple Grammar gives you a reason — and a workflow — to do it consistently.

**Also worth checking**

If you want your well-written content to rank and get found, pair Simple Grammar
with [SEO Medic](https://getseomedic.com/?utm_source=simple-grammar&utm_medium=plugin&utm_campaign=readme)—
it audits your site for broken links, indexing issues, and on-page SEO problems 
and tells you exactly how to fix them.

### External services

This plugin relies on the LanguageTool API, a third-party service, to check your
text for spelling, grammar, and style errors.

When you run a scan, the text content of the posts being checked is sent to the 
LanguageTool public API endpoint (https://api.languagetool.org/v2/check) over HTTPS
so it can be analysed and suggestions returned. Text is sent only while a scan is
running and only for the posts you choose to check. No data is sent during normal
site browsing, and the plugin does not store your content on any external server.

The plugin also requests the list of supported languages from https://api.languagetool.
org/v2/languages to populate the language selector on the Settings screen. This 
request sends no content from your site — it only retrieves the list — and the result
is cached for a week.

The service is provided by LanguageTool (LanguageTooler GmbH). Please review their
terms and privacy policy:

 * Terms of service: https://languagetool.org/legal/terms
 * Privacy policy: https://languagetool.org/legal/privacy

### Credits

The synonym matching feature uses data derived from WordNet 3.1, a lexical database
developed by Princeton University. WordNet is distributed under a permissive BSD-
style license. Copyright 2011 Princeton University. See https://wordnet.princeton.
edu/license-and-commercial-use for details.

## Screenshots

[⌊Scan results with the colour-coded Post Score on every post, plus one-click fix
suggestions.⌉⌊Scan results with the colour-coded Post Score on every post, plus 
one-click fix suggestions.⌉[

Scan results with the colour-coded Post Score on every post, plus one-click fix 
suggestions.

[⌊The Grammar Checker screen — choose how many posts to scan and start checking.⌉⌊
The Grammar Checker screen — choose how many posts to scan and start checking.⌉[

The Grammar Checker screen — choose how many posts to scan and start checking.

[⌊The Custom Dictionary — add brand and product names so they're never flagged.⌉⌊
The Custom Dictionary — add brand and product names so they're never flagged.⌉[

The Custom Dictionary — add brand and product names so they’re never flagged.

## Installation

 1. Download the plugin ZIP.
 2. In your WordPress dashboard go to **Plugins  Add New  Upload Plugin**.
 3. Upload the ZIP, then click **Install Now** and **Activate**.
 4. Navigate to **Simple Grammar** in the left-hand admin menu.
 5. Choose how many posts to check and click **Start Checking**.

No configuration is required. Internet access is needed to reach the LanguageTool
API.

## FAQ

### Is this plugin free?

Yes, completely free. It uses the free public LanguageTool API — no account or paid
plan is required.

### Does it work with Gutenberg (block editor) posts?

Yes. The plugin reads `post_content` directly from the database, so it works with
both the classic editor and the block editor regardless of how the post was originally
written.

### Can I check pages and custom post types?

Yes. Use the **Post type** and **Status** selectors on the Grammar Checker (and 
Find Posts) screen to scan posts, pages, or any public post type, in any status 
including drafts.

### What languages are supported?

Any language supported by LanguageTool. Pick your language in **Settings**, or leave
it on **Auto-detect** to have the language detected automatically.

### Does it edit my posts automatically?

No. Every fix requires a manual click — nothing is changed without your approval.

### Is my content sent to a third party?

Yes. To check your text, the content of the posts you scan is sent to the LanguageTool
public API (https://api.languagetool.org) over HTTPS. This only happens while a 
scan is running, and only for the posts you choose to check. The plugin does not
store your content externally. See the **External services** section above and the
[LanguageTool privacy policy](https://languagetool.org/legal/privacy) and [terms](https://languagetool.org/legal/terms)
for how they handle submitted text.

### The API returns an error or times out — what should I do?

The free LanguageTool API has rate limits. If you are scanning a large number of
posts, the plugin automatically pauses between requests. If you still see errors,
wait a minute and try again.

### How do I add words to my custom dictionary?

Click **Add to Dictionary** next to any flagged word. That word will be silently
skipped in all future scans. The dictionary is shared across the whole site, so 
only administrators can change it.

### Who can use the plugin?

Anyone who can edit posts (Contributors, Authors, Editors, Administrators) can scan
and fix the posts they are allowed to edit. Because the custom dictionary, ignored
errors, and Settings apply to the entire site, only administrators can change those.

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

“SEOMedic Simple Grammar Checker” is open source software. The following people 
have contributed to this plugin.

Contributors

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

[Translate “SEOMedic Simple Grammar Checker” into your language.](https://translate.wordpress.org/projects/wp-plugins/seomedic-simple-grammar)

### Interested in development?

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

## Changelog

#### 1.17.0

 * **Hyphenated and accented names are now recognised as proper names.** Names like“
   Meilleur-Giguère”, “Müller”, or “O’Brien” now offer the “Keep as proper name”
   option, which previously only appeared for plain A–Z names.
 * **No more mis-clicks when working through results.** Applying a fix, adding to
   the dictionary, keeping a proper name, or ignoring an error now marks that item
   done _in place_ — the remaining items no longer jump up the list, so a quick 
   next click always lands where you expect. A “Clear resolved” button compacts 
   the list when you’re ready.

#### 1.16.0

 * **All LanguageTool languages are now available.** The language selector previously
   offered a fixed list of 15 languages, which artificially limited what the checker
   could do. It now fetches the full list from LanguageTool (62 languages at the
   time of writing, including Arabic, Chinese, Japanese, Greek, and Persian) and
   the list stays current automatically as LanguageTool adds support for more.
 * The saved language is validated by format rather than against a fixed list, so
   no supported language can be rejected. If the language list cannot be fetched,
   a built-in list is used as a temporary fallback and the selector keeps working.

#### 1.15.1

 * Plugin Check compliance: the bundled synonym dictionary is now shipped as a plain
   JSON file instead of a gzipped one (compressed files are not permitted in the
   plugin directory). No change to how synonym matching behaves.
 * Plugin Check compliance: each AJAX handler now calls `check_ajax_referer()` directly
   instead of via a shared helper, so the nonce verification is visible to static
   analysis. The permission checks added in 1.15.0 are unchanged.

#### 1.15.0

 * **Security: added capability checks to every AJAX endpoint.** Previously these
   handlers verified a nonce but not the user’s permissions. A nonce only proves
   a request came from the plugin’s own page — it is not authorisation. As a result,
   any user who could open the plugin screen (anyone with `edit_posts`, e.g. Contributors
   and Authors) could change site-wide plugin data, and could read or overwrite 
   posts belonging to other users.
 * Site-wide plugin data — Settings, language, disabled error types, the custom 
   dictionary, and the ignored-errors list — now requires the `manage_options` capability(
   administrators). The Custom Dictionary, Ignored Errors, and Settings tabs, and
   the “Add to Dictionary” / “Ignore” buttons, are now only shown to administrators.
 * Scanning and fixing posts now requires `edit_posts` **plus** a per-post `edit_post`
   check, so users can only scan and fix the posts they are actually allowed to 
   edit.
 * The admin menu slug is now `seomedic-simple-grammar` (was the generic, unprefixed`
   grammar-checker`) to match the plugin slug and avoid collisions with other plugins.
   If you had bookmarked the old admin URL, update it.

#### 1.14.0

 * **Synonym matching on Find Posts.** With Broaden search on, you can now also 
   match synonyms (English): searching “guide” also surfaces posts using “tutorial”,“
   handbook”, or “guidebook”. Powered by a small bundled WordNet dataset — no external
   calls, and only loaded when you use it. Results are approximate and ranked by
   relevance.

#### 1.13.0

 * **Stylistic repetition is now its own toggle.** “Repetitions (Style)” — reusing
   the same word nearby — is separated from “Word Repetitions” in Settings, so you
   can switch off the stylistic suggestions without disabling the whole Style category.
 * **Plain-English glossary in Settings.** A new “What do these types mean?” panel
   explains each error type (Collocations, Compounding, Semantics, etc.) so it’s
   clear what you’re switching off.
 * **Broaden search on Find Posts.** An optional toggle matches posts containing
   _any_ word from your term, ranked by how many match — useful for finding a relevant
   post to link to when no post has the exact phrase.

#### 1.12.0

 * You can now check **any language** LanguageTool supports — choose it in Settings,
   or use Auto-detect. No longer limited to US English.
 * Added **Post type** and **Status** selectors: scan posts, pages, or any public
   post type, in any status (including drafts), on both the Grammar Checker and 
   Find Posts screens.
 * WordPress.org compliance: admin CSS/JS are now properly enqueued (no inline blocks),
   all functions/hooks/options use a unique prefix, and the plugin was renamed to
   SEOMedic Simple Grammar Checker. Existing dictionary, ignored errors, and disabled
   types are migrated automatically.

#### 1.11.2

 * Refreshed the plugin listing: clearer focus on keeping older posts updated as
   a content-freshness signal, and on the per-post Post Score.

#### 1.11.1

 * Disabling an error type in Settings now also matches that category by its name,
   so disabled types (e.g. word repetitions) are reliably skipped on the next scan.
 * Added a clear “External services” disclosure to the readme describing what is
   sent to the LanguageTool API.
 * Scan progress now reads “Checking post ID …” for clarity.
 * Hardened input sanitisation on the Settings save handler.

#### 1.11.0

 * Added a per-post quality score badge in the results header: a blended 0–100 “
   Post score” combining grammar (errors per word), readability (Flesch reading 
   ease), and average sentence length, colour-coded Good / Fair / Needs work. Hover
   for the breakdown. English-only and approximate.

#### 1.10.0

 * Added a Settings tab where you can switch off whole categories of errors site-
   wide (e.g. word repetitions), so they’re never flagged in future scans.
 * Per-post error counts now respect the active type filter: when you filter to 
   a single type, each post shows the count for that type (e.g. “5 Capitalization
   errors”) instead of the total.

#### 1.9.1

 * Fixed error highlights drifting onto the wrong characters (appearing to span 
   a space) on posts containing emoji or flag symbols — LanguageTool’s UTF-16 offsets
   are now converted to code points.
 * Fixed the post-count limit being ignored: the Check Posts button and scan lock
   now stay active for the whole scan, so a second scan can’t start and append posts
   beyond the selected limit.

#### 1.9.0

 * Scan results now stream in collapsed and append in place, so the page no longer
   jumps and an open inline editor is never wiped while later posts are still loading.
 * Added “Expand all” / “Collapse all” buttons above the results; each post can 
   still be toggled individually, and the state is remembered when results re-render.

#### 1.8.9

 * Added a “Find Posts” tab to search published posts by word or phrase.
 * Anchor text mode finds posts that link out using specific link text (with the
   destination URL shown) — useful for auditing internal links and anchor text.
 * Search results link straight to the editor and the live post.

#### 1.8.8

 * Sentence-level inline edits now warn when the original sentence contains inline
   formatting (bold, links, etc.), since applying a plain-text rephrase would strip
   that markup.
 * Each scanned post now has an “Edit post” link that opens it directly in the WordPress
   editor — handy for fixing formatting-heavy sentences by hand.

#### 1.8.7

 * Error context now shows the full sentence (with the error highlighted) instead
   of a short snippet, so multi-word problems are easier to judge.
 * Inline editing now lets you rephrase the entire sentence in a text box, not just
   swap a single word — useful when a fix spans several words or sentence boundaries.

#### 1.8.6

 * Full names (e.g. “John Smith”), hyphenated and apostrophe names (e.g. “Jean-Luc”,“
   O’Brien”) now also offer “Keep as proper name”.
 * Added inline editing: click “Edit…” on any error to type your own correction 
   when the suggestions are not quite right.
 * Added a “Filter by type” dropdown above the results so you can focus on one category
   at a time (e.g. just likely proper names).

#### 1.8.5

 * Fixed Add to Dictionary and Ignore buttons: they now reliably remove the word
   and clear every occurrence of it across the scanned posts (e.g. a product name
   used several times in one post), instead of only hiding the single clicked instance.

#### 1.8.4

 * Cleaner results display: errors now show a clear single-line sentence context(
   using LanguageTool’s own context) with the message, instead of a monospace snippet
   with stray blank lines.
 * Repeated words (e.g. a name appearing several times on one page) are now labelled“
   Instance k of n” so you can tell occurrences apart and fix each individually.
 * More reliable fixes for duplicates: applying a fix now keeps every other error’s
   position exact regardless of the order you apply them, so the correct occurrence
   is always replaced.

#### 1.8.3

 * Fixed missing nonce on check_single_post AJAX call — posts were silently failing
   with no results shown.

#### 1.8.2

 * Added Requires at least and Requires PHP headers so WordPress shows compatibility
   info on upload.

#### 1.8.1

 * Fixed all WordPress Plugin Check errors and warnings for WP.org submission: escaped
   output, added isset() guards and wp_unslash() on all $_POST reads, sanitised 
   JSON input, added style version parameter.
 * Bumped Tested up to: 7.0.

#### 1.8

 * Plugin renamed to Simple Grammar.
 * Added Author URI and complete plugin header for WordPress.org submission.
 * Added GPL-2.0+ licence header.

#### 1.7

 * Fixed offset/HTML mismatch: errors now map back to exact byte positions in post_content,
   so fixes on posts containing tables, blockquotes, or formatted markup land in
   the correct place.
 * Fixed multibyte drift: highlights and context snippets are now correct after 
   curly quotes, ellipses, and other non-ASCII characters.
 * Removed 1000-word cap: long posts are split into chunks and fully checked.
 * Added working one-click Apply button for each suggestion (was a non-functional
   stub).
 * New ajax_apply_fix endpoint with a nearest-occurrence fallback so multiple fixes
   can be applied to one post without re-scanning.
 * Fixed a pre-existing fatal parse error in the quote-normalisation code that prevented
   the plugin from loading on strict PHP environments.

#### 1.6

 * Added inline error context display with highlighted error spans.
 * Custom dictionary matching improved with Unicode normalisation.
 * Ignored errors list introduced.

#### 1.1

 * Initial public release.

## Meta

 *  Version **1.17.0**
 *  Last updated **15 hours ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 5.8 or higher **
 *  Tested up to **7.0.2**
 *  PHP version ** 7.4 or higher **
 * Tags
 * [grammar](https://wordpress.org/plugins/tags/grammar/)[proofreading](https://wordpress.org/plugins/tags/proofreading/)
   [Readability](https://wordpress.org/plugins/tags/readability/)[seo](https://wordpress.org/plugins/tags/seo/)
   [spell check](https://wordpress.org/plugins/tags/spell-check/)
 *  [Advanced View](https://wordpress.org/plugins/seomedic-simple-grammar/advanced/)

## Ratings

No reviews have been submitted yet.

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

[See all reviews](https://wordpress.org/support/plugin/seomedic-simple-grammar/reviews/)

## Contributors

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

## Support

Got something to say? Need help?

 [View support forum](https://wordpress.org/support/plugin/seomedic-simple-grammar/)