{"id":301140,"date":"2026-04-28T04:59:08","date_gmt":"2026-04-28T04:59:08","guid":{"rendered":"https:\/\/en-ca.wordpress.org\/plugins\/gn-spam-user-cleaner\/"},"modified":"2026-04-28T06:44:03","modified_gmt":"2026-04-28T06:44:03","slug":"dgn-webs-spam-user-cleaner","status":"publish","type":"plugin","link":"https:\/\/test.wordpress.org\/plugins\/dgn-webs-spam-user-cleaner\/","author":23481981,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.0.5","stable_tag":"1.0.5","tested":"6.9.4","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"DGN Webs Spam User Cleaner","header_author":"DGN Webs","header_description":"Scan and bulk-remove spam user accounts using a multi-signal scoring engine \u2014 disposable domain detection, MX validation, role-based detection, and more.","assets_banners_color":"a2b1c4","last_updated":"2026-04-28 06:44:03","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/dgnwebs.com\/spam-user-cleaner\/","header_author_uri":"https:\/\/dgnwebs.com","rating":5,"author_block_rating":0,"active_installs":0,"downloads":97,"num_ratings":1,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.4":{"tag":"1.0.4","author":"dgnwebs","date":"2026-04-28 04:58:48"},"1.0.5":{"tag":"1.0.5","author":"dgnwebs","date":"2026-04-28 06:44:03"}},"upgrade_notice":{"1.0.0":"<p>Initial release.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":1},"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3516968,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3516968,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3517012,"resolution":"1544x500","location":"assets","locale":"","width":1545,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3517012,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.4","1.0.5"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3516968,"resolution":"1","location":"assets","locale":"","width":2302,"height":1194}},"screenshots":{"1":"Scan settings \u2014 role selection, score threshold slider, and excluded emails whitelist","2":"Scan in progress \u2014 real-time stats showing Scanned \/ Total \/ Spam Found \/ Selected","3":"Results table with score badges and reason tags, domain filter, and reason filter chips","4":"DGN Webs Spam User Cleaner active \u2014 Invalid and Risky status badges and status filter chips"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[261235,600,155132,145212,261234],"plugin_category":[54],"plugin_contributors":[261236],"plugin_business_model":[],"class_list":["post-301140","plugin","type-plugin","status-publish","hentry","plugin_tags-bulk-delete-users","plugin_tags-security","plugin_tags-spam-detection","plugin_tags-spam-users","plugin_tags-user-cleanup","plugin_category-security-and-spam-protection","plugin_contributors-dgnwebs","plugin_committers-dgnwebs"],"banners":{"banner":"https:\/\/ps.w.org\/dgn-webs-spam-user-cleaner\/assets\/banner-772x250.png?rev=3517012","banner_2x":"https:\/\/ps.w.org\/dgn-webs-spam-user-cleaner\/assets\/banner-1544x500.png?rev=3517012","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/dgn-webs-spam-user-cleaner\/assets\/icon-128x128.png?rev=3516968","icon_2x":"https:\/\/ps.w.org\/dgn-webs-spam-user-cleaner\/assets\/icon-256x256.png?rev=3516968","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/dgn-webs-spam-user-cleaner\/assets\/screenshot-1.png?rev=3516968","caption":"Scan settings \u2014 role selection, score threshold slider, and excluded emails whitelist"}],"raw_content":"<!--section=description-->\n<p>DGN Webs Spam User Cleaner scans your WordPress users and identifies likely spam registrations using a multi-signal scoring engine \u2014 no external API required for the core features.<\/p>\n\n<p>Every email address is scored across multiple heuristic signals. Users scoring above your chosen minimum threshold appear in a reviewable list. You decide who to delete \u2014 nothing is removed without your confirmation.<\/p>\n\n<p><strong>Core Features (Free)<\/strong><\/p>\n\n<ul>\n<li><strong>Multi-signal spam scoring<\/strong> \u2014 blacklisted domains, invalid email format, Gmail abuse patterns (starts with number, long digit sequences, excessive dots), bot-generated usernames (consecutive consonant clustering, unseparated long strings), random alphanumeric patterns, no vowels, very short usernames<\/li>\n<li><strong>Never-logged-in flag<\/strong> \u2014 optionally add +3 score to users who have never logged in<\/li>\n<li><strong>Minimum score threshold<\/strong> \u2014 slider from 1\u201320, users below the threshold are excluded from results<\/li>\n<li><strong>Excluded emails whitelist<\/strong> \u2014 protect known-good users from ever appearing in scan results<\/li>\n<li><strong>Batch scanning<\/strong> \u2014 processes 1,000 users per batch, works on sites with hundreds of thousands of users<\/li>\n<li><strong>Real-time progress bar<\/strong> \u2014 scan and deletion progress displayed live<\/li>\n<li><strong>Domain filter<\/strong> with Only \/ Except toggle \u2014 show or exclude a specific email domain<\/li>\n<li><strong>Reason filter chips<\/strong> \u2014 filter results by any combination of detection reasons<\/li>\n<li><strong>Score badges<\/strong> \u2014 colour-coded Low \/ Medium \/ High \/ Critical<\/li>\n<li><strong>Bulk selection<\/strong> \u2014 select current page or all results across all pages<\/li>\n<li><strong>Deletion with content reassignment<\/strong> \u2014 all content (posts, comments) is safely reassigned to an admin before deletion<\/li>\n<li><strong>Protected roles<\/strong> \u2014 Administrators and Editors can never appear in scan results or be deleted<\/li>\n<li><strong>CSV export<\/strong> \u2014 download the full result set<\/li>\n<\/ul>\n\n<p><strong>Privacy &amp; External Connections<\/strong><\/p>\n\n<p>This plugin performs no external connections. MX record validation uses PHP's built-in <code>checkdnsrr<\/code> function \u2014 a standard DNS query. No user data is sent to any third party.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>dgn-webs-spam-user-cleaner<\/code> folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> menu in WordPress<\/li>\n<li>Go to <strong>Tools \u2192 Spam Cleaner<\/strong><\/li>\n<li>Select the user roles to scan<\/li>\n<li>Set your minimum spam score threshold (default: 3)<\/li>\n<li>Optionally add known-good email addresses to the Excluded Emails list<\/li>\n<li>Click <strong>Scan Now<\/strong> and review the results before deleting<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20scanning%20or%20deleting%20break%20my%20site%3F\"><h3>Will scanning or deleting break my site?<\/h3><\/dt>\n<dd><p>Scanning is completely read-only \u2014 it only reads user data, nothing is changed. Deletion reassigns all content (posts, comments) to a site administrator before the user is removed, so nothing is lost.<\/p><\/dd>\n<dt id=\"can%20it%20accidentally%20delete%20real%20users%3F\"><h3>Can it accidentally delete real users?<\/h3><\/dt>\n<dd><p>The scoring engine flags likely spam but requires your review before anything is deleted. Every flagged user is shown with their score and the specific reasons they were flagged. You select who to delete. Administrators and Editors are permanently protected and can never appear in results. Use the Excluded Emails list to protect any other known-good users.<\/p><\/dd>\n<dt id=\"how%20many%20users%20can%20it%20handle%3F\"><h3>How many users can it handle?<\/h3><\/dt>\n<dd><p>It scans in batches of 1,000 users at a time, so it handles sites with tens or hundreds of thousands of users without timing out. The progress bar shows real-time scan status.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20woocommerce%3F\"><h3>Does it work with WooCommerce?<\/h3><\/dt>\n<dd><p>Yes. The Customer role can be included in scans. Deleting a WooCommerce customer does not delete their orders \u2014 orders remain intact in WooCommerce.<\/p><\/dd>\n<dt id=\"does%20this%20plugin%20send%20my%20users%27%20email%20addresses%20to%20an%20external%20server%3F\"><h3>Does this plugin send my users' email addresses to an external server?<\/h3><\/dt>\n<dd><p>No. All checks run entirely on your WordPress server. MX record lookups use standard DNS queries \u2014 the same technology your server uses for all internet communication. No email addresses are transmitted to any external service.<\/p><\/dd>\n<dt id=\"is%20this%20plugin%20compatible%20with%20multisite%3F\"><h3>Is this plugin compatible with multisite?<\/h3><\/dt>\n<dd><p>The plugin is designed for single-site installations. Multisite support is planned for a future release.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Remove ACTIVATE.txt (leftover from pre-approval development, not applicable to this version)<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>All detection features (disposable domain, MX validation, role-based) are now fully free with no restrictions<\/li>\n<li>Removed license system to comply with WordPress.org guidelines<\/li>\n<li>Simplified admin UI \u2014 single settings panel, no license tab<\/li>\n<li>Status badges (Invalid \/ Risky) now shown for all users<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Plugin renamed to DGN Webs Spam User Cleaner with slug dgn-webs-spam-user-cleaner to comply with WordPress.org naming guidelines<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Plugin renamed to comply with WordPress.org naming guidelines<\/li>\n<li>All function, constant, and option names updated to use the dgnwebs_ prefix<\/li>\n<li>Plugin URI updated<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>UI: Tabs redesigned to classic folder style<\/li>\n<li>UI: Scan Settings and Add-on\/License split into tabs \u2014 upsell less dominant<\/li>\n<li>UI: Scan Now footer hidden when Add-on tab is active<\/li>\n<li>UI: Filter Logic toggle switch replaces OR\/AND radio buttons<\/li>\n<li>UI: Page scrolls to status card automatically when scan starts<\/li>\n<li>Fix: Unescaped colspan output hardened with absint()<\/li>\n<li>Fix: User IDs in delete handler sanitized with array_map( absint )<\/li>\n<li>Fix: Domain Path header removed from plugin header (no translations yet)<\/li>\n<li>Fix: Tested up to updated to 6.9<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial public release<\/li>\n<li>Multi-signal heuristic scoring engine<\/li>\n<li>Batch scanning with real-time progress<\/li>\n<li>Domain filter with Only \/ Except toggle<\/li>\n<li>Reason filter chips<\/li>\n<li>Excluded emails whitelist<\/li>\n<li>CSV export<\/li>\n<li>DGN Webs Spam User Cleaner add-on integration (disposable domains, MX validation, role-based detection)<\/li>\n<\/ul>","raw_excerpt":"Intelligently scan and bulk-remove spam user accounts from your WordPress site using a multi-signal scoring engine.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/301140","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=301140"}],"author":[{"embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/dgnwebs"}],"wp:attachment":[{"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=301140"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=301140"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=301140"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=301140"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=301140"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/test.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=301140"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}