{"id":349818,"date":"2026-08-25T22:29:47","date_gmt":"2026-08-25T22:29:47","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/ai-slop-checker\/"},"modified":"2026-08-25T23:00:19","modified_gmt":"2026-08-25T23:00:19","slug":"ai-slop-checker","status":"publish","type":"plugin","link":"https:\/\/mlt.wordpress.org\/plugins\/ai-slop-checker\/","author":6277636,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"AI Slop Checker","header_author":"AI Slop Checker","header_description":"Detects leftover chatbot residue in posts (dangling \"Would you like me to...\" offers, prompt echoes, assistant self-references) and fact-checks factual claims against live sources via Perplexity and Gemini.","assets_banners_color":"3a667b","last_updated":"2026-08-25 23:00:19","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/ai-slop-checker\/","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":54,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"jadeslair","date":"2026-08-25 23:00:19"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-256x256.jpg":{"filename":"icon-256x256.jpg","revision":3666051,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.jpg":{"filename":"banner-1544x500.jpg","revision":3666051,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.jpg":{"filename":"banner-772x250.jpg","revision":3666051,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3666051,"resolution":"1","location":"assets","locale":"","width":1442,"height":816},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3666051,"resolution":"2","location":"assets","locale":"","width":1476,"height":819},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3666051,"resolution":"3","location":"assets","locale":"","width":1423,"height":1344}},"screenshots":{"1":"Editor sidebar flagging a post with leftover chat residue.","2":"The dashboard: site-wide scan progress and the flagged list.","3":"Settings."}},"plugin_section":[],"plugin_tags":[2353,216196,13312,246073],"plugin_category":[],"plugin_contributors":[270656],"plugin_business_model":[],"class_list":["post-349818","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-chatgpt","plugin_tags-content-quality","plugin_tags-fact-checking","plugin_contributors-jadeslair","plugin_committers-jadeslair"],"banners":{"banner":"https:\/\/ps.w.org\/ai-slop-checker\/assets\/banner-772x250.jpg?rev=3666051","banner_2x":"https:\/\/ps.w.org\/ai-slop-checker\/assets\/banner-1544x500.jpg?rev=3666051","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/ai-slop-checker\/assets\/icon-256x256.jpg?rev=3666051","icon_2x":"https:\/\/ps.w.org\/ai-slop-checker\/assets\/icon-256x256.jpg?rev=3666051","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/ai-slop-checker\/assets\/screenshot-1.png?rev=3666051","caption":"Editor sidebar flagging a post with leftover chat residue."},{"src":"https:\/\/ps.w.org\/ai-slop-checker\/assets\/screenshot-2.png?rev=3666051","caption":"The dashboard: site-wide scan progress and the flagged list."},{"src":"https:\/\/ps.w.org\/ai-slop-checker\/assets\/screenshot-3.png?rev=3666051","caption":"Settings."}],"raw_content":"<!--section=description-->\n<p>Two problems, one plugin.<\/p>\n\n<p><strong>1. Pasted chat sessions.<\/strong> When someone copies an answer out of ChatGPT or Claude and drops it into the editor, the reply usually comes with its packaging: a \"Certainly! Here's the article you asked for\" on top, and a \"Would you like me to expand on any section?\" at the bottom. The pattern scanner looks for that packaging. It runs locally, costs nothing, and needs no API key.<\/p>\n\n<p>Hits near the end of a long post are weighted more heavily, because that is where the tail of a chat reply lands.<\/p>\n\n<p><strong>2. Facts that have moved on.<\/strong> A model writes confidently from training data with a cutoff date. Version numbers, prices, \"the current largest\", \"as of 2023\" \u2014 all of it can be quietly wrong by the time it publishes. The plugin pulls the most checkable sentences out of a post and runs them past a search-grounded model. Anything contested or low-confidence gets a second look from Google.<\/p>\n\n<p>Verdicts are one of: accurate, outdated, inaccurate, or unverifiable. \"Outdated\" is the one to care about \u2014 it means the claim used to be true, which is exactly the failure mode a knowledge cutoff produces.<\/p>\n\n<h4>Choosing a fact-check provider<\/h4>\n\n<p>You can use <strong>Perplexity<\/strong>, <strong>Gemini<\/strong>, or both.<\/p>\n\n<p>Both are grounded: Perplexity searches at request time by default, and the Gemini requests always attach the Google Search tool. That grounding matters more than which model you pick. An ungrounded model answers a fact-check from its own training data, which means it carries the same cutoff blind spot the plugin exists to find \u2014 it would be checking stale facts against stale facts.<\/p>\n\n<p>Running both costs twice as much but is meaningfully stronger: claims the two agree on are reported with higher confidence, and claims they split on are marked <strong>disputed<\/strong> so a human decides rather than the plugin guessing.<\/p>\n\n<h4>What it looks at<\/h4>\n\n<ul>\n<li>Dangling offers to keep working (\"Would you like me to...\", \"Let me know if you'd like...\", \"3 more prompts\")<\/li>\n<li>Assistant self-reference (\"As an AI language model\", \"I don't have access to real-time data\")<\/li>\n<li>Prompt echoes and delivery framing (\"Certainly! Here's a draft\", \"As requested\")<\/li>\n<li>Unfilled scaffolding (<code>[Insert company name]<\/code>, \"Word count: 1,450\", stray SEO briefing fields)<\/li>\n<li>Raw markdown that never converted (<code>**bold**<\/code>, <code>## headings<\/code>)<\/li>\n<li>Knowledge-cutoff language (\"as of my last update\", \"the latest version is\")<\/li>\n<li>Stock generated phrasing (\"delve into\", \"in today's fast-paced world\", \"a testament to\")<\/li>\n<\/ul>\n\n<p>The last category is deliberately low-weight. Plenty of human writers say \"it's important to note\". On its own it proves nothing, and the scoring reflects that.<\/p>\n\n<h3>External services<\/h3>\n\n<p>Pattern scanning is entirely local. The plugin makes no network requests at all until you add an API key and turn on AI mode.<\/p>\n\n<p>When you do enable fact-checking, the plugin sends data to whichever services you have configured. In every case what leaves your site is the same: <strong>individual sentences extracted from the post being checked<\/strong>, plus the post title and its publication date for context. Never the full post, never user accounts, never visitor data.<\/p>\n\n<p><strong>Perplexity AI<\/strong> \u2014 used to fact-check claims when Perplexity is the selected provider.\nData sent: extracted claim sentences, post title, post publication date.\nSent to: https:\/\/api.perplexity.ai\/chat\/completions\nTerms: https:\/\/www.perplexity.ai\/hub\/legal\/terms-of-service\nPrivacy: https:\/\/www.perplexity.ai\/hub\/legal\/privacy-notice<\/p>\n\n<p><strong>Google Gemini API<\/strong> \u2014 used to fact-check claims when Gemini is the selected provider. Google Search grounding is enabled on these requests, so your claim text is used as a search input.\nData sent: extracted claim sentences, post title, post publication date.\nSent to: https:\/\/generativelanguage.googleapis.com\/\nTerms: https:\/\/ai.google.dev\/gemini-api\/terms\nPrivacy: https:\/\/policies.google.com\/privacy<\/p>\n\n<p>Note that Google treats its free and paid Gemini tiers differently. On the free tier, Google's terms state that submitted content may be used to develop Google products and that human reviewers may read it. On a paid tier it is not used to improve their products. If you are checking unpublished drafts, read those terms before using a free key.<\/p>\n\n<p><strong>Google Fact Check Tools API<\/strong> \u2014 optional. Looks for published fact-checks matching a claim.\nData sent: keywords derived from a single claim sentence.\nSent to: https:\/\/factchecktools.googleapis.com\/\nTerms: https:\/\/developers.google.com\/terms\nPrivacy: https:\/\/policies.google.com\/privacy<\/p>\n\n<p><strong>Google Programmable Search (Custom Search JSON API)<\/strong> \u2014 optional, and only active if you supply a Search Engine ID. Used to corroborate contested claims and judge how recent the supporting sources are.\nData sent: keywords derived from a single claim sentence.\nSent to: https:\/\/www.googleapis.com\/customsearch\/v1\nTerms: https:\/\/developers.google.com\/terms\nPrivacy: https:\/\/policies.google.com\/privacy<\/p>\n\n<p>Responses are cached for 24 hours so repeated checks of unchanged content do not re-send anything.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>ai-slop-checker<\/code> folder to <code>\/wp-content\/plugins\/<\/code>.<\/li>\n<li>Activate it.<\/li>\n<li>Open <strong>AI Slop<\/strong> in the admin menu.<\/li>\n<\/ol>\n\n<p>Pattern checking works immediately. For fact-checking, switch Check Mode to \"Patterns + AI\", pick a provider, and add that provider's key:<\/p>\n\n<ul>\n<li><strong>Perplexity<\/strong> \u2014 key from perplexity.ai \u2192 Settings \u2192 API.<\/li>\n<li><strong>Gemini<\/strong> \u2014 key from Google AI Studio. There is a free tier.<\/li>\n<\/ul>\n\n<p>The Gemini model ID is a free-text field on purpose. Google retires and releases IDs faster than this plugin ships, so you can type a current one without waiting for an update.<\/p>\n\n<p>The separate Google Search &amp; Fact Check section is optional and independent of Gemini. The Fact Check Tools API needs only an API key; web corroboration also needs a Programmable Search Engine ID set to search the whole web.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20prove%20something%20was%20written%20by%20ai%3F\"><h3>Does this prove something was written by AI?<\/h3><\/dt>\n<dd><p>No, and it does not try to. It finds evidence of a specific, sloppy workflow: pasting a chat reply in without reading it. A high score means artifacts of a chat session survived into the published text. That is a real editorial problem whether or not you care how the draft was produced.<\/p>\n\n<p>A well-edited AI-assisted post scores clean here. That is the intended behaviour.<\/p><\/dd>\n<dt id=\"will%20the%20check%20slow%20down%20publishing%3F\"><h3>Will the check slow down publishing?<\/h3><\/dt>\n<dd><p>No. The pattern scan runs inline and takes milliseconds. If AI mode is on, the fact-check is queued to run just after the save completes, so hitting Publish never waits on a network call.<\/p><\/dd>\n<dt id=\"can%20i%20close%20the%20tab%20during%20a%20site-wide%20scan%3F\"><h3>Can I close the tab during a site-wide scan?<\/h3><\/dt>\n<dd><p>Yes. The scan keeps a cursor in the database and runs server-side on WP-Cron, so it survives page navigation and picks up where it stopped.<\/p>\n\n<p>If your host has WP-Cron disabled, or blocks the loopback requests it depends on, the scan still completes as long as the dashboard is open \u2014 the page drives the work itself rather than waiting on cron. Leaving the tab open is the reliable option; closing it relies on cron working.<\/p>\n\n<p>A scan that dies part way through, for any reason, loses at most the single post it was working on. If a particular post crashes the scanner twice, it is stepped over and reported at the end rather than retried forever.<\/p><\/dd>\n<dt id=\"how%20much%20does%20a%20site%20scan%20cost%3F\"><h3>How much does a site scan cost?<\/h3><\/dt>\n<dd><p>Pattern-only scans are free and make no network requests, so running one across a whole site costs nothing.<\/p>\n\n<p>With AI fact-checking enabled, each post costs one call to your chosen provider \u2014 two if you have both selected \u2014 plus up to a couple of Google calls for contested claims. Across a large site that adds up, and free API tiers have rate limits a full crawl will hit. Check your provider's limits before starting one.<\/p>\n\n<p>\"Skip posts already checked since their last edit\" is on by default so repeat scans stay cheap, and API responses are cached for 24 hours. A practical approach on a large site is to run the pattern scan over everything first, then enable AI only for the posts it flags.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<\/ul>","raw_excerpt":"Finds ChatGPT and Claude output pasted straight into posts, and fact-checks claims a model&#039;s training cutoff left behind.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/349818","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=349818"}],"author":[{"embeddable":true,"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/jadeslair"}],"wp:attachment":[{"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=349818"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=349818"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=349818"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=349818"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=349818"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/mlt.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=349818"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}