{"id":335512,"date":"2026-07-05T07:46:11","date_gmt":"2026-07-05T07:46:11","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/sawir-media-folders\/"},"modified":"2026-07-06T14:00:55","modified_gmt":"2026-07-06T14:00:55","slug":"sawir-media-folders","status":"publish","type":"plugin","link":"https:\/\/hi.wordpress.org\/plugins\/sawir-media-folders\/","author":18200539,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.0.1","stable_tag":"1.0.1","tested":"7.0","requires":"5.8","requires_php":"7.4","requires_plugins":null,"header_name":"Sawir Media Folders","header_author":"Ricardo Sawir","header_description":"Fast, unlimited folders for the WordPress media library with drag & drop.","assets_banners_color":"","last_updated":"2026-07-06 14:00:55","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/wordpress.org\/plugins\/sawir-media-folders\/","header_author_uri":"https:\/\/sawirstudio.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":57,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"sawirricardo","date":"2026-07-05 07:45:44"},"1.0.1":{"tag":"1.0.1","author":"sawirricardo","date":"2026-07-06 14:00:55"}},"upgrade_notice":[],"ratings":[],"assets_icons":[],"assets_banners":[],"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.0.0","1.0.1"],"block_files":[],"assets_screenshots":[],"screenshots":[]},"plugin_section":[],"plugin_tags":[1346,9747,84,233,6655],"plugin_category":[50],"plugin_contributors":[262686],"plugin_business_model":[],"class_list":["post-335512","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-sawirricardo","plugin_committers-sawirricardo"],"banners":[],"icons":{"svg":false,"icon":"https:\/\/s.w.org\/plugins\/geopattern-icon\/sawir-media-folders.svg","icon_2x":false,"generated":true},"screenshots":[],"raw_content":"<!--section=description-->\n<p>Organize your media library into folders and subfolders. No folder limits, no upsells.<\/p>\n\n<ul>\n<li><strong>Unlimited folders and subfolders<\/strong> \u2014 no caps.<\/li>\n<li><strong>Fast<\/strong> \u2014 the whole folder tree loads with two database queries, regardless of library size. Filtering uses WordPress's native media query.<\/li>\n<li><strong>Safe<\/strong> \u2014 folders are virtual (a taxonomy). Physical files never move, so no URL ever breaks. Deleting a folder never deletes files.<\/li>\n<\/ul>\n\n<h3>How it works<\/h3>\n\n<p><strong>Where folders appear<\/strong><\/p>\n\n<ul>\n<li><em>Media \u2192 Library (grid view)<\/em>: the full folder tree panel with drag &amp; drop. The panel does not appear in list view.<\/li>\n<li><em>Media modals<\/em> (post editor, featured image, galleries): the same folder tree, docked on the left of the file browser. Hidden on small screens.<\/li>\n<\/ul>\n\n<p><strong>The tree panel<\/strong><\/p>\n\n<ul>\n<li><em>All files<\/em> shows everything; <em>Uncategorized<\/em> shows files not in any folder.<\/li>\n<li>Folder counts include files in subfolders.<\/li>\n<li>Folders with subfolders show a \u25be arrow \u2014 click it to collapse or expand. Collapse state is remembered per browser.<\/li>\n<li>The \u00ab button in the panel header minimizes the whole panel to a slim strip (\u00bb restores it). Remembered per browser, applies to the grid and modals alike.<\/li>\n<li>Drag the panel's right edge to resize it. The width is remembered per browser and shared between the grid and modals.<\/li>\n<li><em>New<\/em> creates a top-level folder. Hover a folder for its actions: <strong>+<\/strong> new subfolder, <strong>\u270e<\/strong> rename, <strong>\u00d7<\/strong> delete.<\/li>\n<li>Rename inline: double-click a folder's name (or click <strong>\u270e<\/strong>), type the new name, press Enter. Esc cancels.<\/li>\n<li>A file lives in exactly one folder at a time.<\/li>\n<\/ul>\n\n<p><strong>Sorting<\/strong><\/p>\n\n<p>The Sort row under the panel header orders the files shown on the right \u2014 by date, modified, name, or author, ascending or descending. It applies to whichever folder (or All files) is selected. Sorting by file size isn't offered: WordPress doesn't store attachment sizes in a sortable way.<\/p>\n\n<p><strong>Putting files in folders<\/strong><\/p>\n\n<ul>\n<li>Drag any file from the grid onto a folder \u2014 on the Media Library page or inside a media modal.<\/li>\n<li>To move several at once: <em>Bulk select<\/em> (or in a modal, just select multiple), pick files, drag the selection onto a folder.<\/li>\n<li>Drag files onto <em>Uncategorized<\/em> to remove them from their folder.<\/li>\n<\/ul>\n\n<p><strong>Moving and reordering folders<\/strong><\/p>\n\n<p>Drag a folder onto another folder. The drop position decides what happens:<\/p>\n\n<ul>\n<li><em>Top edge<\/em> (line above): insert <strong>before<\/strong> that folder.<\/li>\n<li><em>Bottom edge<\/em> (line below): insert <strong>after<\/strong> that folder.<\/li>\n<li><em>Middle<\/em> (dashed outline): nest <strong>inside<\/strong> that folder, after its existing children.<\/li>\n<li>Dropping on <em>All files<\/em> or <em>Uncategorized<\/em> moves the folder to the top of the root level.<\/li>\n<li>Prefer buttons? Hover a folder: <strong>\u2191 \/ \u2193<\/strong> move it among its siblings, <strong>\u21c4<\/strong> opens a dropdown to pick a new parent folder (or top level).<\/li>\n<li>A folder cannot be moved into its own subtree.<\/li>\n<li>Untouched folders sort alphabetically; once you drag one, its siblings keep your manual order.<\/li>\n<\/ul>\n\n<p><strong>Downloading a folder<\/strong><\/p>\n\n<p>Hover a folder and click <strong>\u2b07<\/strong> to download it as a zip. Subfolders are included as folders inside the zip; duplicate filenames are auto-renamed (photo.jpg, photo-2.jpg).<\/p>\n\n<p><strong>Deleting a folder<\/strong><\/p>\n\n<p>Files are kept and become uncategorized. Subfolders move up one level (to the deleted folder's parent).<\/p>\n\n<h3>Automatic organization (for developers)<\/h3>\n\n<p>New uploads can be filed into folders automatically with the <code>sawirmf_auto_folder<\/code> filter. Return a folder path (created if missing), an existing folder ID, or null to leave the upload uncategorized. Nothing is auto-filed unless you add a rule \u2014 the default is off.<\/p>\n\n<p>File PDFs into \"Documents\", and WooCommerce product images into \"Products\":<\/p>\n\n<pre><code>add_filter( 'sawirmf_auto_folder', function ( $folder, $att_id, $attachment ) {\n    if ( 'application\/pdf' === $attachment-&gt;post_mime_type ) {\n        return 'Documents';\n    }\n    if ( 'product' === get_post_type( $attachment-&gt;post_parent ) ) {\n        return 'Products';\n    }\n    return $folder;\n}, 10, 3 );\n<\/code><\/pre>\n\n<p>File blog images by year (\"Blog\/2026\"):<\/p>\n\n<pre><code>add_filter( 'sawirmf_auto_folder', function ( $folder, $att_id, $attachment ) {\n    if ( 'post' === get_post_type( $attachment-&gt;post_parent ) ) {\n        return 'Blog\/' . get_the_date( 'Y', $attachment );\n    }\n    return $folder;\n}, 10, 3 );\n<\/code><\/pre>\n\n<p>Give each uploading user their own folder:<\/p>\n\n<pre><code>add_filter( 'sawirmf_auto_folder', function ( $folder, $att_id, $attachment ) {\n    $user = get_userdata( $attachment-&gt;post_author );\n    return $user ? 'Users\/' . $user-&gt;display_name : $folder;\n}, 10, 3 );\n<\/code><\/pre>\n\n<p>Notes:<\/p>\n\n<ul>\n<li>Paths are slash-separated and nest (\"Clients\/Acme\/Logos\" creates three levels as needed); existing folders are reused, never duplicated.<\/li>\n<li>Rules only run for uploads made while the plugin is active; existing files are untouched.<\/li>\n<li>Returning a folder ID that doesn't exist is ignored (the upload stays uncategorized).<\/li>\n<\/ul>\n\n<h3>Other plugins by Sawir Studio<\/h3>\n\n<ul>\n<li><a href=\"https:\/\/wordpress.org\/plugins\/sawir-live-translate\/\">Sawir Live Translate<\/a> \u2014 translate any front-end page live and let visitors switch languages.<\/li>\n<li><a href=\"https:\/\/wordpress.org\/plugins\/sawir-restock-notifier-for-woocommerce\/\">Sawir Restock Notifier for WooCommerce<\/a> \u2014 let customers request an email when an out-of-stock product is back.<\/li>\n<li><a href=\"https:\/\/wordpress.org\/plugins\/sawir-product-image-zoom-for-woocommerce\/\">Sawir Product Image Zoom for WooCommerce<\/a> \u2014 product image lightbox with navigation and click-to-zoom.<\/li>\n<li><a href=\"https:\/\/wordpress.org\/plugins\/sawir-variation-gallery-tools-woocommerce\/\">Sawir Variation Gallery Tools for WooCommerce<\/a> \u2014 manage variation-specific gallery images.<\/li>\n<li><a href=\"https:\/\/wordpress.org\/plugins\/sawir-role-capabilities-manager\/\">Sawir Role Capabilities Manager<\/a> \u2014 create custom user roles and manage capabilities.<\/li>\n<\/ul>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20folders%20change%20my%20file%20urls%3F\"><h3>Do folders change my file URLs?<\/h3><\/dt>\n<dd><p>No. Folders are purely organizational (a hidden taxonomy on attachments). Files stay exactly where WordPress uploaded them.<\/p><\/dd>\n<dt id=\"what%20happens%20if%20i%20deactivate%20or%20delete%20the%20plugin%3F\"><h3>What happens if I deactivate or delete the plugin?<\/h3><\/dt>\n<dd><p>Nothing breaks. Your files are untouched; folder assignments simply stop being displayed. Reactivate and they're back.<\/p><\/dd>\n<dt id=\"is%20there%20a%20folder%20limit%20in%20the%20free%20version%3F\"><h3>Is there a folder limit in the free version?<\/h3><\/dt>\n<dd><p>There is no paid version. Everything is free and unlimited.<\/p><\/dd>\n<dt id=\"where%20can%20i%20get%20support%20or%20report%20a%20bug%3F\"><h3>Where can I get support or report a bug?<\/h3><\/dt>\n<dd><p>Use the plugin's support forum on wordpress.org, or contact us at <a href=\"https:\/\/sawirstudio.com\">sawirstudio.com<\/a> \u2014 email ricardo@sawirstudio.com.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Add links to other Sawir Studio plugins.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>Initial release: folder tree in the media grid, drag &amp; drop for files and folders, drop-zone reordering (before\/after\/inside), folder filter dropdown in media modals.<\/li>\n<\/ul>","raw_excerpt":"Fast, unlimited folders for the WordPress media library with drag &amp; drop.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/hi.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/335512","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/hi.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/hi.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/hi.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=335512"}],"author":[{"embeddable":true,"href":"https:\/\/hi.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/sawirricardo"}],"wp:attachment":[{"href":"https:\/\/hi.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=335512"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/hi.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=335512"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/hi.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=335512"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/hi.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=335512"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/hi.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=335512"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/hi.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=335512"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}