{"id":379133,"date":"2026-10-09T01:41:48","date_gmt":"2026-10-09T01:41:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/foldernest\/"},"modified":"2026-10-09T01:41:24","modified_gmt":"2026-10-09T01:41:24","slug":"plugnest-media-folders","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/plugnest-media-folders\/","author":23581769,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"2.5.4","stable_tag":"2.5.4","tested":"7.1.3","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"PlugNest Media Folders","header_author":"PlugNest","header_description":"Media library management: virtual folders (hierarchical, role-restricted), tags, batch editing, usage scanning, unused cleanup, missing-alt workflow, folder import\/export, in-page upload, and Elementor\/Gutenberg media modal integration. Never touches file paths.","assets_banners_color":"f46743","last_updated":"2026-10-09 01:41:24","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/media-folders.plugnest.dev\/","header_author_uri":"https:\/\/www.plugnest.dev\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":65,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"2.5.4":{"tag":"2.5.4","author":"plugnest","date":"2026-10-09 01:41:24","revision":3735763}},"upgrade_notice":{"2.5.4":"<p>Optional performance update: lighter admin dashboard, faster auto-assign runs, and a memory-friendlier usage scan. No action needed.<\/p>","2.5.3":"<p>Recommended for everyone: fixes a folder-permission bypass in bulk actions, an incomplete file-size index, and two Chinese translations that never applied.<\/p>","2.5.2":"<p>Important: this release fixes a migration bug that could delete your auto-assign rules. Update and then check the Auto-assign tab.<\/p>","2.3.1":"<p>Recommended for everyone: star un-pin fix, full-featured color picker, and a smoother Pro upgrade path.<\/p>"},"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3736720,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3736720,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3736720,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3736720,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["2.5.4"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3736720,"resolution":"1","location":"assets","locale":"","width":1680,"height":1650},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3736720,"resolution":"2","location":"assets","locale":"","width":1440,"height":900},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3736720,"resolution":"3","location":"assets","locale":"","width":1680,"height":1650},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3736720,"resolution":"4","location":"assets","locale":"","width":1680,"height":1650}},"screenshots":[]},"plugin_section":[],"plugin_tags":[9747,130330,233,231428,27268],"plugin_category":[],"plugin_contributors":[285209],"plugin_business_model":[],"class_list":["post-379133","plugin","type-plugin","status-publish","hentry","plugin_tags-folders","plugin_tags-media-folders","plugin_tags-media-library","plugin_tags-media-management","plugin_tags-media-tags","plugin_contributors-ht3dyo","plugin_committers-plugnest"],"banners":{"banner":"https:\/\/ps.w.org\/plugnest-media-folders\/assets\/banner-772x250.png?rev=3736720","banner_2x":"https:\/\/ps.w.org\/plugnest-media-folders\/assets\/banner-1544x500.png?rev=3736720","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/plugnest-media-folders\/assets\/icon-128x128.png?rev=3736720","icon_2x":"https:\/\/ps.w.org\/plugnest-media-folders\/assets\/icon-256x256.png?rev=3736720","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/plugnest-media-folders\/assets\/screenshot-1.png?rev=3736720","caption":""},{"src":"https:\/\/ps.w.org\/plugnest-media-folders\/assets\/screenshot-2.png?rev=3736720","caption":""},{"src":"https:\/\/ps.w.org\/plugnest-media-folders\/assets\/screenshot-3.png?rev=3736720","caption":""},{"src":"https:\/\/ps.w.org\/plugnest-media-folders\/assets\/screenshot-4.png?rev=3736720","caption":""}],"raw_content":"<!--section=description-->\n<p>PlugNest Media Folders adds real, nested folders to the WordPress media library \u2014 plus tags, batch editing, usage scanning and a one-page manager that feels like a file manager. It only writes classification data: your files are never moved, renamed or re-URLed, and deactivating the plugin leaves your site exactly as it was.<\/p>\n\n<p><strong>Highlights<\/strong><\/p>\n\n<ul>\n<li><strong>Folders that behave like folders<\/strong> \u2014 nest them, drag media in, pin favorites, give them colors. Browse the whole library or just one folder (with its subfolders).<\/li>\n<li><strong>Everywhere you pick media<\/strong> \u2014 the same folder filters work in the media modal used by Gutenberg, the Classic editor, Elementor and WooCommerce, and uploads can land straight into the folder you are viewing.<\/li>\n<li><strong>Tags &amp; batch tools<\/strong> \u2014 add\/remove tags, move, edit fields or permanently delete across hundreds of files, with a full activity log and one-click undo.<\/li>\n<li><strong>Usage scanning<\/strong> \u2014 see at a glance which media are in use by your posts and which are unreferenced, then clean up safely.<\/li>\n<li><strong>Auto-assign rules<\/strong> \u2014 file new uploads into folders automatically by filename, extension, type or year, with a dry-run preview.<\/li>\n<li><strong>Safe by design<\/strong> \u2014 the plugin never calls wp_upload_dir rewrites, never moves or renames files, and never changes a single URL.<\/li>\n<li><strong>Multilingual<\/strong> \u2014 English, Traditional Chinese and Simplified Chinese included.<\/li>\n<\/ul>\n\n<p><strong>PlugNest Media Folders Pro<\/strong> (optional, paid) adds the unused-media cleanup wizard, a missing-alt batch workflow, folder import\/export plus one-click import from other folder plugins (FileBird, Real Media Library, HappyFiles, Folders by Premio, Wicked Folders, Enhanced Media Library), folder access roles, and delete-folder-with-files. The free version is fully usable on its own.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin folder to <code>\/wp-content\/plugins\/<\/code>, or install through Plugins \u2192 Add New.<\/li>\n<li>Activate the plugin.<\/li>\n<li>Open <strong>PlugNest Media Folders<\/strong> in the admin menu and start organizing \u2014 nothing else to configure.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20folders%20change%20my%20file%20urls%3F\"><h3>Will folders change my file URLs?<\/h3><\/dt>\n<dd><p>No, never. Folders are a lightweight taxonomy on top of the existing library. Files stay exactly where WordPress put them and every URL keeps working.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20deactivate%20or%20uninstall%20the%20plugin%3F\"><h3>What happens if I deactivate or uninstall the plugin?<\/h3><\/dt>\n<dd><p>Deactivating simply hides the folders; your media is untouched. Uninstalling removes the plugin's own data (folders, tags, its log table) only \u2014 never your files.<\/p><\/dd>\n<dt id=\"can%20one%20file%20be%20in%20several%20folders%3F\"><h3>Can one file be in several folders?<\/h3><\/dt>\n<dd><p>Yes. Unlike file-system tools, PlugNest Media Folders lets a file live in multiple folders at once.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20gutenberg%2C%20elementor%20and%20woocommerce%3F\"><h3>Does it work with Gutenberg, Elementor and WooCommerce?<\/h3><\/dt>\n<dd><p>Yes. PlugNest Media Folders extends the standard WordPress media modal, which all of them use \u2014 the same folder filters and upload-to-folder are available everywhere.<\/p><\/dd>\n<dt id=\"do%20you%20support%20my%20language%3F\"><h3>Do you support my language?<\/h3><\/dt>\n<dd><p>English, Traditional Chinese and Simplified Chinese ship with the plugin.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.5.4<\/h4>\n\n<ul>\n<li>Performance: the admin dashboard no longer recomputes its full statistics on every read within a request, and folder media counts are computed once per request instead of once per call. Numbers stay live \u2014 the cache lives only for the current request.<\/li>\n<li>Performance: the activity log for auto-assign jobs now appends each batch instead of rewriting the whole snapshot, so a run over a large library is linear rather than quadratic. The 2000-item restore limit is now also enforced on this path.<\/li>\n<li>Performance: building the site-reference index reads post meta and post content in chunks instead of loading the entire site into memory at once; usage scanning now extends the time limit while it builds.<\/li>\n<li>Internal: renamed the internal size-sorting meta alias from the legacy <code>mn_size<\/code> to <code>pnmf_size<\/code>.<\/li>\n<\/ul>\n\n<h4>2.5.3<\/h4>\n\n<ul>\n<li>Fixed: the \"media attached to this post\" panel in the block editor listed empty rows \u2014 an attachment ID was passed where a post object was expected.<\/li>\n<li>Fixed: the file-size index builder could skip batches and report \"finished\" while entries were still missing, so size sorting could stay incomplete.<\/li>\n<li>Fixed: permanently deleting several media at once wrote one activity-log entry per file instead of one entry per operation.<\/li>\n<li>Fixed (permissions): folder access roles were only enforced in the folder tree and the media list query. Folder create\/rename\/delete\/move\/color\/pin, single-item save, bulk assign, permanent delete, activity-log undo, the native media library and the media modal now enforce them as well \u2014 a role-restricted user can no longer bypass them by calling the endpoints directly.<\/li>\n<li>Fixed: two admin messages added in 2.5.2 were stored with broken placeholders and never translated; their Chinese translations (and the folder-permission message) are now correct.<\/li>\n<li>Fixed: clicking \"Dry run\" in Auto-assign silently saved the rules. Previewing no longer writes anything.<\/li>\n<li>Fixed: the folder\/tag counters could show \"2\" if the term query failed.<\/li>\n<\/ul>\n\n<h4>2.5.2<\/h4>\n\n<ul>\n<li>Fixed a serious bug where the legacy migration routine could delete your auto-assign rules and other settings. If you had configured auto-assign rules, please open the Auto-assign tab and re-save them.<\/li>\n<li>Fixed: the \"missing alt\" filter now also applies to \"select all matching\", so bulk actions act on the same set you see on screen.<\/li>\n<li>Fixed: folder permission filtering could return a stale result if the current user changed during the same request.<\/li>\n<li>Fixed: the activity log now shows readable labels for permanent-delete entries instead of raw slugs.<\/li>\n<li>Performance: the auto-assign job no longer re-queries the entire candidate list on every batch (was quadratic on large libraries).<\/li>\n<li>Performance: the media list reads file sizes from the existing index instead of touching the filesystem for every item on each page load.<\/li>\n<li>Fixed: several admin messages were not translatable; Chinese translations added.<\/li>\n<li>Internal: shared asset-versioning helper; removed leftover legacy prefixes.<\/li>\n<\/ul>\n\n<h4>2.5.1<\/h4>\n\n<ul>\n<li>Security hardening: bulk-edit field templates (title, caption, alt text) are now sanitized before being saved, matching the single-item edit path.<\/li>\n<li>Fixed: the Pro upgrade dialog now opens when clicking a locked Pro button. The \"pro\" flag was passed to JavaScript as a string, so on sites without the Pro add-on the upsell dialog never appeared.<\/li>\n<li>Internal identifiers (function, class, option and taxonomy names) renamed to a unique prefix; existing sites are migrated automatically \u2014 folders, tags, colors, roles and logs are preserved with no action needed.<\/li>\n<\/ul>\n\n<h4>2.5.0<\/h4>\n\n<ul>\n<li>Renamed to PlugNest Media Folders.<\/li>\n<li>Includes all 2.4.2 fixes and improvements (drag-and-drop reliability, folder colors, auto-assign \"Videos only\", generic default rules, translation fixes).<\/li>\n<\/ul>\n\n<h4>2.4.2<\/h4>\n\n<ul>\n<li>New: auto-assign scope \"Videos only\".<\/li>\n<li>Changed: auto-assign default rules are now generic (Videos \/ Audio \/ Pictures \/ Documents by media type) \u2014 better starting point for any site.<\/li>\n<li>New (Pro): missing-alt batch workflow gains one-click \"Auto-fill from filename\" and \"Restore original\".<\/li>\n<li>Fixed: the folder color picker popup could not be closed with its \u2715 button.<\/li>\n<li>Fixed: a template regression that stretched a gap between the upload bar and the three-column layout.<\/li>\n<li>Fixed: five confirmation dialogs with line breaks were never translated; translations now load correctly.<\/li>\n<li>Fixed: dragging a media card now always drags \u2014 a short \"long-press to box-select\" timer could hijack the gesture, the full-page \"drop to upload\" overlay lit up for internal drags, and dragging a card by its thumbnail image (which browsers expose as a virtual file) was treated as an upload instead of a move. Box selection is now started only from empty grid space, the upload overlay appears only for real external files, and internal drags \u2014 by card or by thumbnail \u2014 always move.<\/li>\n<\/ul>\n\n<h4>2.4.1<\/h4>\n\n<ul>\n<li>Compliance refactor: all Pro-only code moved into the separate PlugNest Media Folders Pro add-on. The free plugin now contains zero gated features \u2014 every line of code in it runs fully for everyone.<\/li>\n<\/ul>\n\n<h4>2.4.0<\/h4>\n\n<ul>\n<li>PlugNest Media Folders: same great plugin, new name (the MediaNest name is retired).<\/li>\n<li>Pro update gate: licensed sites receive Pro updates automatically; unlicensed copies no longer receive Pro updates.<\/li>\n<\/ul>\n\n<h4>2.3.1<\/h4>\n\n<ul>\n<li>Fixed: folder star could not be un-pinned from the pinned section.<\/li>\n<li>Fixed: folder color rejected valid values; the color picker now offers a full palette plus custom color, with a close button.<\/li>\n<li>Free version now shows Pro buttons in a locked state with an upgrade guide.<\/li>\n<li>Folder access roles: the dialog now pre-fills current roles, and restricted folders show a lock badge.<\/li>\n<\/ul>\n\n<h4>2.3.0<\/h4>\n\n<ul>\n<li>New: folder tiles in the center panel (breadcrumbs, drop targets, desktop drag-in).<\/li>\n<li>New: file-size index and file-size sorting.<\/li>\n<li>New: Multilingual \u2014 English base with Traditional Chinese and Simplified Chinese translations.<\/li>\n<li>New: PlugNest Media Folders Pro \u2014 cleanup wizard, missing-alt workflow, folder import\/export, access roles.<\/li>\n<li>Fixed: button icon alignment in the header actions.<\/li>\n<\/ul>\n\n<h4>2.1.2<\/h4>\n\n<ul>\n<li>Fixed: usage scanning could miss media referenced with escaped\/URL-encoded paths (Elementor data).<\/li>\n<li>Strengthened: bulk cleanup now always re-scans before deleting.<\/li>\n<\/ul>","raw_excerpt":"Organize the WordPress media library with real folders, tags, usage scanning and batch tools \u2014 without ever touching a file.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/379133","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=379133"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/plugnest"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=379133"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=379133"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=379133"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=379133"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=379133"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=379133"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}