{"id":313406,"date":"2026-06-13T08:30:48","date_gmt":"2026-06-13T08:30:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/flexa-media-folders\/"},"modified":"2026-06-13T08:30:30","modified_gmt":"2026-06-13T08:30:30","slug":"flexa-media-folders","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/flexa-media-folders\/","author":23412324,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.2.4","stable_tag":"1.2.4","tested":"7.0","requires":"6.2","requires_php":"8.2","requires_plugins":null,"header_name":"Flexa Media Folders","header_author":"Flexa Tech","header_description":"Organize the WordPress Media Library into a hierarchical, drag-and-drop folder tree.","assets_banners_color":"fefefe","last_updated":"2026-06-13 08:30:30","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/flexa.vn","rating":0,"author_block_rating":0,"active_installs":0,"downloads":22,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.2.4":{"tag":"1.2.4","author":"flexatech","date":"2026-06-13 08:30:30"}},"upgrade_notice":{"1.0.2":"<p>Security hardening: REST endpoints now enforce per-attachment edit permissions and scope media listings to what each user can manage.<\/p>","1.0.1":"<p>Security hardening for SQL identifier binding and admin capability checks; dark-mode and settings-page UI fixes. Now requires WordPress 6.2 or later.<\/p>","1.0.0":"<p>Initial release of Flexa Media Folders.<\/p>"},"ratings":[],"assets_icons":[],"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3570863,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":499}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.2.4"],"block_files":[],"assets_screenshots":[],"screenshots":{"1":"The folder tree sidebar in the Media Library grid view.","2":"Dragging selected attachments onto a folder.","3":"The folder right-click context menu with the color palette.","4":"The folder sidebar inside the block editor media modal.","5":"The Flexa Media Folders settings page."}},"plugin_section":[],"plugin_tags":[1346,9747,84,233,6655],"plugin_category":[50],"plugin_contributors":[255540],"plugin_business_model":[],"class_list":["post-313406","plugin","type-plugin","status-publish","hentry","plugin_tags-attachments","plugin_tags-folders","plugin_tags-media","plugin_tags-media-library","plugin_tags-organize","plugin_category-media","plugin_contributors-flexatech","plugin_committers-flexatech"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/flexa-media-folders_fefefe.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Flexa Media Folders adds a hierarchical, drag-and-drop folder tree to the WordPress Media Library. Group images, videos, documents and any other attachment into nested folders, then filter the library to a single folder with one click - in the grid view, the list view, and the media picker inside the post editor.<\/p>\n\n<p>Folders are stored in two dedicated, indexed database tables, so your <code>wp_term*<\/code> tables stay clean and the tree loads fast even with thousands of files.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li><strong>Hierarchical folder tree<\/strong> - create unlimited nested folders, rename them, and reorder them by drag-and-drop.<\/li>\n<li><strong>Drag attachments into folders<\/strong> - drag an item from the Media Library straight onto a folder.<\/li>\n<li><strong>Works everywhere the Media Library does<\/strong> - the folder sidebar appears on the Media grid, the list view (<code>upload.php<\/code>), and the media modal in both the block editor and the Classic Editor.<\/li>\n<li><strong>One-click filtering<\/strong> - click a folder to filter the library to it, plus built-in \"All files\" and \"Uncategorized\" views.<\/li>\n<li><strong>Color labels<\/strong> - assign one of 18 colors to any folder from the right-click menu to spot it at a glance.<\/li>\n<li><strong>Full context menu<\/strong> - New Folder, Rename, Cut, Paste, Delete and Change Color, all from a right-click.<\/li>\n<li><strong>File counts<\/strong> - each folder can show how many attachments it contains (toggle in Settings).<\/li>\n<li><strong>Folder search<\/strong> - filter the folder tree as you type.<\/li>\n<li><strong>Settings page<\/strong> - choose a default folder for new uploads (none \/ last used \/ a specific folder), set the folder sort order, toggle file counts, and exclude specific post types from showing the sidebar.<\/li>\n<li><strong>Dark mode<\/strong> - the tree automatically follows your WordPress admin color scheme.<\/li>\n<li><strong>Accessible<\/strong> - full ARIA tree semantics, keyboard navigation, and visible focus styles.<\/li>\n<li><strong>Translation ready<\/strong> - every string is internationalized and a <code>.pot<\/code> template is bundled.<\/li>\n<li><strong>REST API<\/strong> - all screens are powered by a REST API under <code>\/wp-json\/flexa-mf\/v1\/<\/code>, so external integrations and your own code can read and manage folders too.<\/li>\n<li><strong>WP-CLI<\/strong> - manage folders and reset plugin data from the command line with <code>wp flexa-mf<\/code>.<\/li>\n<li><strong>Clean uninstall<\/strong> - a Settings danger zone (and <code>wp flexa-mf reset<\/code>) wipes all plugin data on demand; uninstalling the plugin drops its tables. Your media files are never touched.<\/li>\n<\/ul>\n\n<h4>Source code for compiled JavaScript and CSS<\/h4>\n\n<p>The plugin ships with minified\/compiled JavaScript and CSS in <code>assets\/dist\/<\/code>. The human-readable source code for these assets is publicly available and maintained at:<\/p>\n\n<p>https:\/\/github.com\/flexatech\/flexa-media-folders<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the plugin files to <code>\/wp-content\/plugins\/flexa-media-folders<\/code>, or install it through the WordPress <strong>Plugins<\/strong> screen.<\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> screen.<\/li>\n<li>Open <strong>Media<\/strong> in the admin menu - the folder sidebar appears next to your library. Visit <strong>Media \u2192 Media Folders<\/strong> to configure defaults.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20this%20move%20or%20rename%20my%20media%20files%3F\"><h3>Does this move or rename my media files?<\/h3><\/dt>\n<dd><p>No. Folders are an organizational layer stored separately in the database. Your files stay exactly where WordPress put them, with the same URLs.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20folders%20if%20i%20deactivate%20or%20delete%20the%20plugin%3F\"><h3>What happens to my folders if I deactivate or delete the plugin?<\/h3><\/dt>\n<dd><p>Deactivating keeps all folder data. Deleting (uninstalling) the plugin drops its database tables and removes its settings - but your media files are never deleted. You can also wipe folder data on demand from the Settings danger zone.<\/p><\/dd>\n<dt id=\"does%20it%20use%20wordpress%20taxonomies%3F\"><h3>Does it use WordPress taxonomies?<\/h3><\/dt>\n<dd><p>No. Folders live in two dedicated, indexed tables. This keeps your <code>wp_term*<\/code> tables clean and lets the tree load in a single query.<\/p><\/dd>\n<dt id=\"can%20i%20filter%20the%20media%20library%20by%20folder%20inside%20the%20post%20editor%3F\"><h3>Can I filter the Media Library by folder inside the post editor?<\/h3><\/dt>\n<dd><p>Yes. The folder sidebar is available in the media modal in both the block editor and the Classic Editor.<\/p><\/dd>\n<dt id=\"is%20there%20a%20rest%20api%3F\"><h3>Is there a REST API?<\/h3><\/dt>\n<dd><p>Yes - all folder data is exposed under <code>\/wp-json\/flexa-mf\/v1\/<\/code>. The endpoints require the same capabilities as the Media Library itself.<\/p><\/dd>\n<dt id=\"how%20does%20the%20plugin%20handle%20authentication%20and%20permissions%3F\"><h3>How does the plugin handle authentication and permissions?<\/h3><\/dt>\n<dd><p>Every state-changing request goes through the WordPress REST API and is gated by two checks: a capability check (<code>upload_files<\/code> for folder actions, <code>manage_options<\/code> for settings and the data-reset endpoint) and the standard WordPress REST nonce (<code>X-WP-Nonce<\/code>). On top of that, assigning or detaching media is verified per attachment with the <code>edit_post<\/code> capability, and the attachment listing is scoped to media the current user can manage. The plugin does not register any custom admin-ajax endpoints. Both capability gates are filterable via <code>flexa_mf\/capabilities\/manage<\/code> and <code>flexa_mf\/capabilities\/settings<\/code> if you need to tighten or loosen them.<\/p><\/dd>\n<dt id=\"can%20i%20stop%20the%20sidebar%20from%20showing%20on%20a%20particular%20post%20type%3F\"><h3>Can I stop the sidebar from showing on a particular post type?<\/h3><\/dt>\n<dd><p>Yes. The plugin's Settings page has a per-post-type exclusion list.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.2.4<\/h4>\n\n<ul>\n<li>New: translation template (.pot) covering all plugin strings, so the plugin can now be translated into other languages.<\/li>\n<\/ul>\n\n<h4>1.2.3<\/h4>\n\n<ul>\n<li>New: a Settings link on the Plugins page now takes you straight to the Media Folders settings.<\/li>\n<\/ul>\n\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>Fix: development files are no longer included in the release package.<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Fix: the \"Download folder\" notice now inserts the folder name correctly in translated languages, so translators can reposition the placeholder.<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>New: after moving media into a folder, the confirmation toast now offers an Undo button for 5 seconds - click it to send every item back to its previous folder (including Uncategorized) with folder counts and the media grid updated automatically.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>New: rename a folder inline by double-clicking its name in the sidebar - press Enter or click away to save, Esc to cancel. Empty names are ignored and the right-click Rename option still works as before.<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Security: the folder assign\/detach REST endpoints now verify per-attachment edit permission (<code>edit_post<\/code>) for each item, so a user can only organize media they are allowed to edit instead of any attachment in the library.<\/li>\n<li>Security: the attachment-listing REST endpoint now scopes results to media the caller can manage - users who cannot edit others' posts see only their own uploads.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Security: bind every custom-table identifier through <code>wpdb::prepare()<\/code>'s <code>%i<\/code> placeholder so no SQL string interpolates a table name outside <code>prepare()<\/code>.<\/li>\n<li>Security: gate the Media Library query-filter superglobal reads behind an explicit <code>current_user_can()<\/code> check (defense in depth on top of WordPress's upstream cap enforcement).<\/li>\n<li>Fix: the admin UI now loads correctly on the Settings page.<\/li>\n<li>Fix: dark-mode styling on the folder tree, drag tooltip, and toast.<\/li>\n<li>Compatibility: minimum WordPress version bumped from 5.8 to 6.2 (required for the <code>%i<\/code> placeholder).<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release.<\/li>\n<li>Hierarchical, drag-and-drop folder tree for the Media Library.<\/li>\n<li>Drag attachments into folders.<\/li>\n<li>Folder sidebar in the Media grid, the list view, and the editor media modal.<\/li>\n<li>One-click folder filtering with built-in \"All files\" and \"Uncategorized\" views.<\/li>\n<li>Folder color labels (18-color palette) and a full right-click context menu.<\/li>\n<li>Per-folder file counts, folder-tree search, and a Settings page (default upload folder, sort order, count display, post-type exclusions).<\/li>\n<li>Dark mode that follows the WordPress admin color scheme; full keyboard and ARIA accessibility.<\/li>\n<li>REST API under <code>\/wp-json\/flexa-mf\/v1\/<\/code> and <code>wp flexa-mf<\/code> WP-CLI commands.<\/li>\n<li>Translation ready with a bundled <code>.pot<\/code> template.<\/li>\n<\/ul>","raw_excerpt":"Organize the WordPress Media Library into drag-and-drop folders with a fast React tree, color labels, and a REST API.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/313406","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=313406"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/flexatech"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=313406"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=313406"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=313406"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=313406"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=313406"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=313406"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}