=== Bauhaus File Cleanup for Tainacan ===
Contributors: bauhaustech, marvila
Tags: tainacan, attachments, cleanup, uploads, disk-space
Requires at least: 5.5
Tested up to: 7.0
Requires PHP: 7.4
Stable tag: 1.0.0
License: GPLv2 or later
License URI: https://www.gnu.org/licenses/gpl-2.0.html

Removes a Tainacan item's documents, attachments and files from disk on permanent deletion, so deleted items stop leaving orphaned uploads behind.

== Description ==

Tainacan does not reliably remove uploaded files from disk when items are permanently deleted. In particular, files of **private items** — which Tainacan stores in prefixed `_x_<item_id>` folders — are left orphaned in the uploads directory, slowly bloating disk usage. Tainacan's own code documents this as an unresolved TODO (`Private_Files::rename_item_and_collection_folder_path` returns early on permanent deletion).

This add-on fixes that. While it is active, permanently deleting an item always removes its files by default. You can disable this behaviour from **Settings → Bauhaus File Cleanup for Tainacan** if you need to temporarily keep files while the plugin stays active.

This is an independent add-on developed by Bauhaus Tech. It is **not affiliated with, endorsed by, or part of** the Tainacan project.

It works by hooking WordPress' `before_delete_post`, which fires on every permanent deletion regardless of where it was triggered:

* the Tainacan admin trash (REST API);
* the bulk-edit "delete" background process;
* the WordPress admin "Empty Trash";
* WP-CLI (`wp tainacan ...` garbage collector);
* any other `wp_delete_post( $id, true )` call.

For each deleted Tainacan item it:

1. Deletes the remaining attachment posts (document, child attachments, thumbnail) forcing real file removal (bypassing the media trash).
2. Removes the item's dedicated upload folder recursively — covering WordPress-generated derivative image sizes and the private `_x_` folders — by reconstructing the path from the item and collection IDs instead of trusting the (often out-of-sync) attachment metadata.

When a whole collection is permanently deleted, its entire `tainacan-items/<collection_id>` folder is removed too.

== Important notes ==

* This is **destructive and irreversible**: files are deleted from disk, not sent to a trash. This is intentional — it is what the plugin exists to do.
* Each Tainacan item owns an isolated upload folder, so deleting it does not affect other items. The plugin does **not** scan metadata for attachments shared across items; if you reuse a single attachment across multiple items, deleting one item may remove that shared file.
* Sending an item to the trash does nothing — cleanup only happens on **permanent** deletion.

== Installation ==

1. Upload the `bauhaus-file-cleanup-for-tainacan` folder to `/wp-content/plugins/`, or install the ZIP via **Plugins → Add New → Upload Plugin**.
2. Activate the plugin through the "Plugins" menu in WordPress.
3. Ensure Tainacan is installed and active.
4. Visit **Settings → Bauhaus File Cleanup for Tainacan** to toggle the behaviour on or off. The plugin defaults to enabled.

== Frequently Asked Questions ==

= Does it delete files when I just trash an item? =

No. It only acts on permanent deletion (emptying the trash / "delete permanently").

= Can I keep the files? =

Visit **Settings → Bauhaus File Cleanup for Tainacan** and uncheck the toggle. The plugin stays active but stops removing files. You can also deactivate the plugin entirely — with it inactive, WordPress/Tainacan behave as before.

== Changelog ==

= 1.0.0 =
* Initial release. Fixes orphaned files left by Tainacan on permanent deletion — including the private items "_x_" folders. Includes a settings page under Settings → Bauhaus File Cleanup for Tainacan with an enable/disable toggle (defaults to enabled), path traversal protection, and recursive folder cleanup of all derivative sizes.
