Files
Jacek Pyziak 5014b9108f feat(media-folder-pro): add virtual folder system for WordPress media library
Custom WordPress plugin that replaces the default flat media library with
a structured folder view. Features: hierarchical folders via custom taxonomy,
sidebar folder tree, drag & drop, modal integration with Elementor/builders,
bulk assign, upload auto-assign, toast notifications.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-28 14:08:49 +01:00

65 lines
1.5 KiB
PHP

<?php
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
class MFP_Media_Query {
public function register(): void {
add_filter( 'ajax_query_attachments_args', [ $this, 'filter_by_folder' ] );
add_action( 'add_attachment', [ $this, 'assign_folder_on_upload' ] );
}
/**
* Assign folder to attachment during upload if mfp_folder_id is in POST data.
* This runs server-side during async-upload.php, so no race condition.
*/
public function assign_folder_on_upload( int $attachment_id ): void {
if ( empty( $_POST['mfp_folder_id'] ) ) {
return;
}
$folder_id = (int) $_POST['mfp_folder_id'];
if ( $folder_id <= 0 ) {
return;
}
wp_set_object_terms( $attachment_id, [ $folder_id ], MFP_Taxonomy::TAXONOMY );
}
/**
* Inject tax_query into media grid AJAX queries when media_folder param is present.
*
* @param array $query WP_Query args for attachment query.
* @return array Modified query args.
*/
public function filter_by_folder( array $query ): array {
if ( empty( $_REQUEST['query']['media_folder'] ) ) {
return $query;
}
$folder_id = (int) $_REQUEST['query']['media_folder'];
if ( ! isset( $query['tax_query'] ) ) {
$query['tax_query'] = [];
}
if ( $folder_id === -1 ) {
// Uncategorized: media without any folder.
$query['tax_query'][] = [
'taxonomy' => MFP_Taxonomy::TAXONOMY,
'operator' => 'NOT EXISTS',
];
} elseif ( $folder_id > 0 ) {
$query['tax_query'][] = [
'taxonomy' => MFP_Taxonomy::TAXONOMY,
'terms' => [ $folder_id ],
'field' => 'term_id',
];
}
return $query;
}
}