Plugin Directory

Changeset 3442582


Ignore:
Timestamp:
01/19/2026 01:41:30 PM (2 months ago)
Author:
davelabs
Message:

Release 1.1.0 – UI/UX improvements

Location:
folderra-smart-folder-organizer/trunk
Files:
7 edited

Legend:

Unmodified
Added
Removed
  • folderra-smart-folder-organizer/trunk/readme.txt

    r3435017 r3442582  
    55Tested up to: 6.9
    66Requires PHP: 7.4
    7 Stable tag: 1.0.2
     7Stable tag: 1.1.0
    88License: GPLv2 or later
    99License URI: https://www.gnu.org/licenses/gpl-2.0.html
     
    8787== Changelog ==
    8888
     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
    8996= 1.0.2 =
    9097* Improved: Folder Details UI with a cleaner, unified information bar.
  • folderra-smart-folder-organizer/trunk/wpsmartfolder.php

    r3435017 r3442582  
    44 * Plugin URI: https://wpsmartfolder.com
    55 * Description: Organize your WordPress pages and posts with smart folders, drag & drop, and advanced structure management.
    6  * Version: 1.0.2
     6 * Version: 1.1.0
    77 * Author: DaveLabs
    88 * Text Domain: folderra-smart-folder-organizer
     
    2121
    2222// Main version constant
    23 define('FOLD82SM_VERSION', '1.0.2');
     23define('FOLD82SM_VERSION', '1.1.0');
    2424
    2525// Backward compatibility for PRO plugin integration
     
    840840    'media-folder' => array(
    841841        '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.',
    843843        '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'),
    845845        'color'       => '#e67e22',
    846846    ),
     
    11411141        echo '<div id="folders-sortable" class="folders-container">';
    11421142        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;
    11471158           
    11481159            echo '<div class="folder-block sortable-folder" data-folder-id="' . esc_attr($folder->term_id) . '">';
     
    13131324}
    13141325
     1326/**
     1327 * Return the real item count for Dynamic folders (Tag/Category/Media).
     1328 * Falls back to taxonomy term count for normal folders.
     1329 */
     1330function 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
    13151429
    13161430// ===== HELPER FUNCTIONS FOR CONSISTENCY =====
     
    26022716        plugins_url( 'js/wpsmartfolder-metabox.js', __FILE__ ),
    26032717        array( 'jquery' ),
    2604         defined( 'FOLD82SM_VERSION' ) ? FOLD82SM_VERSION : '1.0.2',
     2718        defined( 'FOLD82SM_VERSION' ) ? FOLD82SM_VERSION : '1.1.0',
    26052719        true
    26062720    );
     
    26472761        plugins_url( 'js/folderra-editor-fixes.js', __FILE__ ),
    26482762        array( 'wp-data', 'wp-dom-ready', 'wp-edit-post' ),
    2649         '1.0.2',
     2763        '1.1.0',
    26502764        true
    26512765    );
     
    29813095    }
    29823096
     3097    // Hide nested folders from the main folders list.
     3098if ( 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
    29833108    // Get all folders
    29843109    $all_folders = get_terms($query_args);
Note: See TracChangeset for help on using the changeset viewer.