Changeset 3442582
- Timestamp:
- 01/19/2026 01:41:30 PM (2 months ago)
- Location:
- folderra-smart-folder-organizer/trunk
- Files:
-
- 7 edited
-
readme.txt (modified) (2 diffs)
-
screenshot-1.png (modified) (previous)
-
screenshot-2.png (modified) (previous)
-
screenshot-3.png (modified) (previous)
-
screenshot-4.png (modified) (previous)
-
screenshot-5.png (modified) (previous)
-
wpsmartfolder.php (modified) (8 diffs)
Legend:
- Unmodified
- Added
- Removed
-
folderra-smart-folder-organizer/trunk/readme.txt
r3435017 r3442582 5 5 Tested up to: 6.9 6 6 Requires PHP: 7.4 7 Stable tag: 1. 0.27 Stable tag: 1.1.0 8 8 License: GPLv2 or later 9 9 License URI: https://www.gnu.org/licenses/gpl-2.0.html … … 87 87 == Changelog == 88 88 89 = 1.1.0 = 90 * Improved admin UI and overall user experience 91 * Enhanced folder management layout and interactions 92 * Improved loading states and visual feedback 93 * Better mobile usability in folder details 94 * Minor performance and UX refinements 95 89 96 = 1.0.2 = 90 97 * Improved: Folder Details UI with a cleaner, unified information bar. -
folderra-smart-folder-organizer/trunk/wpsmartfolder.php
r3435017 r3442582 4 4 * Plugin URI: https://wpsmartfolder.com 5 5 * Description: Organize your WordPress pages and posts with smart folders, drag & drop, and advanced structure management. 6 * Version: 1. 0.26 * Version: 1.1.0 7 7 * Author: DaveLabs 8 8 * Text Domain: folderra-smart-folder-organizer … … 21 21 22 22 // Main version constant 23 define('FOLD82SM_VERSION', '1. 0.2');23 define('FOLD82SM_VERSION', '1.1.0'); 24 24 25 25 // Backward compatibility for PRO plugin integration … … 840 840 'media-folder' => array( 841 841 'name' => 'Media Library Folder', 842 'description' => 'Smart folders for your media library : images, videos, and audio files with advanced filtering.',842 'description' => 'Smart folders for your media library with subfolders, direct uploads, and advanced filtering for images, videos, and audio files.', 843 843 'icon' => '🖼️', 844 'features' => array('Media Type Filtering', ' EXIF Data Support', 'Bulk Operations', 'Media Analytics'),844 'features' => array('Media Type Filtering', 'Subfolders Support', 'Direct Upload to Subfolders', 'Bulk Operations'), 845 845 'color' => '#e67e22', 846 846 ), … … 1141 1141 echo '<div id="folders-sortable" class="folders-container">'; 1142 1142 foreach ($folders as $folder) { 1143 $pages_count = $folder->count; 1144 1145 $display_name = get_term_meta($folder->term_id, 'folder_display_name', true); 1146 $final_name = !empty($display_name) ? $display_name : $folder->name; 1143 1144 // Default count (normal smart folders) 1145 $pages_count = (int) $folder->count; 1146 1147 // Read template slug 1148 $template_slug = get_term_meta( $folder->term_id, 'folder_template', true ); 1149 1150 // If dynamic templates, compute real count 1151 if ( in_array( $template_slug, array( 'tag-folder', 'category-folder', 'media-folder' ), true ) ) { 1152 $pages_count = (int) fold82sm_get_dynamic_folder_items_count( $folder->term_id, $template_slug ); 1153 } 1154 1155 // Folder display name (custom) 1156 $display_name = get_term_meta( $folder->term_id, 'folder_display_name', true ); 1157 $final_name = ! empty( $display_name ) ? $display_name : $folder->name; 1147 1158 1148 1159 echo '<div class="folder-block sortable-folder" data-folder-id="' . esc_attr($folder->term_id) . '">'; … … 1313 1324 } 1314 1325 1326 /** 1327 * Return the real item count for Dynamic folders (Tag/Category/Media). 1328 * Falls back to taxonomy term count for normal folders. 1329 */ 1330 function fold82sm_get_dynamic_folder_items_count( $folder_id, $template_slug ) { 1331 $folder_id = absint( $folder_id ); 1332 $template_slug = sanitize_key( $template_slug ); 1333 1334 if ( ! $folder_id ) { 1335 return 0; 1336 } 1337 1338 // Read PRO dynamic rule (exists only for dynamic folders) 1339 $rule = get_term_meta( $folder_id, 'folderra_dynamic_rule', true ); 1340 if ( ! is_array( $rule ) || empty( $rule['type'] ) ) { 1341 return 0; 1342 } 1343 1344 // Small cache to avoid heavy queries on big folders list 1345 $cache_key = 'fold82sm_dyn_count_' . $folder_id; 1346 $cached = get_transient( $cache_key ); 1347 if ( false !== $cached ) { 1348 return (int) $cached; 1349 } 1350 1351 $count = 0; 1352 1353 switch ( $rule['type'] ) { 1354 case 'tag': 1355 $tag_slug = ! empty( $rule['tag_slug'] ) ? sanitize_title( $rule['tag_slug'] ) : ''; 1356 if ( $tag_slug ) { 1357 $q = new WP_Query( array( 1358 'post_type' => array( 'post', 'page' ), // come nel PRO 1359 'post_status' => array( 'publish', 'private', 'draft', 'pending', 'future' ), 1360 'posts_per_page' => 1, 1361 'paged' => 1, 1362 'no_found_rows' => false, // serve per found_posts 1363 'fields' => 'ids', 1364 'tax_query' => array( 1365 array( 1366 'taxonomy' => 'post_tag', 1367 'field' => 'slug', 1368 'terms' => $tag_slug, 1369 ), 1370 ), 1371 ) ); 1372 $count = (int) $q->found_posts; 1373 } 1374 break; 1375 1376 case 'category': 1377 $category_ids = array(); 1378 if ( ! empty( $rule['category_ids'] ) && is_array( $rule['category_ids'] ) ) { 1379 $category_ids = array_filter( array_map( 'absint', $rule['category_ids'] ) ); 1380 } 1381 if ( $category_ids ) { 1382 $q = new WP_Query( array( 1383 'post_type' => array( 'post' ), 1384 'post_status' => array( 'publish', 'private', 'draft', 'pending', 'future' ), 1385 'posts_per_page' => 1, 1386 'paged' => 1, 1387 'no_found_rows' => false, 1388 'fields' => 'ids', 1389 'tax_query' => array( 1390 array( 1391 'taxonomy' => 'category', 1392 'field' => 'term_id', 1393 'terms' => $category_ids, 1394 ), 1395 ), 1396 ) ); 1397 $count = (int) $q->found_posts; 1398 } 1399 break; 1400 1401 case 'media': 1402 $media_type = ! empty( $rule['media_type'] ) ? sanitize_key( $rule['media_type'] ) : 'all'; 1403 1404 $q_args = array( 1405 'post_type' => 'attachment', 1406 'post_status' => array( 'inherit', 'private' ), 1407 'posts_per_page' => 1, 1408 'paged' => 1, 1409 'no_found_rows' => false, // serve per found_posts 1410 'fields' => 'ids', 1411 ); 1412 1413 // Filter by media type if not "all" 1414 if ( 'all' !== $media_type ) { 1415 // WordPress accepts 'image' | 'video' | 'audio' 1416 $q_args['post_mime_type'] = $media_type; 1417 } 1418 1419 $q = new WP_Query( $q_args ); 1420 $count = (int) $q->found_posts; 1421 break; 1422 1423 } 1424 1425 set_transient( $cache_key, (int) $count, 5 * MINUTE_IN_SECONDS ); 1426 return (int) $count; 1427 } 1428 1315 1429 1316 1430 // ===== HELPER FUNCTIONS FOR CONSISTENCY ===== … … 2602 2716 plugins_url( 'js/wpsmartfolder-metabox.js', __FILE__ ), 2603 2717 array( 'jquery' ), 2604 defined( 'FOLD82SM_VERSION' ) ? FOLD82SM_VERSION : '1. 0.2',2718 defined( 'FOLD82SM_VERSION' ) ? FOLD82SM_VERSION : '1.1.0', 2605 2719 true 2606 2720 ); … … 2647 2761 plugins_url( 'js/folderra-editor-fixes.js', __FILE__ ), 2648 2762 array( 'wp-data', 'wp-dom-ready', 'wp-edit-post' ), 2649 '1. 0.2',2763 '1.1.0', 2650 2764 true 2651 2765 ); … … 2981 3095 } 2982 3096 3097 // Hide nested folders from the main folders list. 3098 if ( empty( $query_args['meta_query'] ) || ! is_array( $query_args['meta_query'] ) ) { 3099 $query_args['meta_query'] = array(); 3100 } 3101 3102 $query_args['meta_query'][] = array( 3103 'key' => 'folderra_parent_folder', 3104 'compare' => 'NOT EXISTS', 3105 ); 3106 3107 2983 3108 // Get all folders 2984 3109 $all_folders = get_terms($query_args);
Note: See TracChangeset
for help on using the changeset viewer.