{"id":347917,"date":"2026-08-19T08:02:12","date_gmt":"2026-08-19T08:02:12","guid":{"rendered":"https:\/\/es.wordpress.org\/plugins\/site-integrity-profiler\/"},"modified":"2026-08-19T09:01:55","modified_gmt":"2026-08-19T09:01:55","slug":"sysadmin-total-suite","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/sysadmin-total-suite\/","author":23540719,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"5.2","stable_tag":"5.2","tested":"7.0.4","requires":"5.3","requires_php":"7.4","requires_plugins":null,"header_name":"Sysadmin Total Suite","header_author":"Ricardo Morales","header_description":"Core integrity checks, load-time profiling, user review, performance (WPO) diagnostics and AI bot blocking in a single admin panel.","assets_banners_color":"39454f","last_updated":"2026-08-19 09:01:55","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/github.com\/Ricardo-AlterTable","rating":0,"author_block_rating":0,"active_installs":0,"downloads":35,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"5.2":{"tag":"5.2","author":"ricardomorales","date":"2026-08-19 09:01:55"}},"upgrade_notice":{"5.0":"<p>The integrity section becomes a read-only report; file restore, backups and extra file deletion have been removed.<\/p>","4.2":"<p>Renaming and compliance changes requested by the plugin review team.<\/p>","4.1":"<p>Documentation and clearer warnings. No change in behaviour.<\/p>","3.9":"<p>Compliance fixes for the plugin directory review. No change in behaviour.<\/p>","3.6":"<p>Recommended security update: fixes a stored XSS in the diff viewer and hardens several destructive operations.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3654130,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3654130,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3654130,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3654130,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["5.2"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"Core integrity: analysis result plus modified and extra files.","2":"Profiling: last measurement and history charts.","3":"WPO: plugins, autoloaded options, WP-Cron, cache and versions.","4":"AI bot blocking: per-bot selection."}},"plugin_section":[],"plugin_tags":[264107,173015,247,23044,600],"plugin_category":[54],"plugin_contributors":[276440],"plugin_business_model":[],"class_list":["post-347917","plugin","type-plugin","status-publish","hentry","plugin_tags-ai-bots","plugin_tags-integrity","plugin_tags-performance","plugin_tags-profiling","plugin_tags-security","plugin_category-security-and-spam-protection","plugin_contributors-ricardomorales","plugin_committers-ricardomorales"],"banners":{"banner":"https:\/\/ps.w.org\/sysadmin-total-suite\/assets\/banner-772x250.png?rev=3654130","banner_2x":"https:\/\/ps.w.org\/sysadmin-total-suite\/assets\/banner-1544x500.png?rev=3654130","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/sysadmin-total-suite\/assets\/icon-128x128.png?rev=3654130","icon_2x":"https:\/\/ps.w.org\/sysadmin-total-suite\/assets\/icon-256x256.png?rev=3654130","generated":false},"screenshots":[],"raw_content":"<!--section=description-->\n<p>This plugin brings together several maintenance tools for WordPress in one admin panel:<\/p>\n\n<ul>\n<li><strong>Core integrity<\/strong>: verifies your WordPress files against the official checksums and reports which ones are modified, missing or not part of the core. For a modified file it can show a diff against the official copy, so you can see exactly what changed. The plugin never modifies your files: to repair the core it points you to Dashboard &gt; Updates &gt; Reinstall now, which is WordPress's own mechanism.<\/li>\n<li><strong>Profiling<\/strong>: measures the front page load time (core, plugins, theme, SQL and outgoing HTTP calls), keeps a history and displays it as charts.<\/li>\n<li><strong>Check users<\/strong>: lists the registered users (name, registration date, role) and lets you delete them with a double confirmation.<\/li>\n<li><strong>WPO (Web Performance Optimization)<\/strong>: active plugins, size of the autoloaded options, expired transients, WP-Cron status including cleanup of orphaned tasks, cache detection and environment versions (PHP, MySQL\/MariaDB, WordPress).<\/li>\n<li><strong>AI bot blocking<\/strong>: robots.txt opt-out plus real User-Agent blocking (HTTP 403) for AI crawlers, selectable bot by bot.<\/li>\n<\/ul>\n\n<p>Every action requires administrator capabilities and is protected with nonces. The plugin does not write to or delete anything inside the WordPress core directories. The operations that do change something (deleting a user, clearing expired transients, removing orphaned cron tasks, blocking a bot) act on the database and always ask for confirmation first.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to WordPress.org services in order to verify and restore the core:<\/p>\n\n<ol>\n<li>WordPress.org checksums API (<code>https:\/\/api.wordpress.org\/core\/checksums\/1.0\/<\/code>): queried when you run the integrity analysis, to obtain the official checksums for your version and locale. The WordPress version and the site locale are sent.<\/li>\n<li>WordPress.org downloads (<code>https:\/\/downloads.wordpress.org\/<\/code> and the localized sites <code>https:\/\/*.wordpress.org\/<\/code>): the official ZIP package for your version is downloaded only when you ask to see the differences (diff) or to restore a core file. The version and locale are sent to build the package URL.<\/li>\n<\/ol>\n\n<p>No personal data is sent and no other third-party service is contacted. These services are provided by the WordPress Foundation; see https:\/\/wordpress.org\/about\/privacy\/ for details.<\/p>\n\n<p>The official package is used <strong>only<\/strong> as the reference copy of the core, exactly as WordPress itself does when it reinstalls or updates the core. No code is fetched from any third-party server, nothing is executed from the download, and the extracted content is only ever written back to the same core path it came from.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code> or install it from your WordPress dashboard.<\/li>\n<li>Activate the plugin through the Plugins menu.<\/li>\n<li>Open the plugin menu and its sections: Integrity, Profiling, Check users, WPO and AI bot blocking.<\/li>\n<\/ol>\n\n<p>Optional: to measure the SQL query time in the Profiling section, add <code>define('SAVEQUERIES', true);<\/code> to <code>wp-config.php<\/code>. Leaving it permanently enabled in production is not recommended because of its overhead.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20the%20plugin%20modify%20any%20file%3F\"><h3>Does the plugin modify any file?<\/h3><\/dt>\n<dd><p>No. It does not write to or delete any file inside <code>wp-admin<\/code>, <code>wp-includes<\/code> or the site root. The integrity section is a read-only report: it tells you which core files differ from the official ones and can show you the diff, but repairing them is left to WordPress itself through Dashboard &gt; Updates &gt; Reinstall now.<\/p>\n\n<p>The only thing the plugin writes is the cached copy of the official package, stored in its own folder inside the uploads directory (resolved at runtime with <code>wp_upload_dir()<\/code>), protected against direct access and removed when you purge the cache or uninstall the plugin.<\/p><\/dd>\n<dt id=\"does%20the%20plugin%20allow%20arbitrary%20code%20to%20be%20inserted%20or%20executed%3F\"><h3>Does the plugin allow arbitrary code to be inserted or executed?<\/h3><\/dt>\n<dd><p>No. It contains no PHP or JavaScript editor, no file manager, no upload form and no field where code can be entered. It never calls <code>eval()<\/code>, <code>base64_decode()<\/code>, <code>exec()<\/code> or any dynamic include, and it does not generate or execute code.<\/p><\/dd>\n<dt id=\"why%20does%20the%20plugin%20download%20a%20zip%20from%20wordpress.org%3F\"><h3>Why does the plugin download a ZIP from WordPress.org?<\/h3><\/dt>\n<dd><p>To show a real diff, the original file is needed. The plugin downloads the official package for your exact version and locale from WordPress.org \u2014 the same source WordPress itself uses \u2014 and reads the single file being compared straight out of it. Nothing from the download is executed and nothing is written outside the uploads cache.<\/p><\/dd>\n<dt id=\"does%20it%20require%20any%20php%20extension%3F\"><h3>Does it require any PHP extension?<\/h3><\/dt>\n<dd><p>Yes, the ZipArchive extension is needed to show differences and to restore core files from the official package.<\/p><\/dd>\n<dt id=\"why%20does%20mysql%20show%20as%20n%2Fa%20in%20the%20profiling%20section%3F\"><h3>Why does MySQL show as N\/A in the Profiling section?<\/h3><\/dt>\n<dd><p>The query time is only available when the <code>SAVEQUERIES<\/code> constant is enabled. The number of queries and the remaining timings are shown regardless.<\/p><\/dd>\n<dt id=\"a%20core%20file%20is%20reported%20as%20modified%20but%20i%20have%20not%20touched%20anything\"><h3>A core file is reported as modified but I have not touched anything<\/h3><\/dt>\n<dd><p>Some sites run the international WordPress package while their locale is set to another language. In that case a few files (for example <code>wp-includes\/version.php<\/code>, which carries <code>$wp_local_package<\/code> in translated packages) differ from the localized checksums without anything being wrong. The plugin compares against the international package as well before reporting a file, so this no longer produces a false positive.<\/p><\/dd>\n<dt id=\"the%20page%20cache%20shows%20as%20not%20enabled%2C%20but%20i%20use%20litespeed\"><h3>The page cache shows as not enabled, but I use LiteSpeed<\/h3><\/dt>\n<dd><p>LiteSpeed caches at server level and does not use <code>WP_CACHE<\/code> or <code>advanced-cache.php<\/code>. The plugin detects that case and shows its real status; you can confirm it with the <code>x-litespeed-cache: hit<\/code> response header.<\/p><\/dd>\n<dt id=\"is%20user-agent%20blocking%20foolproof%3F\"><h3>Is User-Agent blocking foolproof?<\/h3><\/dt>\n<dd><p>No. The User-Agent can be spoofed, which is why the 403 blocking complements, but does not replace, the robots.txt opt-out.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>5.2<\/h4>\n\n<ul>\n<li>Fixed a false positive: a site running the international WordPress package while using a translated locale reported core files such as wp-includes\/version.php as modified. Files are now also compared against the international package before being flagged.<\/li>\n<\/ul>\n\n<h4>5.1<\/h4>\n\n<ul>\n<li>Prefixed the variables used by the admin views so that static analysis no longer reports them as unprefixed globals.<\/li>\n<\/ul>\n\n<h4>5.0<\/h4>\n\n<ul>\n<li>The integrity section is now a read-only report. Following the plugin review team's feedback, the plugin no longer writes to or deletes anything inside the WordPress core directories: restoring files, restoring from a backup, the backup manager and the removal of extra files have all been removed.<\/li>\n<li>When core issues are found, the plugin now links to Dashboard &gt; Updates &gt; Reinstall now, which is WordPress's own repair mechanism.<\/li>\n<\/ul>\n\n<h4>4.2<\/h4>\n\n<ul>\n<li>Renamed the plugin and prefixed every function, global, constant, option, transient, AJAX action and nonce with a unique plugin prefix.<\/li>\n<li>All inline scripts moved to enqueued files, with data passed through wp_localize_script().<\/li>\n<li>Updated the bundled Chart.js library to the latest stable release.<\/li>\n<li>Removed the load_plugin_textdomain() call and the bundled translation files: translations are handled by translate.wordpress.org.<\/li>\n<li>The top level admin menu no longer uses a prominent position.<\/li>\n<\/ul>\n\n<h4>4.1<\/h4>\n\n<ul>\n<li>Documented in detail how the official package is used and which files can be written or deleted, and added a clearer warning when restoring from a backup: a backup reproduces the file as it was, so it does not guarantee clean content the way the official package does.<\/li>\n<\/ul>\n\n<h4>4.0<\/h4>\n\n<ul>\n<li>Remaining Plugin Check fixes and renamed the plugin so that its name and slug no longer contain restricted terms.<\/li>\n<\/ul>\n\n<h4>3.9<\/h4>\n\n<ul>\n<li>Compliance with the Plugin Check tool: translator comments for every string with placeholders, output escaping, WordPress filesystem API instead of direct calls, prepared LIKE wildcards, <code>wp_safe_redirect()<\/code> and sanitized server variables.<\/li>\n<li>Removed a pointless database query that was only used to time itself.<\/li>\n<li>The readme is now written in English, as required by the plugin directory.<\/li>\n<\/ul>\n\n<h4>3.8<\/h4>\n\n<ul>\n<li>New backup manager in the Integrity section: lists backups with their date and time, restores individual files from a backup and deletes backups individually, per batch or all at once.<\/li>\n<li>Backups saved by earlier versions in the site root are detected too, with a warning that this location is web-accessible.<\/li>\n<\/ul>\n\n<h4>3.7<\/h4>\n\n<ul>\n<li>Fixed: the Profiling \"Run test\" button did not record measurements, because the signed URL was generated with <code>esc_js()<\/code>, which turns the ampersand into an HTML entity and broke the query string, so the nonce never reached the server.<\/li>\n<\/ul>\n\n<h4>3.6<\/h4>\n\n<ul>\n<li>Security (important): the diff viewer no longer renders the analyzed file content as HTML. Previously, a tampered core file containing JavaScript could execute it in the admin panel when clicking \"Show changes\" (stored XSS).<\/li>\n<li>Backups use a randomized folder name and a neutralized extension; the ZIP cache is protected against direct access.<\/li>\n<li>The profiling test now requires a nonce and capabilities: any visitor could previously force database writes while bypassing the page cache.<\/li>\n<li>Path validation now runs after normalization; cron tasks are backed up before removal; user deletion uses the <code>delete_user<\/code> meta capability.<\/li>\n<li>Hidden and configuration files in the site root are no longer flagged as extra, avoiding accidental deletion of <code>.user.ini<\/code>, <code>ads.txt<\/code>, search engine verification files and similar.<\/li>\n<li>Robustness: the official ZIP is opened once per request and limits are raised for long operations.<\/li>\n<\/ul>\n\n<h4>3.5<\/h4>\n\n<ul>\n<li>Hardened path resolution, restore and diff limited to core paths, and backups moved to the uploads folder with access protection.<\/li>\n<li>Fixed: restoring files reported as missing always failed.<\/li>\n<li>Added <code>uninstall.php<\/code> to clean options, transients and cache on uninstall.<\/li>\n<\/ul>\n\n<h4>3.4<\/h4>\n\n<ul>\n<li>Prepared for the plugin directory: readme, headers and Chart.js bundled locally instead of loaded from a CDN. Internationalization with English as the base language and a Spanish translation included.<\/li>\n<\/ul>\n\n<h4>3.0 - 3.3<\/h4>\n\n<ul>\n<li>AI bot blocking with an Allow\/Block toggle per bot.<\/li>\n<li>Redesigned interface as a modern control panel.<\/li>\n<li>Renamed the Tunning section to WPO.<\/li>\n<\/ul>\n\n<h4>2.0 - 2.9<\/h4>\n\n<ul>\n<li>New sections: Check users, WPO (performance, wp_options, WP-Cron, cache) and AI bot blocking.<\/li>\n<li>Optional backup when restoring; deletion of extra files.<\/li>\n<\/ul>\n\n<h4>1.6 - 1.9<\/h4>\n\n<ul>\n<li>Integrity limited to the real core; locale alignment in diff and restore; nonce and interface fixes.<\/li>\n<\/ul>","raw_excerpt":"Core integrity checks, load-time profiling, user review, performance diagnostics and AI bot blocking in a single admin panel.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/347917","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=347917"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/ricardomorales"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=347917"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=347917"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=347917"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=347917"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=347917"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=347917"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}