Title: Grammar Patrol
Author: Bilal
Published: <strong>October 30, 2026</strong>
Last modified: October 30, 2026

---

Search plugins

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

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

# Grammar Patrol

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

[Download](https://downloads.wordpress.org/plugin/grammar-patrol.1.8.1.zip)

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

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

## Description

Grammar Patrol adds a dedicated “Grammar Checker” admin page where you can browse
every post, page, and custom post type on the site, run an on-demand grammar/spelling
check against LanguageTool’s public API, and review each flagged issue before approving
a fix individually or in bulk.

Content is read and written through source-specific adapters, so the same check 
works whether the text lives in:

 * Post/page titles
 * Classic editor / Block editor `post_content`
 * Elementor widget settings (heading, text-editor, button, image caption)
 * ACF fields (text, textarea, wysiwyg)
 * WPBakery Page Builder shortcodes (column text, message, toggle, custom heading,
   button)
 * Plain/native WordPress custom fields (raw postmeta, for sites without ACF)

A site-wide ignore list lets you mark project-specific terms (brand names, jargon)
as never-flag, so they don’t keep showing up on every check.

Fixes are only ever applied after explicit per-issue or bulk approval, and every
change goes through the normal WordPress revision system (or the content source’s
own equivalent) so it stays reversible.

### External services

This plugin relies on one third-party service: LanguageTool, used to analyze text
and identify grammar, spelling, and style issues.

It sends the plain-text content of a post, page, or custom post type to LanguageTool’s
public API. This only happens when a user explicitly triggers a check (clicking 
an item in the Grammar Checker list, clicking “Re-check,” or clicking “Check grammar”
in the in-editor panel) – never automatically or in the background. No content is
sent while merely browsing the list of content.

This service is provided by LanguageTool (operated by Learneo, Inc.): [Terms of Service](https://languagetool.org/legal/terms),
[Privacy Policy](https://languagetool.org/legal/privacy).

## Installation

 1. Upload the plugin to `/wp-content/plugins/`.
 2. Activate it through the “Plugins” menu in WordPress.
 3. Open the “Grammar Checker” item in the admin menu.

## FAQ

### Does this send my content to a third party?

Yes. Checking a post sends its plain-text content to the LanguageTool public API(
api.languagetool.org) so it can be analyzed. No content is sent automatically or
in the background – only when you explicitly check an item.

### Will it overwrite my content without asking?

No. Every fix requires explicit approval (individually or via “Approve all”) before
anything is written back, and the plugin refuses to apply a fix if the underlying
content changed since the check was run.

## Reviews

There are no reviews for this plugin.

## Contributors & Developers

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

Contributors

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

[Translate “Grammar Patrol” into your language.](https://translate.wordpress.org/projects/wp-plugins/grammar-patrol)

### Interested in development?

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

## Changelog

#### 1.8.1

 * Changed: renamed the plugin from “Proofpilot” to “Grammar Patrol” (slug: grammar-
   patrol) – WordPress.org flagged “Proofpilot” as already used by established third-
   party businesses, with no way to confirm affiliation. Internal code identifiers
   and the audit-log database table are unaffected; only the public name, slug, 
   text domain, and REST API namespace changed.

#### 1.8.0

 * Changed: renamed the plugin from “Proofreading Assistant” to “Proofpilot” (slug:
   proofpilot), following WordPress.org’s plugin review feedback that the previous
   name was too generic. Internal code identifiers and the audit-log database table
   are unaffected; only the public name, slug, text domain, and REST API namespace
   changed.
 * Added: a dedicated “External services” section in this readme disclosing the 
   LanguageTool API call in detail.
 * Fixed: the Contributors field to list the correct WordPress.org username.

#### 1.7.1

 * Added: a clear, always-visible disclosure wherever a check can be triggered (
   the main Grammar Checker page and the in-editor panel) that content is sent to
   the LanguageTool public API for analysis – previously this was only mentioned
   in this readme’s FAQ.

#### 1.7.0

 * Changed: renamed the plugin from “WP Grammar Checker” to “Proofreading Assistant”(
   slug: proofreading-assistant) – the previous name/slug used the restricted term“
   wp”, which WordPress.org’s plugin guidelines disallow entirely. Internal code
   identifiers and the audit-log database table are unaffected; only the public 
   name, slug, text domain, and REST API namespace changed.
 * Fixed: every finding from a full WordPress Plugin Check pass – a missing translators
   comment, several unprepared/directly-interpolated SQL warnings on the History
   table (annotated with justified phpcs:ignore comments rather than restructured,
   since the values involved are never user input), a false-positive slow-query 
   warning, and a stale “Tested up to” header.

#### 1.6.1

 * Fixed: the in-editor Grammar Checker panel’s spacing was cramped – no gap between
   the issue count and the first card, tight card padding, and tight spacing between
   a card’s internal rows. Widened throughout for both the Classic Editor metabox
   and the Gutenberg sidebar.

#### 1.6.0

 * Added: an in-editor Grammar Checker panel for the post/page title and content–
   check and apply fixes without leaving the Classic Editor (a sidebar metabox) 
   or the Block Editor (a native Gutenberg sidebar). Fixes are applied directly 
   to the live, unsaved editor content (not the database) so they’re included in
   your next normal Save/Update, exactly as if typed by hand; they’re not recorded
   in this plugin’s own History log, since WordPress’s own post-revision system 
   already captures every save. Covers the title and (in the Block Editor) Paragraph/
   Heading/List-Item-style blocks for now – other field types are still checked 
   from the main Grammar Checker page.

#### 1.5.0

 * Added: an “Apply” button on each individual grammar/spelling issue, so a single
   fix can be applied immediately without checking its box and using the bulk “Apply
   Selected Fixes” button.
 * Added: a “Select all” checkbox next to Approve all/Reject all, reflecting a checked,
   unchecked, or mixed (indeterminate) selection state.
 * Changed: the Ignore List popup now shows ignored words/phrases as a vertical,
   full-width list instead of wrapped pill chips, and scrolls internally once the
   list grows long.

#### 1.4.0

 * Security: values shown in the admin UI (ignore-list words, history batch ids)
   are now attribute-safe, closing a stored HTML-attribute-injection path an editor-
   level user could trigger against an administrator.
 * Security: the History page no longer parses stored field values as HTML to build
   its before/after preview – previews are now sent pre-stripped from the server
   as plain text.
 * Security: the before/after text of a deleted post’s history is now only visible
   to administrators; other users still see that the entry exists (who, when, how
   many fields) without the actual content.
 * Fixed: rolling back a history entry recorded before batch grouping existed always
   failed with “History entries not found.”
 * Fixed: rolling back a revision spanning more than one saved snapshot of the same
   field (WPBakery) could restore it to the wrong in-between state instead of its
   true original.
 * Fixed: a partially-failed batch rollback marked every field in that revision 
   as “Rolled back” in the UI, hiding the ones that actually still needed attention.
 * Fixed: a crafted batch id could crash the History page’s rendering.
 * Hardened: malformed or overlapping replacement ranges are now rejected before
   being applied; a failed database migration no longer gets silently marked as 
   complete; a failed (but rare) history write is now logged instead of disappearing
   without a trace.

#### 1.3.2

 * Fixed: the “Load more” button on the History page was stretched full-width instead
   of being sized to its label.

#### 1.3.1

 * Added: History page, showing every fix applied across the site as one row per
   revision (all fields changed in a single “Apply Selected Fixes” click), grouped
   under the post they belong to, with who made the change and when.
 * Added: one-click rollback per revision, restoring every field in that revision
   to what it was before the fix – including content sources with no native WordPress
   revisioning (Elementor, ACF, WPBakery, plain custom fields).
 * Fixed: the “Load more” button on the History page was misaligned.

#### 1.1.0

 * Added: post/page title checking.
 * Added: plain/native WordPress custom fields adapter (for sites without ACF).
 * Added: site-wide ignore list, with quick-ignore from any flagged issue and a 
   management panel.
 * Added: a text input to enter your own correction when no suggestion is available.
 * Fixed: “time ago” dates in the content list used the wrong timezone when the 
   site and browser differ.
 * Fixed: the Ignore List panel (and the “select an item” state) could stay visible/
   hidden incorrectly due to a CSS specificity issue.
 * Changed: “No issues found” now reads “All fixed” after a successful apply, instead
   of looking identical to a page that had nothing wrong.

#### 1.0.0

 * Initial release: Classic/Block, Elementor, ACF, and WPBakery adapters, dedicated
   admin page, revision-safe apply flow.

## Meta

 *  Version **1.8.1**
 *  Last updated **1 day ago**
 *  Active installations **Fewer than 10**
 *  WordPress version ** 6.0 or higher **
 *  Tested up to **7.1.4**
 *  PHP version ** 7.4 or higher **
 * Tags
 * [acf](https://wordpress.org/plugins/tags/acf/)[editor](https://wordpress.org/plugins/tags/editor/)
   [elementor](https://wordpress.org/plugins/tags/elementor/)[grammar](https://wordpress.org/plugins/tags/grammar/)
   [spelling](https://wordpress.org/plugins/tags/spelling/)
 *  [Advanced View](https://wordpress.org/plugins/grammar-patrol/advanced/)

## Ratings

No reviews have been submitted yet.

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

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

## Contributors

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

## Support

Got something to say? Need help?

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