{"id":266360,"date":"2025-12-14T09:29:28","date_gmt":"2025-12-14T09:29:28","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/virtual-media-folders\/"},"modified":"2026-03-27T11:00:40","modified_gmt":"2026-03-27T11:00:40","slug":"virtual-media-folders","status":"publish","type":"plugin","link":"https:\/\/pcd.wordpress.org\/plugins\/virtual-media-folders\/","author":3803,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_crdt_document":"","version":"2.0.3","stable_tag":"2.0.3","tested":"7.0","requires":"6.8","requires_php":"8.3","requires_plugins":null,"header_name":"Virtual Media Folders","header_author":"Per Soderlind","header_description":"Virtual folder organization and smart management for the WordPress Media Library.","assets_banners_color":"7f7568","last_updated":"2026-03-27 11:00:40","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"https:\/\/soderlind.no\/","rating":5,"author_block_rating":0,"active_installs":30,"downloads":2051,"num_ratings":2,"support_threads":2,"support_threads_resolved":1,"author_block_count":1,"sections":["description","installation","faq","changelog"],"tags":{"1.3.0":{"tag":"1.3.0","author":"PerS","date":"2025-12-14 09:54:45"},"1.3.1":{"tag":"1.3.1","author":"PerS","date":"2025-12-14 11:05:01"},"1.3.2":{"tag":"1.3.2","author":"PerS","date":"2025-12-15 20:38:50"},"1.3.3":{"tag":"1.3.3","author":"PerS","date":"2025-12-16 23:59:15"},"1.3.4":{"tag":"1.3.4","author":"PerS","date":"2025-12-21 14:06:46"},"1.3.5":{"tag":"1.3.5","author":"PerS","date":"2025-12-21 23:10:23"},"1.3.6":{"tag":"1.3.6","author":"PerS","date":"2025-12-31 02:11:14"},"1.3.7":{"tag":"1.3.7","author":"PerS","date":"2025-12-31 09:20:48"},"1.3.8":{"tag":"1.3.8","author":"PerS","date":"2025-12-31 09:57:51"},"1.3.9":{"tag":"1.3.9","author":"PerS","date":"2026-01-01 14:24:57"},"1.3.9,":{"tag":"1.3.9,","author":"PerS","date":"2025-12-31 12:12:19"},"1.4.0":{"tag":"1.4.0","author":"PerS","date":"2026-01-03 00:16:46"},"1.4.1":{"tag":"1.4.1","author":"PerS","date":"2026-01-04 23:06:55"},"1.4.2":{"tag":"1.4.2","author":"PerS","date":"2026-01-04 23:17:17"},"1.5.0":{"tag":"1.5.0","author":"PerS","date":"2026-01-05 03:27:41"},"1.5.1":{"tag":"1.5.1","author":"PerS","date":"2026-01-15 12:47:19"},"1.5.2":{"tag":"1.5.2","author":"PerS","date":"2026-01-16 19:25:21"},"1.5.3":{"tag":"1.5.3","author":"PerS","date":"2026-01-16 19:43:42"},"1.6.0":{"tag":"1.6.0","author":"PerS","date":"2026-01-16 22:04:08"},"1.6.1":{"tag":"1.6.1","author":"PerS","date":"2026-01-17 15:20:33"},"1.6.2":{"tag":"1.6.2","author":"PerS","date":"2026-01-22 17:36:12"},"1.6.3":{"tag":"1.6.3","author":"PerS","date":"2026-01-22 21:13:19"},"1.6.4":{"tag":"1.6.4","author":"PerS","date":"2026-01-23 05:42:28"},"1.6.5":{"tag":"1.6.5","author":"PerS","date":"2026-01-23 06:08:53"},"1.6.6":{"tag":"1.6.6","author":"PerS","date":"2026-01-23 17:08:35"},"1.6.8":{"tag":"1.6.8","author":"PerS","date":"2026-02-06 01:30:03"},"1.7.0":{"tag":"1.7.0","author":"PerS","date":"2026-02-08 16:09:47"},"1.7.1":{"tag":"1.7.1","author":"PerS","date":"2026-02-09 12:50:11"},"1.7.2":{"tag":"1.7.2","author":"PerS","date":"2026-02-18 19:52:32"},"1.8.0":{"tag":"1.8.0","author":"PerS","date":"2026-02-24 09:21:45"},"1.8.1":{"tag":"1.8.1","author":"PerS","date":"2026-02-24 21:55:41"},"1.8.2":{"tag":"1.8.2","author":"PerS","date":"2026-03-07 22:16:23"},"1.8.3":{"tag":"1.8.3","author":"PerS","date":"2026-03-08 14:53:23"},"1.9.0":{"tag":"1.9.0","author":"PerS","date":"2026-03-10 21:04:50"},"2.0.0":{"tag":"2.0.0","author":"PerS","date":"2026-03-14 15:47:40"},"2.0.2":{"tag":"2.0.2","author":"PerS","date":"2026-03-23 21:23:51"},"2.0.3":{"tag":"2.0.3","author":"PerS","date":"2026-03-27 11:00:40"}},"upgrade_notice":{"1.0.1":"<p>Bugfix release: Fixed remaining mediamanager references in REST API paths, events, and filters.<\/p>","1.0.0":"<p>Major release: Plugin renamed from &quot;Media Manager&quot; to &quot;Virtual Media Folders&quot;. Breaking change for customizations.<\/p>","0.1.17":"<p>Plugin Check compliance fixes.<\/p>","0.1.16":"<p>Added uninstall.php for clean plugin removal.<\/p>","0.1.15":"<p>Improved keyboard navigation: ArrowLeft moves to parent folder, collapsing parent selects it.<\/p>","0.1.14":"<p>Edit Folder modal now allows moving folders to different parents.<\/p>","0.1.13":"<p>New Show All Media setting. All settings now functional.<\/p>","0.1.12":"<p>Jump to Folder After Move now defaults to disabled.<\/p>","0.1.11":"<p>Fix: Moved files properly removed from source folder view.<\/p>","0.1.10":"<p>Fix: Sort order is now preserved after moving files.<\/p>","0.1.9":"<p>New setting to control jump-to-folder behavior after moving files. Bulk select now auto-disables after moves.<\/p>","0.1.8":"<p>Folder counts now update based on the selected media type filter.<\/p>","0.1.7":"<p>Bulk move now focuses on target folder to show moved files.<\/p>","0.1.6":"<p>Folder dropdowns now update dynamically without page reload.<\/p>","0.1.5":"<p>Production-ready version constant and cleaned up debug logging.<\/p>","0.1.4":"<p>Refactored to PSR-4 autoloading for better Composer compatibility.<\/p>","0.1.3":"<p>Housekeeping.<\/p>","0.1.2":"<p>Refactored folder sidebar with shared components. Better UX after folder deletion.<\/p>","0.1.1":"<p>Fixes sticky sidebar in Gutenberg media modal.<\/p>","0.1.0":"<p>Initial release of Virtual Media Folders.<\/p>"},"ratings":{"1":0,"2":0,"3":0,"4":0,"5":2},"assets_icons":{"icon.svg":{"filename":"icon.svg","revision":3419279,"resolution":false,"location":"assets","locale":false}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3419279,"resolution":"1544x500","location":"assets","locale":""},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3419279,"resolution":"772x250","location":"assets","locale":""}},"assets_blueprints":{"blueprint.json":{"filename":"blueprint.json","revision":3492564,"resolution":false,"location":"assets","locale":"","contents":"{\"$schema\":\"https:\\\/\\\/playground.wordpress.net\\\/blueprint-schema.json\",\"meta\":{\"title\":\"Virtual Media Folders\",\"author\":\"bph\",\"description\":\"Virtual folder organization and smart management for the WordPress Media Library.\",\"categories\":[\"Plugins\",\"Media\"]},\"landingPage\":\"\\\/wp-admin\\\/upload.php?mode=folder\",\"steps\":[{\"step\":\"importWxr\",\"file\":{\"resource\":\"url\",\"url\":\"https:\\\/\\\/raw.githubusercontent.com\\\/wordpress\\\/blueprints\\\/trunk\\\/blueprints\\\/tt5-demo\\\/tt5-demo-content.xml\"}},{\"step\":\"installPlugin\",\"pluginData\":{\"resource\":\"wordpress.org\\\/plugins\",\"slug\":\"virtual-media-folders\"},\"options\":{\"activate\":true}},{\"step\":\"runPHP\",\"code\":\"<?php require_once 'wordpress\\\/wp-load.php'; wp_insert_term('Photos', 'vmfo_folder'); wp_insert_term('Videos', 'vmfo_folder'); wp_insert_term('Documentation', 'vmfo_folder'); $photos = get_term_by('slug', 'photos', 'vmfo_folder'); if ($photos) { wp_insert_term('Vacation 2025', 'vmfo_folder', array('parent' => $photos->term_id)); } ?>\"}],\"preferredVersions\":{\"php\":\"8.3\",\"wp\":\"latest\"},\"login\":true}"}},"all_blocks":[],"tagged_versions":["1.3.0","1.3.1","1.3.2","1.3.3","1.3.4","1.3.5","1.3.6","1.3.7","1.3.8","1.3.9","1.3.9,","1.4.0","1.4.1","1.4.2","1.5.0","1.5.1","1.5.2","1.5.3","1.6.0","1.6.1","1.6.2","1.6.3","1.6.4","1.6.5","1.6.6","1.6.8","1.7.0","1.7.1","1.7.2","1.8.0","1.8.1","1.8.2","1.8.3","1.9.0","2.0.0","2.0.2","2.0.3"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3446700,"resolution":"1","location":"assets","locale":""},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3446700,"resolution":"2","location":"assets","locale":""},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3446700,"resolution":"3","location":"assets","locale":""},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3446700,"resolution":"4","location":"assets","locale":""}},"screenshots":{"1":"Folder sidebar in Media Library","2":"Settings page","3":"Bulk move action","4":"Gutenberg media modal integration"},"jetpack_post_was_ever_published":false},"plugin_section":[],"plugin_tags":[2353,9747,84,233,5884],"plugin_category":[50],"plugin_contributors":[78884],"plugin_business_model":[],"class_list":["post-266360","plugin","type-plugin","status-publish","hentry","plugin_tags-ai","plugin_tags-folders","plugin_tags-media","plugin_tags-media-library","plugin_tags-organization","plugin_category-media","plugin_contributors-pers","plugin_committers-pers"],"banners":{"banner":"https:\/\/ps.w.org\/virtual-media-folders\/assets\/banner-772x250.png?rev=3419279","banner_2x":"https:\/\/ps.w.org\/virtual-media-folders\/assets\/banner-1544x500.png?rev=3419279","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":"https:\/\/ps.w.org\/virtual-media-folders\/assets\/icon.svg?rev=3419279","icon":"https:\/\/ps.w.org\/virtual-media-folders\/assets\/icon.svg?rev=3419279","icon_2x":false,"generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/virtual-media-folders\/assets\/screenshot-1.png?rev=3446700","caption":"Folder sidebar in Media Library"},{"src":"https:\/\/ps.w.org\/virtual-media-folders\/assets\/screenshot-2.png?rev=3446700","caption":"Settings page"},{"src":"https:\/\/ps.w.org\/virtual-media-folders\/assets\/screenshot-3.png?rev=3446700","caption":"Bulk move action"},{"src":"https:\/\/ps.w.org\/virtual-media-folders\/assets\/screenshot-4.png?rev=3446700","caption":"Gutenberg media modal integration"}],"raw_content":"<!--section=description-->\n<p>Virtual Media Folders brings virtual folder organization to your WordPress Media Library. Organize your media files into hierarchical folders without moving files on disk\u2014folders are virtual, so your URLs never change.<\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li><strong>Virtual Folders<\/strong> \u2013 Create hierarchical folder structures to organize media<\/li>\n<li><strong>Drag &amp; Drop<\/strong> \u2013 Easily move media between folders with drag and drop<\/li>\n<li><strong>Sticky Sidebar<\/strong> \u2013 Folder navigation stays visible while scrolling through media<\/li>\n<li><strong>Gutenberg Integration<\/strong> \u2013 Filter media by folder directly in the block editor<\/li>\n<li><strong>Bulk Actions<\/strong> \u2013 Move multiple media items at once<\/li>\n<li><strong>Keyboard Accessible<\/strong> \u2013 Full keyboard navigation support<\/li>\n<li><strong>Internationalized<\/strong> \u2013 Ready for translation (Norwegian Bokm\u00e5l included)<\/li>\n<\/ul>\n\n<h4>Free add-ons<\/h4>\n\n<p><a href=\"https:\/\/github.com\/soderlind\/vmfa\"><strong>Add-On Manager<\/strong><\/a> lets you easily install and manage add-ons that extend Virtual Media Folders with powerful new features:<\/p>\n\n<ul>\n<li><a href=\"https:\/\/github.com\/soderlind\/vmfa-ai-organizer\"><strong>AI Organizer<\/strong><\/a> \u2013 Uses vision-capable AI models to analyze actual image content and automatically organize your media library into virtual folders. This is add-on functionality requiring an API key from a supported AI service provider, or a local LLM.<\/li>\n<li><a href=\"https:\/\/github.com\/soderlind\/vmfa-editorial-workflow\"><strong>Editorial Workflow<\/strong><\/a> \u2013 Role-based folder access, move restrictions, and Inbox workflow.<\/li>\n<li><a href=\"https:\/\/github.com\/soderlind\/vmfa-folder-exporter\"><strong>Folder Exporter<\/strong><\/a> \u2013 Export folders (or subtrees) as ZIP archives with optional CSV manifests.<\/li>\n<li><a href=\"https:\/\/github.com\/soderlind\/vmfa-media-cleanup\"><strong>Media Cleanup<\/strong><\/a> \u2013 Tools to identify and clean up unused or duplicate media files.<\/li>\n<li><a href=\"https:\/\/github.com\/soderlind\/vmfa-rules-engine\"><strong>Rules Engine<\/strong><\/a> \u2013 Rule-based automatic folder assignment for media uploads, based on metadata, file type, or other criteria. <\/li>\n<\/ul>\n\n<p>https:\/\/www.youtube.com\/watch?v=bA4lf7ynz24<\/p>\n\n<h4>How It Works<\/h4>\n\n<p>Virtual Media Folders uses a custom taxonomy to assign media to folders. This means:<\/p>\n\n<ul>\n<li>Your media files stay exactly where they are on the server<\/li>\n<li>URLs never change when you reorganize<\/li>\n<li>Folders can be nested to create hierarchies<\/li>\n<\/ul>\n\n<h4>Usage<\/h4>\n\n<p><strong>Organizing Media<\/strong><\/p>\n\n<ol>\n<li>Go to <strong>Media &gt; Library<\/strong><\/li>\n<li>Click the folder icon to show the sidebar<\/li>\n<li>Use <strong>+<\/strong> to create folders<\/li>\n<li>Drag media onto folders to organize \/ Bulk select media and use the \"Move to Folder\" action<\/li>\n<li>Click a folder to filter the view<\/li>\n<\/ol>\n\n<p><strong>Settings<\/strong><\/p>\n\n<p>Go to <strong>Media &gt; Folder Settings<\/strong> to configure:<\/p>\n\n<ul>\n<li><strong>Show \"All Media\"<\/strong> \u2013 Display \"All Media\" option in sidebar<\/li>\n<li><strong>Show \"Uncategorized\"<\/strong> \u2013 Display folder for unassigned media<\/li>\n<li><strong>Jump to folder after move<\/strong> \u2013 Navigate to target folder after moving<\/li>\n<li><strong>Default folder for uploads<\/strong> \u2013 Auto-assign new uploads to a folder<\/li>\n<\/ul>\n\n<p><strong>Block Editor<\/strong><\/p>\n\n<p>When inserting media from a block (Image, Gallery, etc.):<\/p>\n\n<ol>\n<li>Open the Media Library modal<\/li>\n<li>Use the folder sidebar to filter<\/li>\n<li>Select your media as usual<\/li>\n<\/ol>\n\n<p><strong>AI Abilities<\/strong><\/p>\n\n<p>Virtual Media Folders exposes Abilities API tools that can be used by AI agents and MCP adapters:<\/p>\n\n<ul>\n<li><strong><code>vmfo\/list-folders<\/code><\/strong> (read-only) \u2013 Lists folders with <code>id<\/code>, <code>name<\/code>, <code>parent_id<\/code>, <code>path<\/code>, and <code>count<\/code>.<\/li>\n<li><strong><code>vmfo\/create-folder<\/code><\/strong> (write) \u2013 Creates a folder with <code>name<\/code> and optional <code>parent_id<\/code>.<\/li>\n<li><strong><code>vmfo\/add-to-folder<\/code><\/strong> (write) \u2013 Adds one or more attachments to a folder using <code>folder_id<\/code> and <code>attachment_ids<\/code>.<\/li>\n<\/ul>\n\n<p>Recommended AI flow:<\/p>\n\n<ol>\n<li>Call <code>vmfo\/list-folders<\/code> to resolve folder names\/paths to a stable <code>id<\/code>.<\/li>\n<li>If needed, call <code>vmfo\/create-folder<\/code> to create the target folder.<\/li>\n<li>Call <code>vmfo\/add-to-folder<\/code> with that <code>folder_id<\/code> and one or more <code>attachment_ids<\/code>.<\/li>\n<\/ol>\n\n<p>This avoids ambiguity when duplicate folder names exist.<\/p>\n\n<p>Permission model:<\/p>\n\n<ul>\n<li><code>vmfo\/list-folders<\/code> and <code>vmfo\/add-to-folder<\/code> require the <code>upload_files<\/code> capability.<\/li>\n<li><code>vmfo\/create-folder<\/code> requires the <code>manage_categories<\/code> capability.<\/li>\n<\/ul>\n\n<p>See the <a href=\"https:\/\/github.com\/soderlind\/virtual-media-folders\/blob\/main\/docs\/mcp.md\">MCP Integration guide<\/a> for client configuration (Claude, GitHub Copilot, Cursor) and a full usage walkthrough.<\/p>\n\n<h4>Documentation<\/h4>\n\n<ul>\n<li><a href=\"https:\/\/github.com\/soderlind\/virtual-media-folders\/blob\/main\/docs\/a11y.md\">Accessibility<\/a> \u2013 Keyboard navigation and screen reader support<\/li>\n<li><a href=\"https:\/\/github.com\/soderlind\/virtual-media-folders\/blob\/main\/docs\/development.md\">Development<\/a> \u2013 Setup, API reference, hooks, and contributing<\/li>\n<li><a href=\"https:\/\/github.com\/soderlind\/virtual-media-folders\/blob\/main\/docs\/mcp.md\">MCP Integration<\/a> \u2013 MCP client configuration, upload flow, and AI agent usage<\/li>\n<li><a href=\"https:\/\/github.com\/soderlind\/virtual-media-folders\/blob\/main\/docs\/addon-development.md\">Add-on Development<\/a> \u2013 Guide to building add-on plugins<\/li>\n<\/ul>\n\n<h4>Free add-ons<\/h4>\n\n<p>Use the <a href=\"https:\/\/github.com\/soderlind\/vmfa\"><strong>add-on manager<\/strong><\/a> to easily install and manage add-ons that extend Virtual Media Folders with powerful new features:<\/p>\n\n<ul>\n<li><a href=\"https:\/\/github.com\/soderlind\/vmfa-ai-organizer\">Virtual Media Folders - AI Organizer<\/a> \u2013 Uses vision-capable AI models to analyze actual image content and automatically organize your media library into virtual folders.<\/li>\n<li><a href=\"https:\/\/github.com\/soderlind\/vmfa-editorial-workflow\">Virtual Media Folders - Editorial Workflow<\/a> \u2013 Role-based folder access, move restrictions, and Inbox workflow.<\/li>\n<li><a href=\"https:\/\/github.com\/soderlind\/vmfa-folder-exporter\">Virtual Media Folders - Folder Exporter<\/a> \u2013 Export folders (or subtrees) as ZIP archives with optional CSV manifests.<\/li>\n<li><a href=\"https:\/\/github.com\/soderlind\/vmfa-media-cleanup\">Virtual Media Folders - Media Cleanup<\/a> \u2013 Tools to identify and clean up unused or duplicate media files.<\/li>\n<li><a href=\"https:\/\/github.com\/soderlind\/vmfa-rules-engine\">Virtual Media Folders - Rules Engine<\/a> \u2013 Rule-based automatic folder assignment for media uploads, based on metadata, file type, or other criteria.<\/li>\n<\/ul>\n\n<h3>Privacy Policy<\/h3>\n\n<p>Virtual Media Folders does not:<\/p>\n\n<ul>\n<li>Track users<\/li>\n<li>Send data to external servers<\/li>\n<li>Use cookies<\/li>\n<li>Collect any personal information<\/li>\n<\/ul>\n\n<p>All data is stored locally in your WordPress database.<\/p>\n\n<!--section=installation-->\n<h4>From WordPress Plugin Directory<\/h4>\n\n<ol>\n<li>Go to Plugins \u2192 Add New in your WordPress admin<\/li>\n<li>Search for \"Virtual Media Folders\"<\/li>\n<li>Click \"Install Now\" and then \"Activate\"<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20this%20move%20my%20actual%20files%3F\"><h3>Will this move my actual files?<\/h3><\/dt>\n<dd><p>No. Virtual Media Folders uses virtual folders. Your files stay exactly where they are on the server, and all URLs remain unchanged.<\/p><\/dd>\n<dt id=\"can%20i%20nest%20folders%3F\"><h3>Can I nest folders?<\/h3><\/dt>\n<dd><p>Yes! You can create hierarchical folder structures with unlimited nesting levels.<\/p><\/dd>\n<dt id=\"does%20this%20work%20with%20gutenberg%3F\"><h3>Does this work with Gutenberg?<\/h3><\/dt>\n<dd><p>Yes! When inserting media in the block editor, you can filter by folder using the sidebar in the Media Library modal.<\/p><\/dd>\n<dt id=\"can%20i%20assign%20media%20to%20multiple%20folders%3F\"><h3>Can I assign media to multiple folders?<\/h3><\/dt>\n<dd><p>No, each media item belongs to one folder at a time. Moving media to a new folder removes it from the previous folder.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20delete%20a%20folder%3F\"><h3>What happens if I delete a folder?<\/h3><\/dt>\n<dd><p>Only the folder organization is removed. Your media files are not deleted.<\/p><\/dd>\n<dt id=\"is%20this%20compatible%20with%20my%20theme%3F\"><h3>Is this compatible with my theme?<\/h3><\/dt>\n<dd><p>Virtual Media Folders works entirely within the WordPress admin. It doesn't affect your front-end theme.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>2.0.3<\/h4>\n\n<ul>\n<li>Added: <code>vmfo\/create-folder<\/code> MCP ability (requires <code>manage_categories<\/code> capability)<\/li>\n<li>Added: MCP integration guide (<code>docs\/mcp.md<\/code>) with client configs for Claude, GitHub Copilot, and Cursor<\/li>\n<li>Added: Agent skill for content-based image foldering (<code>.github\/skills\/add-photo-to-folder\/SKILL.md<\/code>)<\/li>\n<li>Changed: Smoke test script extended with optional mutating step (<code>VMFO_RUN_MUTATING_TESTS=1<\/code>)<\/li>\n<\/ul>\n\n<h4>2.0.2<\/h4>\n\n<ul>\n<li>Fixed: Updated ability validator return type hints to <code>bool|WP_Error<\/code> for broader parser compatibility in release\/pre-commit environments<\/li>\n<\/ul>\n\n<h4>2.0.1<\/h4>\n\n<ul>\n<li>Added: Abilities API integration with <code>vmfo\/list-folders<\/code> and <code>vmfo\/add-to-folder<\/code><\/li>\n<li>Added: MCP adapter smoke test script for development and CI (<code>scripts\/mcp-adapter-smoke-test.sh<\/code>)<\/li>\n<li>Changed: MCP adapter examples now use gateway execution via <code>mcp-adapter-execute-ability<\/code><\/li>\n<li>Changed: Documentation examples standardized to use <code>https:\/\/example.com<\/code><\/li>\n<li>Changed: Excluded <code>scripts\/<\/code> from WordPress.org distribution package<\/li>\n<\/ul>\n\n<h4>2.0.0<\/h4>\n\n<ul>\n<li>Added: Add-on base classes (<code>AbstractPlugin<\/code>, <code>AbstractSettingsTab<\/code>, <code>ActionSchedulerLoader<\/code>) in <code>VirtualMediaFolders\\Addon<\/code> namespace<\/li>\n<li>Added: Shared WP 7.0+ compatibility CSS for add-on settings tabs<\/li>\n<li>Added: Comprehensive add-on development documentation<\/li>\n<\/ul>\n\n<h4>1.9.0<\/h4>\n\n<ul>\n<li>Added: WordPress 7.0+ UI compatibility layer (<code>vmfo_is_wp7()<\/code> helper function)<\/li>\n<li>Added: Conditional WP 7+ style overrides for admin sidebar and editor modal<\/li>\n<\/ul>\n\n<h4>1.8.3<\/h4>\n\n<ul>\n<li>Security: Updated npm and Composer dependencies to address dependabot alerts<\/li>\n<\/ul>\n\n<h4>1.8.2<\/h4>\n\n<ul>\n<li>Changed: Tested up to WordPress 7.0<\/li>\n<li>Fixed: Folder icon alignment in media toolbar on WordPress 7.0<\/li>\n<\/ul>\n\n<h4>1.8.1<\/h4>\n\n<ul>\n<li>Added: <code>vmfo_upload_folder<\/code> filter for controlling folder assignment on upload<\/li>\n<li>Added: Attachment metadata now available to upload-folder filter callbacks<\/li>\n<li>Added: Add-ons can override the default folder by hooking <code>vmfo_upload_folder<\/code><\/li>\n<\/ul>\n\n<h4>1.8.0<\/h4>\n\n<ul>\n<li>Changed: Sidebar preference stored server-side in user meta instead of localStorage<\/li>\n<li>Changed: Folder toggle button is PHP-rendered instead of JS-injected<\/li>\n<li>Changed: View switching (grid\/list\/folder) handled entirely server-side via mode URL parameter<\/li>\n<li>Changed: Sidebar defaults to visible on plugin activation<\/li>\n<li>Added: REST endpoint POST \/vmfo\/v1\/preferences for sidebar preference<\/li>\n<li>Added: vmfo_is_sidebar_visible() helper function<\/li>\n<li>Added: Activation hook sets sidebar visible for activating user<\/li>\n<li>Fixed: Folder sidebar no longer disappears after browser cache clearing<\/li>\n<li>Fixed: Grid\/list view switching now works reliably (no async race condition)<\/li>\n<li>Fixed: Folder icon always appears on Media Library page after activation<\/li>\n<li>Removed: folder-button.js (replaced by PHP output)<\/li>\n<li>Removed: localStorage dependency for sidebar state<\/li>\n<\/ul>\n\n<h4>1.7.2<\/h4>\n\n<ul>\n<li>NOTE: The plugin updater for add-ons is still in early stages and may not be fully reliable. Pleas update add-ons manually from their GitHub repositories for now.<\/li>\n<li>Added: Add-on version checker displays admin notices when installed add-ons need updates<\/li>\n<li>Added: New AddonChecker class monitors vmfa-ai-organizer, vmfa-rules-engine, vmfa-editorial-workflow, and vmfa-media-cleanup versions<\/li>\n<li>Added: Notices only appear on Media Library pages<\/li>\n<li>Added: PHPUnit tests for AddonChecker class<\/li>\n<\/ul>\n\n<h4>1.7.1<\/h4>\n\n<ul>\n<li>Fixed: Version constant now reflects actual plugin version (was hardcoded to 1.3.8)<\/li>\n<li>Fixed: Added ABSPATH guards to all source files<\/li>\n<li>Fixed: Sanitize orderby parameter in Taxonomy<\/li>\n<li>Changed: Extracted inline JavaScript and CSS to enqueued files<\/li>\n<li>Changed: Added phpcs.xml linting configuration<\/li>\n<\/ul>\n\n<h4>1.7.0<\/h4>\n\n<ul>\n<li>Added: Subtab navigation system for add-on settings integration<\/li>\n<li>Added: Parent plugin now renders subtab nav when add-ons register subtabs array<\/li>\n<li>Added: CSS spacing fix for tabs without subtab navigation<\/li>\n<li>Added: Enhanced addon-development.md documentation for subtab system<\/li>\n<li>Changed: Add-on tabs can now include optional <code>subtabs<\/code> array for secondary navigation<\/li>\n<li>Changed: Improved settings page architecture for better add-on UX<\/li>\n<\/ul>\n\n<h4>1.6.8<\/h4>\n\n<ul>\n<li>Fixed: Removed Media Folders metabox from attachment edit screen (folders are managed via the media library sidebar)<\/li>\n<\/ul>\n\n<h4>1.6.7<\/h4>\n\n<ul>\n<li>Changed: Updated @wordpress\/scripts to 31.3.0<\/li>\n<li>Changed: Updated vitest to 4.0.18<\/li>\n<\/ul>\n\n<h4>1.6.6<\/h4>\n\n<ul>\n<li>Added: New <code>vmfo_can_delete_folder<\/code> filter allows add-ons to prevent folder deletion<\/li>\n<li>Added: New <code>\/folders\/{id}\/can-delete<\/code> REST endpoint for checking folder deletability<\/li>\n<li>Added: Delete modal now shows blocked message when folder cannot be deleted<\/li>\n<li>Fixed: Sticky sidebar header now works correctly using flexbox layout<\/li>\n<li>Documentation: Added <code>vmfo_can_delete_folder<\/code> hook and REST endpoint documentation<\/li>\n<li>Documentation: Added JavaScript Translation Mapping (i18n-map.json) documentation<\/li>\n<\/ul>\n\n<h4>1.6.5<\/h4>\n\n<ul>\n<li>Fixed: Deleting a folder now selects \"Uncategorized\" instead of \"All Media\" when \"Show All Media\" setting is disabled<\/li>\n<\/ul>\n\n<h4>1.6.4<\/h4>\n\n<ul>\n<li>Fixed: REST API now returns proper 400 status code instead of 500 when creating duplicate folders<\/li>\n<li>Fixed: Error messages now use \"folder\" terminology instead of \"term\" for better user experience<\/li>\n<\/ul>\n\n<h4>1.6.3<\/h4>\n\n<ul>\n<li>Fixed: Folder counts now update automatically when media is deleted (single or bulk delete)<\/li>\n<li>Documentation: Add-on bootstrap example now includes <code>Requires Plugins<\/code> header (WordPress 6.5+)<\/li>\n<\/ul>\n\n<h4>1.6.2<\/h4>\n\n<ul>\n<li>Fixed: \"Add Media File\" button now respects \"Show All Media\" setting<\/li>\n<li>Fixed: Block editor folder sidebar now defaults to Uncategorized when \"Show All Media\" is disabled<\/li>\n<li>Fixed: Prevented duplicate folder selection callbacks and state updates after component unmount<\/li>\n<li>Fixed: Added proper cleanup for sticky sidebar event listeners to prevent memory leaks<\/li>\n<li>Changed: Folder cache now prefers PHP-preloaded data over localStorage<\/li>\n<li>Changed: Exposed <code>vmfRefreshMediaLibrary<\/code> globally for add-on use<\/li>\n<li>Documentation: Updated development docs with accurate REST API endpoints and hooks<\/li>\n<\/ul>\n\n<h4>1.6.1<\/h4>\n\n<ul>\n<li>Changed: Add-on tabs are now sorted alphabetically by title in the settings page<\/li>\n<li>Documentation: Added comprehensive <a href=\"https:\/\/github.com\/soderlind\/virtual-media-folders\/blob\/main\/docs\/addon-development.md\">Add-on Development Guide<\/a> with philosophy, architecture, and implementation details<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>Added: Add-on Tab System - Settings page now supports tabs for add-on plugins<\/li>\n<li>Added: Add-ons can register their settings as tabs within \"Folder Settings\"<\/li>\n<li>Added: New <code>vmfo_settings_tabs<\/code> filter for add-on registration<\/li>\n<li>Added: New <code>vmfo_settings_enqueue_scripts<\/code> action for conditional script loading<\/li>\n<li>Added: <code>SUPPORTS_ADDON_TABS<\/code> constant for add-on compatibility detection<\/li>\n<li>Added: <a href=\"https:\/\/github.com\/soderlind\/virtual-media-folders\/blob\/main\/docs\/addon-integration.md\"><code>docs\/addon-integration.md<\/code><\/a> with comprehensive add-on development guide<\/li>\n<li>Changed: Settings page refactored to use tab-based navigation<\/li>\n<li>Changed: <code>PAGE_SLUG<\/code> constant is now public for add-on access<\/li>\n<\/ul>\n\n<h4>1.5.3<\/h4>\n\n<ul>\n<li>Fixed: Updated Norwegian translations for Rules Engine integration strings<\/li>\n<\/ul>\n\n<h4>1.5.2<\/h4>\n\n<ul>\n<li>Changed: Default Folder setting now links to Rules Engine settings when VMFA Rules Engine add-on is active<\/li>\n<\/ul>\n\n<h4>1.5.1<\/h4>\n\n<ul>\n<li>Fixed: Folder sidebar now repositions immediately when WordPress Help panel is opened, closed, or tabs are switched<\/li>\n<li>Fixed: Added debouncing to prevent redundant sidebar position recalculations<\/li>\n<li>Fixed: Memory leak from event listeners not being cleaned up on sidebar removal<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Added: Folder search\/filter functionality in sidebar header for both Media Library and Gutenberg modal<\/li>\n<li>Added: Search icon appears when there are more than 10 top-level folders<\/li>\n<li>Added: Search automatically expands parent folders to show matching subfolders<\/li>\n<li>Added: Norwegian translations for search UI strings<\/li>\n<li>Changed: Gutenberg modal sidebar header now has contrasting background<\/li>\n<\/ul>\n\n<h4>1.4.2<\/h4>\n\n<ul>\n<li>Fixed: Removed unintended folder name padding in Gutenberg media modal for folders without children<\/li>\n<\/ul>\n\n<h4>1.4.1<\/h4>\n\n<ul>\n<li>Fixed: Folder names for folders without children now align vertically with folder names of folders that have children in the sidebar<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Added: Sticky sidebar header - folder management buttons now stay visible when scrolling the folder list<\/li>\n<\/ul>\n\n<h4>1.3.9<\/h4>\n\n<ul>\n<li>Fixed: Grid\/List view icons now correctly show all media instead of forcing folder mode<\/li>\n<li>Fixed: Folder icon now respects \"Show All Media\" setting<\/li>\n<li>Fixed: URL encoding issue causing duplicate vmfo_folder parameter<\/li>\n<li>Fixed: Memory leaks from event listeners when hiding folder view<\/li>\n<li>Fixed: Race condition where duplicate folder button was created<\/li>\n<\/ul>\n\n<h4>1.3.8<\/h4>\n\n<ul>\n<li>Changed: Hide (0) count on folders with subfolders to avoid confusion about empty folder branches<\/li>\n<\/ul>\n\n<h4>1.3.7<\/h4>\n\n<ul>\n<li>Changed: Sidebar top now aligns horizontally with attachments-wrapper instead of first thumbnail<\/li>\n<\/ul>\n\n<h4>1.3.6<\/h4>\n\n<ul>\n<li>Fixed: Folder sidebar now properly extends to viewport bottom and scrolls when content exceeds screen height<\/li>\n<li>Fixed: Sidebar uses fixed positioning to avoid clipping by parent containers<\/li>\n<li>Improved: Sidebar top alignment with first image thumbnail<\/li>\n<\/ul>\n\n<h4>1.3.5<\/h4>\n\n<ul>\n<li>Fixed: React hook order error when entering bulk select mode<\/li>\n<li>Fixed: Race condition in folder refresh when moving media<\/li>\n<li>Improved: Bulk move folder dropdown now ordered like folder tree with hierarchy<\/li>\n<\/ul>\n\n<h4>1.3.4<\/h4>\n\n<ul>\n<li>Added: Direct URL support for folder view via upload.php?mode=folder<\/li>\n<li>Fixed: Clicking folder icon from list view now correctly opens folder view<\/li>\n<\/ul>\n\n<h4>1.3.3<\/h4>\n\n<ul>\n<li>Changed: Media folders taxonomy screen now mirrors sidebar ordering<\/li>\n<li>Changed: Removed sortable header UI from the Media Folders taxonomy list table<\/li>\n<li>Changed: Media Folders taxonomy UI is only visible when WP_DEBUG is true<\/li>\n<\/ul>\n\n<h4>1.3.2<\/h4>\n\n<ul>\n<li>Changed: Folder counts endpoint now avoids per-folder queries for better performance<\/li>\n<li>Fixed: Suggestions REST response now matches stored suggestion labels (string-based suggestions)<\/li>\n<li>Fixed: Admin UI hardened notice rendering to avoid HTML injection<\/li>\n<li>Fixed: Admin UI reduced risk of duplicate event handlers\/observers when scripts re-run<\/li>\n<\/ul>\n\n<h4>1.3.1<\/h4>\n\n<ul>\n<li>Fixed: Settings page default folder dropdown now uses correct taxonomy (vmfo_folder)<\/li>\n<li>Fixed: Block editor folder filter now uses correct REST API endpoint (\/wp\/v2\/vmfo_folder)<\/li>\n<li>Fixed: REST API schema title updated to vmfo-folder for consistency<\/li>\n<li>Fixed: Folder drag-drop reorder now persists correctly after page refresh<\/li>\n<\/ul>\n\n<h4>1.3.0<\/h4>\n\n<ul>\n<li>Changed: Renamed all prefixes from VMF_ to VMFO_ for WordPress.org compliance<\/li>\n<li>Changed: Renamed taxonomy from media_folder to vmfo_folder for uniqueness<\/li>\n<li>Changed: Inline CSS now uses wp_add_inline_style() instead of embedded style tag<\/li>\n<li>Removed: GitHub update checker (WordPress.org handles updates)<\/li>\n<li>Added: Automatic migration for existing folder assignments from old taxonomy<\/li>\n<li>Added: .distignore file for proper distribution builds<\/li>\n<\/ul>\n\n<h4>1.2.3<\/h4>\n\n<ul>\n<li>Changed: \"All Media\" folder now disabled by default in settings<\/li>\n<\/ul>\n\n<h4>1.2.2<\/h4>\n\n<ul>\n<li>Fixed: REST API now returns all folders (removed meta_key ordering that excluded folders without vmf_order)<\/li>\n<\/ul>\n\n<h4>1.2.1<\/h4>\n\n<ul>\n<li>Changed: Updated i18n-map.json with new accessibility component mappings<\/li>\n<li>Changed: Updated Norwegian (nb_NO) translations for all new accessibility strings<\/li>\n<\/ul>\n\n<h4>1.2.0<\/h4>\n\n<ul>\n<li>Added: Keyboard-accessible move mode - press M to pick up media, arrow keys to navigate, Enter to drop<\/li>\n<li>Added: Screen reader announcements for all move mode actions<\/li>\n<li>Added: MoveModeBanner visual feedback during keyboard move mode<\/li>\n<li>Added: LiveRegion component for ARIA live announcements<\/li>\n<li>Added: useAnnounce and useMoveMode hooks for accessibility features<\/li>\n<li>Added: Visual drop target highlighting on folders during move mode<\/li>\n<li>Fixed: Screen reader instructions properly hidden from visual display<\/li>\n<li>Fixed: Enter key drops to folder without navigating during move mode<\/li>\n<li>Fixed: \"Jump to Folder After Move\" setting respected for keyboard moves<\/li>\n<li>Fixed: Mouse drag now cancels keyboard move mode to prevent conflicts<\/li>\n<\/ul>\n\n<h4>1.1.7<\/h4>\n\n<ul>\n<li>Added: Auto-jump to target folder when moving the last file(s) from a folder<\/li>\n<\/ul>\n\n<h4>1.1.6<\/h4>\n\n<ul>\n<li>Added: New bulk move AJAX endpoint for efficient bulk operations<\/li>\n<li>Performance: Bulk move now uses single AJAX request instead of one per file<\/li>\n<li>Fixed: Missing sprintf import causing error when selecting files in bulk mode<\/li>\n<li>Fixed: Sidebar visibility preserved when browser re-renders during bulk select mode<\/li>\n<\/ul>\n\n<h4>1.1.5<\/h4>\n\n<ul>\n<li>Performance: Optimistic folder loading with localStorage caching for instant sidebar display<\/li>\n<li>Performance: Reduced API calls - secondary components read from cache instead of fetching<\/li>\n<li>Fixed: Eliminated layout shift with critical inline CSS for sidebar positioning<\/li>\n<li>Fixed: Folder order now persists correctly when dropping files on folders<\/li>\n<li>Fixed: REST API now returns vmf_order for proper client-side sorting<\/li>\n<\/ul>\n\n<h4>1.1.4<\/h4>\n\n<ul>\n<li>Refactored: PHP REST API with shared helpers for capability checks, folder\/attachment lookups<\/li>\n<li>Refactored: Settings class with centralized option retrieval and visibility enforcement<\/li>\n<li>Refactored: Admin class now uses Taxonomy::TAXONOMY constant instead of hardcoded strings<\/li>\n<li>Refactored: JavaScript folder API calls consolidated into shared utility<\/li>\n<li>Fixed: Test mock for useFolderData to properly handle parse:false API responses<\/li>\n<li>Removed: Unused SortableFolderList.jsx component<\/li>\n<\/ul>\n\n<h4>1.1.3<\/h4>\n\n<ul>\n<li>Fixed: Block editor media modal now respects \"Show All Media\" and \"Show Uncategorized\" settings<\/li>\n<li>Fixed: Folder sidebar in Gutenberg modal matches Media Library settings visibility<\/li>\n<li>Changed: Replaced <code>wp_localize_script<\/code> with <code>wp_add_inline_script<\/code> for proper boolean handling in JS config<\/li>\n<\/ul>\n\n<h4>1.1.2<\/h4>\n\n<ul>\n<li>Fixed: Default folder filter not applying on initial page load when \"Show All Media\" is disabled<\/li>\n<li>Fixed: Media Library now correctly shows only uncategorized files on load when Uncategorized is the default<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Fixed: 500 error on plugin information page when GitHub API returns null<\/li>\n<li>Fixed: Added defensive handling for null plugin info in GitHubPluginUpdater<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>Added: Drag-and-drop folder reordering with visible grip handle<\/li>\n<li>Added: Custom folder order persists via vmf_order term meta<\/li>\n<li>Added: Optimistic UI updates for instant visual feedback during reorder<\/li>\n<li>Changed: Consolidated drag-drop implementation for better performance<\/li>\n<li>Changed: Removed unused DndContext and DraggableMedia components (smaller bundle)<\/li>\n<li>Fixed: Folder reorder now updates instantly without waiting for server response<\/li>\n<\/ul>\n\n<h4>1.0.7<\/h4>\n\n<ul>\n<li>Added: Contextual help tab \"Virtual Folders\" on Media Library page<\/li>\n<li>Added: GitHub repository link in contextual help sidebar<\/li>\n<\/ul>\n\n<h4>1.0.6<\/h4>\n\n<ul>\n<li>Added: Filter hooks for settings (<code>vmf_default_settings<\/code>, <code>vmf_settings<\/code>, <code>vmf_setting_{$key}<\/code>)<\/li>\n<li>Added: When \"Show All Media\" is disabled, \"Uncategorized\" becomes the default folder<\/li>\n<li>Changed: Removed \"Sidebar Default Visible\" setting (now uses localStorage)<\/li>\n<li>Changed: Consolidated settings into single \"Default Behavior\" section<\/li>\n<li>Fixed: Settings checkbox interdependency now saves correctly<\/li>\n<\/ul>\n\n<h4>1.0.5<\/h4>\n\n<ul>\n<li>Housekeeping<\/li>\n<\/ul>\n\n<h4>1.0.4<\/h4>\n\n<ul>\n<li>Fixed: Removed duplicate item removal logic in DroppableFolder to prevent event conflicts<\/li>\n<li>Fixed: Single file drag-drop now correctly delegates view refresh to refreshMediaLibrary()<\/li>\n<\/ul>\n\n<h4>1.0.3<\/h4>\n\n<ul>\n<li>Fixed: Moving files from \"All Media\" view no longer removes them from view (both bulk and single file moves)<\/li>\n<li>Fixed: Sort order is now preserved when moving files from \"All Media\" view<\/li>\n<\/ul>\n\n<h4>1.0.2<\/h4>\n\n<ul>\n<li>Fixed: Updated all \"Media Manager\" references in source comments to \"Virtual Media Folders\"<\/li>\n<li>Fixed: Updated console.error message in media-library.js<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fixed: Updated REST API paths from mediamanager\/v1 to vmf\/v1<\/li>\n<li>Fixed: Updated custom event names from mediamanager: to vmf: prefix<\/li>\n<li>Fixed: Updated WordPress filter name from mediamanager\/folder-filter to vmf\/folder-filter<\/li>\n<li>Fixed: Updated all text domains in Settings.php commented code<\/li>\n<li>Fixed: Renamed MediaManagerDndProvider to VmfDndProvider<\/li>\n<li>Fixed: Updated test namespaces from MediaManagerTests to VirtualMediaFolders\\Tests<\/li>\n<li>Fixed: Regenerated translation files with correct references<\/li>\n<li>Fixed: Regenerated composer autoload files<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li><strong>Major Release<\/strong>: Complete plugin rename from \"Media Manager\" to \"Virtual Media Folders\"<\/li>\n<li>Changed: New plugin slug \"virtual-media-folders\"<\/li>\n<li>Changed: Updated PHP namespace from MediaManager to VirtualMediaFolders<\/li>\n<li>Changed: Updated constants from MEDIAMANAGER_* to VMF_*<\/li>\n<li>Changed: Updated REST API namespace from mediamanager\/v1 to vmf\/v1<\/li>\n<li>Changed: Updated CSS class prefixes from mm- to vmf-<\/li>\n<li>Changed: Updated JavaScript globals from mediaManagerData to vmfData<\/li>\n<li>Changed: Updated text domain from mediamanager to virtual-media-folders<\/li>\n<li>Changed: Renamed translation files to use new text domain<\/li>\n<li>Note: Breaking change - customizations using old namespace\/classes need updating<\/li>\n<\/ul>\n\n<h4>0.1.17<\/h4>\n\n<ul>\n<li>Fixed: Plugin Check compliance - added phpcs:ignore comments for false positives<\/li>\n<li>Fixed: Prefixed global variables in uninstall.php<\/li>\n<li>Fixed: Removed error_log debug function from GitHubPluginUpdater<\/li>\n<\/ul>\n\n<h4>0.1.16<\/h4>\n\n<ul>\n<li>Added: uninstall.php for clean plugin removal (deletes folders, settings, transients, user meta)<\/li>\n<li>Changed: Updated folder structure in README.md to reflect PSR-4 changes<\/li>\n<\/ul>\n\n<h4>0.1.15<\/h4>\n\n<ul>\n<li>Added: Collapsing a parent folder now moves selection to the parent when a child folder is selected<\/li>\n<li>Added: ArrowLeft keyboard navigation moves to parent folder when subfolder is collapsed or has no children<\/li>\n<\/ul>\n\n<h4>0.1.14<\/h4>\n\n<ul>\n<li>Added: Edit Folder modal now includes Parent Folder selector to move folders within hierarchy<\/li>\n<li>Changed: \"Rename Folder\" modal renamed to \"Edit Folder\" for name and location changes<\/li>\n<\/ul>\n\n<h4>0.1.13<\/h4>\n\n<ul>\n<li>Added: New \"Show All Media\" setting to show\/hide the All Media option in sidebar<\/li>\n<li>Changed: Removed \"Enable Drag &amp; Drop\" setting - always enabled (use bulk move as alternative)<\/li>\n<li>Changed: All settings now functional - Default Folder auto-assigns uploads, Show Uncategorized controls folder visibility, Sidebar Default Visible controls initial state<\/li>\n<li>Fixed: Sidebar position resets properly when uploader visibility changes<\/li>\n<\/ul>\n\n<h4>0.1.12<\/h4>\n\n<ul>\n<li>Changed: \"Jump to Folder After Move\" setting now defaults to unchecked (disabled)<\/li>\n<\/ul>\n\n<h4>0.1.11<\/h4>\n\n<ul>\n<li>Fixed: When \"Jump to Folder After Move\" is disabled, moved files are now removed from the source folder view<\/li>\n<\/ul>\n\n<h4>0.1.10<\/h4>\n\n<ul>\n<li>Fixed: Sort order is now preserved after moving files between folders<\/li>\n<\/ul>\n\n<h4>0.1.9<\/h4>\n\n<ul>\n<li>Added: New \"Jump to Folder After Move\" setting (enabled by default) to control whether view switches to target folder after moving files<\/li>\n<li>Added: URL now uses <code>mode=folder<\/code> parameter when folder view is active<\/li>\n<li>Changed: Bulk select mode is now automatically disabled after bulk moving files<\/li>\n<li>Changed: Smart Suggestions settings hidden until feature is fully implemented<\/li>\n<\/ul>\n\n<h4>0.1.8<\/h4>\n\n<ul>\n<li>Added: Folder item counts now reflect the selected media type filter (Images, Videos, Audio, Documents)<\/li>\n<li>Added: New REST API endpoint for filtered folder counts<\/li>\n<\/ul>\n\n<h4>0.1.7<\/h4>\n\n<ul>\n<li>Added: After bulk moving files, focus automatically switches to the target folder<\/li>\n<\/ul>\n\n<h4>0.1.6<\/h4>\n\n<ul>\n<li>Fixed: Folder dropdowns now dynamically update when folders are added, renamed, or deleted<\/li>\n<li>Changed: BulkFolderAction and MoveToFolderMenu now listen for folder change events<\/li>\n<\/ul>\n\n<h4>0.1.5<\/h4>\n\n<ul>\n<li>Changed: VMF_VERSION now uses actual version number in production (WP_DEBUG=false)<\/li>\n<li>Removed: Debug console.log statements from JavaScript<\/li>\n<\/ul>\n\n<h4>0.1.4<\/h4>\n\n<ul>\n<li>Changed: Refactored PHP classes to PSR-4 autoloading structure<\/li>\n<li>Changed: Moved class files from includes\/ to src\/ directory<\/li>\n<li>Changed: Renamed classes to follow PSR-4 naming conventions (REST_API \u2192 RestApi, GitHub_Plugin_Updater \u2192 GitHubPluginUpdater)<\/li>\n<\/ul>\n\n<h4>0.1.3<\/h4>\n\n<ul>\n<li>Housekeeping<\/li>\n<\/ul>\n\n<h4>0.1.2<\/h4>\n\n<ul>\n<li>Changed: Refactored folder sidebar to share code between Media Library and Gutenberg modal<\/li>\n<li>Changed: Created shared hooks and base components for folder tree<\/li>\n<li>Added: Focus moves to Uncategorized or All Media after deleting a folder<\/li>\n<li>Added: Comprehensive code documentation throughout<\/li>\n<\/ul>\n\n<h4>0.1.1<\/h4>\n\n<ul>\n<li>Fixed: Sticky sidebar now works correctly in Gutenberg media modal<\/li>\n<li>Fixed: Improved scroll detection for modal attachments wrapper<\/li>\n<\/ul>\n\n<h4>0.1.0<\/h4>\n\n<ul>\n<li>Initial release<\/li>\n<li>Virtual folder organization<\/li>\n<li>Drag and drop support<\/li>\n<li>Sticky sidebar with fixed positioning on scroll<\/li>\n<li>Bulk move action with compact UI<\/li>\n<li>Gutenberg integration with folder sidebar<\/li>\n<li>Settings page<\/li>\n<li>Norwegian Bokm\u00e5l translation<\/li>\n<\/ul>","raw_excerpt":"Virtual folder organization and intelligent management for the WordPress Media Library, without altering file locations on disk.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/266360","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=266360"}],"author":[{"embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/pers"}],"wp:attachment":[{"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=266360"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=266360"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=266360"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=266360"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=266360"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/pcd.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=266360"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}