{"id":356877,"date":"2026-09-01T03:42:18","date_gmt":"2026-09-01T03:42:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/code-guardian\/"},"modified":"2026-09-01T04:09:15","modified_gmt":"2026-09-01T04:09:15","slug":"milardovich-file-modification-monitor","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/milardovich-file-modification-monitor\/","author":1806484,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1","requires":"5.0","requires_php":"8.3","requires_plugins":null,"header_name":"Milardovich File Modification Monitor","header_author":"Sergio Milardovich","header_description":"Detects local code modifications in installed plugins and themes by comparing files against pristine copies from WordPress.org, and warns before updates would overwrite them.","assets_banners_color":"11181d","last_updated":"2026-09-01 04:09:15","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/milardovich.com.ar\/wordpress\/","header_author_uri":"https:\/\/milardovich.com.ar","rating":0,"author_block_rating":0,"active_installs":0,"downloads":51,"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":"milardovich","date":"2026-09-01 04:09:15","revision":3675235}},"upgrade_notice":{"1.0.0":"<p>Initial release.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3675217,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3675217,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256},"icon.svg":{"filename":"icon.svg","revision":3675217,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3675217,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3675217,"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":3675217,"resolution":"1","location":"assets","locale":"","width":2880,"height":1580},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3675217,"resolution":"2","location":"assets","locale":"","width":2880,"height":1570},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3675217,"resolution":"3","location":"assets","locale":"","width":2880,"height":1566},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3675217,"resolution":"4","location":"assets","locale":"","width":2880,"height":1576},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3675217,"resolution":"5","location":"assets","locale":"","width":2880,"height":1566}},"screenshots":{"1":"The dashboard: baseline and modification counters, with inline help explaining what a baseline is.","2":"The Plugin Changes screen, listing each plugin's status and the actions available for it.","3":"The diff viewer, showing exactly what changed and offering to keep the changes or restore the original files.","4":"Settings: scan frequency, notifications, ignored file patterns and maintenance actions.","5":"The Theme Changes screen with the diff viewer open on a modified theme."}},"plugin_section":[],"plugin_tags":[278561,168808,2391,600,1249],"plugin_category":[43,54],"plugin_contributors":[79325],"plugin_business_model":[],"class_list":["post-356877","plugin","type-plugin","status-publish","hentry","plugin_tags-code-changes","plugin_tags-file-integrity","plugin_tags-plugins","plugin_tags-security","plugin_tags-themes","plugin_category-customization","plugin_category-security-and-spam-protection","plugin_contributors-milardovich","plugin_committers-milardovich"],"banners":{"banner":"https:\/\/ps.w.org\/milardovich-file-modification-monitor\/assets\/banner-772x250.png?rev=3675217","banner_2x":"https:\/\/ps.w.org\/milardovich-file-modification-monitor\/assets\/banner-1544x500.png?rev=3675217","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/milardovich-file-modification-monitor\/assets\/icon.svg?rev=3675217","icon":"https:\/\/ps.w.org\/milardovich-file-modification-monitor\/assets\/icon.svg?rev=3675217","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/milardovich-file-modification-monitor\/assets\/screenshot-1.png?rev=3675217","caption":"The dashboard: baseline and modification counters, with inline help explaining what a baseline is."},{"src":"https:\/\/ps.w.org\/milardovich-file-modification-monitor\/assets\/screenshot-2.png?rev=3675217","caption":"The Plugin Changes screen, listing each plugin's status and the actions available for it."},{"src":"https:\/\/ps.w.org\/milardovich-file-modification-monitor\/assets\/screenshot-3.png?rev=3675217","caption":"The diff viewer, showing exactly what changed and offering to keep the changes or restore the original files."},{"src":"https:\/\/ps.w.org\/milardovich-file-modification-monitor\/assets\/screenshot-4.png?rev=3675217","caption":"Settings: scan frequency, notifications, ignored file patterns and maintenance actions."},{"src":"https:\/\/ps.w.org\/milardovich-file-modification-monitor\/assets\/screenshot-5.png?rev=3675217","caption":"The Theme Changes screen with the diff viewer open on a modified theme."}],"raw_content":"<!--section=description-->\n<p>When someone edits a file directly inside <code>wp-content\/plugins\/<\/code> or <code>wp-content\/themes\/<\/code>, those changes are silently lost the next time the plugin or theme is updated. <strong>Milardovich File Modification Monitor<\/strong> detects those modifications before they cost you.<\/p>\n\n<p>It downloads the <strong>original<\/strong> copy of each plugin and theme from the official WordPress.org repository, stores a baseline (a SHA-256 hash of every file), and compares the files on your site against that baseline. Any drift \u2014 modified, added or deleted files \u2014 is flagged in the admin, and you are warned before an update would overwrite your customizations.<\/p>\n\n<h4>Key features<\/h4>\n\n<ul>\n<li><strong>Baselines from WordPress.org<\/strong> \u2014 the reference is the pristine, official release, not the files already on disk. That is what makes real drift detectable.<\/li>\n<li><strong>SHA-256 file comparison<\/strong> \u2014 fast, reliable detection of modified, new and deleted files.<\/li>\n<li><strong>Visual diff viewer<\/strong> \u2014 see exactly what changed, line by line, in unified or split view.<\/li>\n<li><strong>Inline admin warnings<\/strong> \u2014 modified plugins are flagged on the Plugins screen and modified themes get a badge on the Themes screen.<\/li>\n<li><strong>Update protection<\/strong> \u2014 a clear warning is shown before updating an item that has custom modifications, so changes are never lost unexpectedly.<\/li>\n<li><strong>Keep or revert<\/strong> \u2014 for any detected change, either adopt your edits as the new baseline or restore the original files from WordPress.org. Restoring is always confirmed first.<\/li>\n<li><strong>Automatic baseline refresh<\/strong> \u2014 after an authorized WordPress update, the baseline is regenerated automatically.<\/li>\n<li><strong>Configurable scan frequency<\/strong> \u2014 hourly, twice daily, daily, weekly or disabled.<\/li>\n<li><strong>Scans in the background<\/strong> \u2014 comparisons run on a scheduled WordPress cron event, never during a page load, so the admin stays responsive.<\/li>\n<li><strong>Optimized for large plugins<\/strong> \u2014 change detection compares SHA-256 hashes, so even very large plugins (thousands of files) are checked in about a second.<\/li>\n<\/ul>\n\n<h4>Use cases<\/h4>\n\n<ul>\n<li>Agencies and freelancers maintaining client sites who need to know whether anyone hand-edited a plugin.<\/li>\n<li>Site owners who want an early warning before an update wipes out a customization.<\/li>\n<li>Security-conscious admins who want a simple file-integrity check against the official source.<\/li>\n<\/ul>\n\n<p>This plugin connects to the WordPress.org Plugins and Themes APIs (api.wordpress.org) to download the original release files used as the comparison baseline.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin relies on the official WordPress.org APIs to obtain the pristine copies it compares your files against. Nothing else is contacted, and no data about your site is ever sent anywhere.<\/p>\n\n<ul>\n<li><strong>api.wordpress.org<\/strong> \u2014 queried to look up a plugin or theme and find the download URL for the installed version. The request contains only the public slug and version of that plugin or theme.<\/li>\n<li><strong>downloads.wordpress.org<\/strong> \u2014 the original release ZIP is downloaded from here, unpacked into the server's temporary directory, hashed, and then deleted.<\/li>\n<\/ul>\n\n<p>These requests happen only when a baseline is created or refreshed: when you run a scan, when you refresh a single baseline, or after WordPress updates a plugin or theme. No personal data, site URL, or usage statistics are transmitted, and the plugin sets no cookies and loads nothing on the front end.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>milardovich-file-modification-monitor<\/code> folder to the <code>\/wp-content\/plugins\/<\/code> directory, or install the plugin through the WordPress Plugins screen directly.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen in WordPress.<\/li>\n<li>Go to <strong>File Monitor<\/strong> in the admin menu and click <strong>Scan All Items<\/strong> to create your first baselines.<\/li>\n<li>Review detected changes from the <strong>Plugin Changes<\/strong> and <strong>Theme Changes<\/strong> screens, and adjust the scan frequency under <strong>File Monitor \u2192 Settings<\/strong>.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"where%20do%20the%20baselines%20come%20from%3F\"><h3>Where do the baselines come from?<\/h3><\/dt>\n<dd><p>From the official WordPress.org Plugins and Themes APIs. The plugin downloads the original release ZIP that matches the installed version and stores a hash of each file. Comparing against the pristine source \u2014 rather than the files already on disk \u2014 is what makes unauthorized changes detectable.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20premium%20or%20custom%20plugins%20and%20themes%3F\"><h3>Does it work with premium or custom plugins and themes?<\/h3><\/dt>\n<dd><p>Detection relies on the original being available on WordPress.org. For premium or custom items that are not hosted there, the plugin falls back to using the current files on disk as the baseline, so it can still detect changes made <em>after<\/em> the baseline was created.<\/p><\/dd>\n<dt id=\"will%20it%20slow%20down%20my%20admin%3F\"><h3>Will it slow down my admin?<\/h3><\/dt>\n<dd><p>No. The comparison runs in a background WordPress cron event, not while a page is loading. Admin screens only read the stored result of the last scan, so they render immediately regardless of how many plugins you have.<\/p><\/dd>\n<dt id=\"does%20it%20modify%20any%20of%20my%20files%3F\"><h3>Does it modify any of my files?<\/h3><\/dt>\n<dd><p>Only when you explicitly ask it to. By default the plugin only reads and compares files. If you choose <strong>Restore Original<\/strong> on a detected change, it writes the baseline copy back over those files on disk \u2014 overwriting your edits, recreating files you deleted and removing files you added. That action always asks for confirmation first and tells you how many files it will touch. Choosing <strong>Keep My Changes<\/strong> instead leaves every file untouched and simply records the current files as the new baseline.<\/p><\/dd>\n<dt id=\"can%20i%20undo%20a%20restore%3F\"><h3>Can I undo a restore?<\/h3><\/dt>\n<dd><p>No. Restoring overwrites the files on disk with the original version and cannot be reversed from within the plugin, so review the diff first and keep backups as you would for any file change.<\/p><\/dd>\n<dt id=\"what%20happens%20when%20i%20delete%20the%20plugin%3F\"><h3>What happens when I delete the plugin?<\/h3><\/dt>\n<dd><p>Its database tables, options and transients are removed automatically on uninstall, leaving no orphan data behind.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Baseline creation from WordPress.org for plugins and themes.<\/li>\n<li>SHA-256 based detection of modified, new and deleted files.<\/li>\n<li>Visual diff viewer with unified and split views.<\/li>\n<li>Keep-your-changes and restore-the-original actions for any detected change.<\/li>\n<li>Background scanning on a scheduled cron event, with a progress bar for batch scans.<\/li>\n<li>Inline admin flags and pre-update warnings.<\/li>\n<li>Automatic baseline refresh after authorized updates.<\/li>\n<li>Spanish translations (es_ES, es_AR).<\/li>\n<\/ul>","raw_excerpt":"Detect edits to your plugins and themes by comparing them against the original files from WordPress.org, and get warned before updates overwrite them.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/356877","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=356877"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/milardovich"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=356877"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=356877"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=356877"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=356877"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=356877"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=356877"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}