{"id":377492,"date":"2026-09-28T16:49:10","date_gmt":"2026-09-28T16:49:10","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/fruti-media-integrity-audit\/"},"modified":"2026-09-28T16:41:34","modified_gmt":"2026-09-28T16:41:34","slug":"fruti-media-integrity-audit","status":"publish","type":"plugin","link":"https:\/\/ru.wordpress.org\/plugins\/fruti-media-integrity-audit\/","author":23575675,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.0","stable_tag":"1.0.0","tested":"7.1.2","requires":"6.0","requires_php":"8.1","requires_plugins":null,"header_name":"Fruti Media Integrity Audit","header_author":"Fruti Labs","header_description":"Read-only report of Media Library files missing from disk and uploads files that no attachment claims. Never deletes, moves, imports or repairs anything.","assets_banners_color":"0d282f","last_updated":"2026-09-28 16:41:34","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":39,"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":"frutilabs","date":"2026-09-28 16:41:34","revision":3717601}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3717601,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3717601,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3717601,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3717601,"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":3717601,"resolution":"1","location":"assets","locale":"","width":1440,"height":1100},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3717601,"resolution":"2","location":"assets","locale":"","width":1440,"height":900}},"screenshots":{"1":"The audit result for one scanned window: totals for missing files, orphan candidates, unknown files and derived variants.","2":"The two conservative groups in detail: files WordPress expects but cannot find on disk, and files no attachment claims, with unknown files kept separate."}},"plugin_section":[],"plugin_tags":[23519,88,84,3972,85],"plugin_category":[50,59],"plugin_contributors":[283185],"plugin_business_model":[],"class_list":["post-377492","plugin","type-plugin","status-publish","hentry","plugin_tags-diagnostics","plugin_tags-files","plugin_tags-media","plugin_tags-tools","plugin_tags-uploads","plugin_category-media","plugin_category-utilities-and-tools","plugin_contributors-frutilabs","plugin_committers-frutilabs"],"banners":{"banner":"https:\/\/ps.w.org\/fruti-media-integrity-audit\/assets\/banner-772x250.png?rev=3717601","banner_2x":"https:\/\/ps.w.org\/fruti-media-integrity-audit\/assets\/banner-1544x500.png?rev=3717601","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/fruti-media-integrity-audit\/assets\/icon-128x128.png?rev=3717601","icon_2x":"https:\/\/ps.w.org\/fruti-media-integrity-audit\/assets\/icon-256x256.png?rev=3717601","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/fruti-media-integrity-audit\/assets\/screenshot-1.png?rev=3717601","caption":"The audit result for one scanned window: totals for missing files, orphan candidates, unknown files and derived variants."},{"src":"https:\/\/ps.w.org\/fruti-media-integrity-audit\/assets\/screenshot-2.png?rev=3717601","caption":"The two conservative groups in detail: files WordPress expects but cannot find on disk, and files no attachment claims, with unknown files kept separate."}],"raw_content":"<!--section=description-->\n<p>Fruti Media Integrity Audit compares your Media Library with the files that actually exist in your uploads\ndirectory and shows two things:<\/p>\n\n<ul>\n<li><strong>Missing files<\/strong> - attachments, including the image sizes recorded in their metadata, that\nWordPress expects to exist but that are absent from the local filesystem.<\/li>\n<li><strong>Orphan candidates<\/strong> - files present in the uploads tree that no attachment metadata claims.<\/li>\n<\/ul>\n\n<p>It is a diagnostic. It never deletes, moves, renames, imports, regenerates or repairs anything, it\ndoes not modify attachment metadata, and it writes nothing to your database.<\/p>\n\n<p>The plugin is deliberately conservative. A file is only reported as an orphan candidate when its own\ndirectory is already referenced by an attachment from the current scan window. Everything else is\nlisted as <em>unknown \/ not classified<\/em> instead of being called orphaned, because a wrong \"orphan\" label\nis worse than no label.<\/p>\n\n<p>Useful after a migration, a backup restore, a host move or an offload\/CDN change, and as a sanity\ncheck before running any cleanup tool.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code>, or install the ZIP through\nPlugins -&gt; Add New -&gt; Upload Plugin.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Go to Tools -&gt; Fruti Media Integrity Audit and press \"Run audit\".<\/li>\n<\/ol>\n\n<h4>How to use it<\/h4>\n\n<ol>\n<li>Open Tools -&gt; Fruti Media Integrity Audit.<\/li>\n<li>Press <strong>Run audit<\/strong>. The plugin checks the attachment window and scans the uploads window you\nconfigure on the same screen.<\/li>\n<li>Read the two result groups. Missing files are checked exactly: WordPress metadata says the file\nshould exist and it does not.<\/li>\n<li>If the notice says the file scan hit its per-run limit, the window is partial - raise the file\noffset and run again to inspect the rest.<\/li>\n<li>Press <strong>Download CSV for this window<\/strong> to export the current results. The CSV is generated on the\nfly and is never stored.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20plugin%20delete%20or%20fix%20anything%3F\"><h3>Does this plugin delete or fix anything?<\/h3><\/dt>\n<dd><p>No. It is strictly read-only: no deletion, no import, no thumbnail regeneration, no metadata change,\nno automatic repair. Fixing is a decision you make with another tool, after reading this report.<\/p><\/dd>\n<dt id=\"can%20it%20see%20files%20outside%20my%20uploads%20directory%3F\"><h3>Can it see files outside my uploads directory?<\/h3><\/dt>\n<dd><p>No. It only inspects the uploads tree that WordPress itself reports, it never accepts a path from the\nbrowser, and symlinks are not traversed.<\/p><\/dd>\n<dt id=\"why%20are%20some%20files%20listed%20as%20%22unknown%22%20instead%20of%20orphaned%3F\"><h3>Why are some files listed as \"unknown\" instead of orphaned?<\/h3><\/dt>\n<dd><p>Because the plugin refuses to guess. If a file's directory is not referenced by any attachment in the\ncurrent window, the plugin cannot tell whether the file is unused or simply belongs to a part of the\nlibrary outside this window, so it reports it as unknown.<\/p><\/dd>\n<dt id=\"what%20happens%20on%20very%20large%20media%20libraries%3F\"><h3>What happens on very large media libraries?<\/h3><\/dt>\n<dd><p>Each run is bounded: a limited number of attachments and files are processed per run, nothing is\nloaded into memory in full, and the screen tells you when the window was partial so you can continue\nmanually. There is no background job and no cron.<\/p><\/dd>\n<dt id=\"privacy\"><h3>Privacy<\/h3><\/dt>\n<dd><p>Everything runs locally inside your own admin request. Filenames, paths and results are never\nuploaded, never sent to any external service, never logged and never stored in the database. The\nplugin makes no network requests and collects no telemetry.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release: a read-only Media Library to local uploads integrity audit with missing-file and\nconservative orphan-candidate reporting, bounded manual scanning, and CSV export for the current window.<\/li>\n<\/ul>","raw_excerpt":"Read-only report of Media Library files missing from disk and uploads files that no attachment claims.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/377492","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=377492"}],"author":[{"embeddable":true,"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/frutilabs"}],"wp:attachment":[{"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=377492"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=377492"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=377492"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=377492"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=377492"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ru.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=377492"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}