{"id":288883,"date":"2026-04-05T17:04:31","date_gmt":"2026-04-05T17:04:31","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/hoatzinmedia-smart-media-cleaner-storage-optimizer\/"},"modified":"2026-04-24T12:31:46","modified_gmt":"2026-04-24T12:31:46","slug":"hoatzinmedia-library-cleaner","status":"publish","type":"plugin","link":"https:\/\/fy.wordpress.org\/plugins\/hoatzinmedia-library-cleaner\/","author":21148997,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"1.2.0","stable_tag":"1.2.0","tested":"6.9.4","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"HoatzinMedia \u2014 Media Cleaner & Storage Optimizer","header_author":"Hoatzinlabs","header_description":"Smart media library cleaner and storage optimizer with scan history and trash management.","assets_banners_color":"c8c7b6","last_updated":"2026-04-24 12:31:46","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/hoatzinlabs.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":161,"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":"wpfeaturekits22","date":"2026-04-05 17:04:01"},"1.2.0":{"tag":"1.2.0","author":"wpfeaturekits22","date":"2026-04-24 12:31:46"}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.jpeg":{"filename":"icon-128x128.jpeg","revision":3499236,"resolution":"128x128","location":"assets","locale":""},"icon-128x128.png":{"filename":"icon-128x128.png","revision":3514636,"resolution":"128x128","location":"assets","locale":""},"icon-256x256.jpeg":{"filename":"icon-256x256.jpeg","revision":3499236,"resolution":"256x256","location":"assets","locale":""},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3514636,"resolution":"256x256","location":"assets","locale":""}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3514636,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3514636,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.2.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3514636,"resolution":"1","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3514636,"resolution":"2","location":"assets","locale":""},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3514636,"resolution":"3","location":"assets","locale":""},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3514636,"resolution":"4","location":"assets","locale":""},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3514636,"resolution":"5","location":"assets","locale":""}},"screenshots":{"1":"Unused media scanner with progress and badges","2":"Module enable\/disable panel","3":"Convert images to webp\/avif panel","4":"Regenerate thumbnails panel","5":"Duplicates checker panel"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[260999,249014,247,2216,219749],"plugin_category":[50,52,54],"plugin_contributors":[224906],"plugin_business_model":[],"class_list":["post-288883","plugin","type-plugin","status-publish","hentry","plugin_tags-cleanup-media","plugin_tags-convert-to-webp","plugin_tags-performance","plugin_tags-storage","plugin_tags-unused-media","plugin_category-media","plugin_category-performance","plugin_category-security-and-spam-protection","plugin_contributors-wpfeaturekits22","plugin_committers-wpfeaturekits22"],"banners":{"banner":"https:\/\/ps.w.org\/hoatzinmedia-library-cleaner\/assets\/banner-772x250.png?rev=3514636","banner_2x":"https:\/\/ps.w.org\/hoatzinmedia-library-cleaner\/assets\/banner-1544x500.png?rev=3514636","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/hoatzinmedia-library-cleaner\/assets\/icon-128x128.png?rev=3514636","icon_2x":"https:\/\/ps.w.org\/hoatzinmedia-library-cleaner\/assets\/icon-256x256.png?rev=3514636","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/hoatzinmedia-library-cleaner\/assets\/screenshot-1.png?rev=3514636","caption":"Unused media scanner with progress and badges"},{"src":"https:\/\/ps.w.org\/hoatzinmedia-library-cleaner\/assets\/screenshot-2.png?rev=3514636","caption":"Module enable\/disable panel"},{"src":"https:\/\/ps.w.org\/hoatzinmedia-library-cleaner\/assets\/screenshot-3.png?rev=3514636","caption":"Convert images to webp\/avif panel"},{"src":"https:\/\/ps.w.org\/hoatzinmedia-library-cleaner\/assets\/screenshot-4.png?rev=3514636","caption":"Regenerate thumbnails panel"},{"src":"https:\/\/ps.w.org\/hoatzinmedia-library-cleaner\/assets\/screenshot-5.png?rev=3514636","caption":"Duplicates checker panel"}],"raw_content":"<!--section=description-->\n<p>HoatzinMedia is a WordPress media cleaner and storage optimizer that helps you reclaim disk space and improve site performance by identifying unused attachments, oversized uploads, and storage pressure signals. It includes a clear dashboard, a reversible trash workflow, and batch-based scanning designed for large media libraries.<\/p>\n\n<p>Benefits:<\/p>\n\n<ol>\n<li>Reduce storage usage by finding unused and heavy media files<\/li>\n<li>Improve WordPress performance by keeping uploads lean and organized<\/li>\n<li>Delete with confidence using a safe trash table with restore support<\/li>\n<li>Scale to large sites with batch processing and scan locking<\/li>\n<\/ol>\n\n<h3>Modules<\/h3>\n\n<ol>\n<li><p>Dashboard<\/p>\n\n<ul>\n<li>What it does: Shows media health score, server\/storage signals, and library breakdowns.<\/li>\n<li>REST endpoints: GET \/wp-json\/hoatzinmedia\/v1\/dashboard, GET \/wp-json\/hoatzinmedia\/v1\/dashboard\/uploads-breakdown<\/li>\n<li>Hook points: Refreshes automatically after content changes via save_post cache bump; scan completion clears the dashboard transient.<\/li>\n<\/ul><\/li>\n<li><p>Smart Scan &amp; Unused Media<\/p>\n\n<ul>\n<li>What it does: Batch-based scanning to detect unused attachments, then review and delete safely.<\/li>\n<li>REST endpoints: POST \/wp-json\/hoatzinmedia\/v1\/scan, GET \/wp-json\/hoatzinmedia\/v1\/unused-results, POST \/wp-json\/hoatzinmedia\/v1\/delete-unused, POST \/wp-json\/hoatzinmedia\/v1\/delete-unused-all<\/li>\n<li>Hook points: WP-Cron action hoatzinmedia_scheduled_scan runs a full scan when scheduling is enabled; the scanner uses posts_where during content search to reduce query overhead.<\/li>\n<\/ul><\/li>\n<li><p>Large Files Explorer<\/p>\n\n<ul>\n<li>What it does: Lists media files over a size threshold so you can quickly reclaim space.<\/li>\n<li>REST endpoints: GET \/wp-json\/hoatzinmedia\/v1\/large-files?size=1|3|5 (MB threshold)<\/li>\n<\/ul><\/li>\n<li><p>Duplicate Checker<\/p>\n\n<ul>\n<li>What it does: Finds likely duplicate attachments and helps you validate before removal.<\/li>\n<li>REST endpoints: GET \/wp-json\/hoatzinmedia\/v1\/duplicates, GET \/wp-json\/hoatzinmedia\/v1\/attachment-usage?attachment_id=123<\/li>\n<li>Hook points: Adds Media Library UI enhancements via manage_upload_columns, manage_media_columns, and manage_media_custom_column.<\/li>\n<\/ul><\/li>\n<li><p>Convert to WebP \/ AVIF<\/p>\n\n<ul>\n<li>What it does: Converts images to modern formats (WebP\/AVIF) and manages converted variants.<\/li>\n<li>REST endpoints:\n\n<ul>\n<li>Settings: GET\/POST \/wp-json\/hoatzinmedia\/v1\/converter-settings, GET \/wp-json\/hoatzinmedia\/v1\/converter-settings\/scan<\/li>\n<li>Converter: \/wp-json\/hoatzinmedia\/v1\/image-formats\/library, \/image-formats\/convert, \/image-formats\/background, \/image-formats\/background\/status, \/image-formats\/background\/log, \/image-formats\/background\/cancel, \/image-formats\/background\/pause, \/image-formats\/background\/resume, \/image-formats\/delete<\/li>\n<\/ul><\/li>\n<li>Hook points: add_attachment can auto-convert new JPEG\/PNG uploads based on settings; delete_attachment cleans up converted variants; background jobs run on the hoatzinmedia_convert_job_run action.<\/li>\n<\/ul><\/li>\n<li><p>Regenerate Thumbnails<\/p>\n\n<ul>\n<li>What it does: Rebuilds WordPress image sizes for selected attachments (useful after theme changes).<\/li>\n<li>REST endpoints: GET \/wp-json\/hoatzinmedia\/v1\/regenerate\/library, GET \/wp-json\/hoatzinmedia\/v1\/regenerate\/sizes, POST \/wp-json\/hoatzinmedia\/v1\/regenerate, plus background endpoints under \/regenerate\/background\/*<\/li>\n<li>Hook points: Background jobs run on the hoatzinmedia_regenerate_job_run action.<\/li>\n<\/ul><\/li>\n<li><p>Modules &amp; Settings<\/p>\n\n<ul>\n<li>What it does: Enables\/disables features and stores global plugin settings.<\/li>\n<li>REST endpoints: GET\/POST \/wp-json\/hoatzinmedia\/v1\/modules, GET\/POST \/wp-json\/hoatzinmedia\/v1\/settings, GET \/wp-json\/hoatzinmedia\/v1\/status<\/li>\n<li>Hook points: admin_menu registers the HoatzinMedia admin pages; init ensures scan scheduling and updates WebP serving rules when enabled.<\/li>\n<\/ul><\/li>\n<li><p>SVG Upload Support (optional)<\/p>\n\n<ul>\n<li>What it does: Allows SVG uploads with sanitization safeguards (including Elementor compatibility).<\/li>\n<li>Hook points: upload_mimes, wp_check_filetype_and_ext, wp_handle_upload_prefilter, wp_handle_sideload_prefilter, elementor\/files\/allow_unfiltered_upload, elementor\/files\/allow-file-type\/svg<\/li>\n<\/ul><\/li>\n<\/ol>\n\n<p>Core features:<\/p>\n\n<ol>\n<li>Dashboard with media health score and live metrics<\/li>\n<li>Unused media scanner with batch processing and locking<\/li>\n<li>Safe trash table for reversible deletions<\/li>\n<li>Large file explorer by size threshold<\/li>\n<li>Translation-ready UI and REST responses<\/li>\n<\/ol>\n\n<h3>Usage<\/h3>\n\n<ol>\n<li>Review the media health score and high-level stats on the dashboard.<\/li>\n<li>Run an unused media scan from the Unused media scanner panel.<\/li>\n<li>Inspect results and move files to the HoatzinMedia trash.<\/li>\n<li>Use the large file explorer to identify heavy attachments by size.<\/li>\n<\/ol>\n\n<!--section=installation-->\n<ol>\n<li>Upload the hoatzinmedia-library-cleaner folder to the \/wp-content\/plugins\/ directory.<\/li>\n<li>Activate HoatzinMedia through the Plugins menu in WordPress.<\/li>\n<li>Open the HoatzinMedia page under the main admin menu.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20hoatzinmedia%20delete%20files%20immediately%3F\"><h3>Does HoatzinMedia delete files immediately?<\/h3><\/dt>\n<dd><p>No. By default, deletions use a custom HoatzinMedia trash table so items can be restored before permanent removal.<\/p><\/dd>\n<dt id=\"is%20it%20safe%20on%20large%20libraries%3F\"><h3>Is it safe on large libraries?<\/h3><\/dt>\n<dd><p>Yes. Scans run in batches with locking to avoid concurrent runs and to keep requests small.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.0<\/h4>\n\n<p>Updated the UI\/UX\nFixes convert functionality issues\nMaintenance release with improvements and fixes.<\/p>\n\n<h4>1.0.0<\/h4>\n\n<p>Initial release.<\/p>","raw_excerpt":"Smart media cleaner: detect unused files, duplicates and large attachments; optimize storage safely.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/fy.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/288883","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fy.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/fy.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/fy.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=288883"}],"author":[{"embeddable":true,"href":"https:\/\/fy.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/wpfeaturekits22"}],"wp:attachment":[{"href":"https:\/\/fy.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=288883"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/fy.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=288883"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/fy.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=288883"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/fy.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=288883"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/fy.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=288883"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/fy.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=288883"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}