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, Privacy Policy.
Installation
- Upload the plugin to
/wp-content/plugins/. - Activate it through the “Plugins” menu in WordPress.
- 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.
ContributorsTranslate “Grammar Patrol” into your language.
Interested in development?
Browse the code, check out the SVN repository, or subscribe to the development log by 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.
