Plugin Directory

Changeset 3477842


Ignore:
Timestamp:
03/09/2026 08:23:01 AM (3 weeks ago)
Author:
wpexpertsio
Message:

Release 5.4.10

Location:
file-manager-advanced/trunk
Files:
1 added
6 edited

Legend:

Unmodified
Added
Removed
  • file-manager-advanced/trunk/application/assets/js/elfinder_script.js

    r3452622 r3477842  
    363363                        }
    364364
    365                         // Persistent hover handling for errors using CodeMirror coordinates
     365                        // Hover tooltip: CodeMirror coordsChar() "page" mode needs document coords (pageX/pageY)
    366366                        var wrapper = editor.getWrapperElement();
    367367                        jQuery(wrapper).on('mousemove.fma-debug', function (e) {
    368368                            if (!hasErrors || currentErrors.length === 0) return;
    369369
    370                             var coords = editor.coordsChar({ left: e.clientX, top: e.clientY });
     370                            var docLeft = e.pageX != null ? e.pageX : (e.clientX + (window.scrollX || document.documentElement.scrollLeft || 0));
     371                            var docTop = e.pageY != null ? e.pageY : (e.clientY + (window.scrollY || document.documentElement.scrollTop || 0));
     372                            var coords = editor.coordsChar({ left: docLeft, top: docTop }, 'page');
     373                            if (coords.outside) return;
    371374                            var error = getErrorForLine(coords.line);
    372375
     
    414417        workerBaseUrl: afm_object.plugin_url + 'application/library/js/worker/',
    415418    });
     419
     420    // Override search command to add contentTag parameter for content search (after init)
     421    function applyContentSearchOverride(fm) {
     422        if (!fm || !fm._commands || !fm._commands.search) return;
     423        if (fm._commands.search._fmaContentSearchPatched) return;
     424        fm._commands.search._fmaContentSearchPatched = true;
     425        var originalSearchExec = fm._commands.search.exec;
     426
     427            // Override exec method to add contentTag for SearchTag type
     428            fm._commands.search.exec = function(q, target, mime, type) {
     429                var self = this;
     430                var sType = type || '';
     431
     432                // If SearchTag type, we need to send contentTag parameter
     433                if (sType === 'SearchTag' && q) {
     434                    var contentTag = q; // Store the tag
     435                    var fm = this.fm;
     436                    var reqDef = [];
     437                    var onlyMimes = fm.options.onlyMimes;
     438                    var phash, targetVolids = [];
     439
     440                    // Custom setType function that encodes tag in q parameter for SearchTag
     441                    var setType = function(data) {
     442                        if (sType && sType !== 'SearchName' && sType !== 'SearchMime') {
     443                            data.type = sType;
     444                        }
     445                        if (sType === 'SearchTag') {
     446                            data.q = '__CONTENT_SEARCH__:' + contentTag;
     447                        }
     448                        return data;
     449                    };
     450
     451                    var rootCnt;
     452
     453                    // Process target
     454                    if (typeof target == 'object') {
     455                        mime = target.mime || '';
     456                        target = target.target || '';
     457                    }
     458                    target = target ? target : '';
     459
     460                    // Process mimes
     461                    if (mime) {
     462                        mime = jQuery.trim(mime).replace(',', ' ').split(' ');
     463                        if (onlyMimes.length) {
     464                            mime = jQuery.map(mime, function(m) {
     465                                m = jQuery.trim(m);
     466                                return m && (jQuery.inArray(m, onlyMimes) !== -1
     467                                    || jQuery.grep(onlyMimes, function(om) { return m.indexOf(om) === 0 ? true : false; }).length
     468                                ) ? m : null;
     469                            });
     470                        }
     471                    } else {
     472                        mime = [].concat(onlyMimes);
     473                    }
     474
     475                    fm.trigger('searchstart', setType({query: '', target: target, mimes: mime}));
     476
     477                    if (!onlyMimes.length || mime.length) {
     478                        if (target === '' && fm.api >= 2.1) {
     479                            rootCnt = Object.keys(fm.roots).length;
     480                            jQuery.each(fm.roots, function(id, hash) {
     481                                reqDef.push(fm.request({
     482                                    data: setType({cmd: 'search', target: hash, mimes: mime}),
     483                                    notify: {type: 'search', cnt: 1, hideCnt: (rootCnt > 1 ? false : true)},
     484                                    cancel: true,
     485                                    preventDone: true
     486                                }));
     487                            });
     488                        } else {
     489                            reqDef.push(fm.request({
     490                                data: setType({cmd: 'search', target: target, mimes: mime}),
     491                                notify: {type: 'search', cnt: 1, hideCnt: true},
     492                                cancel: true,
     493                                preventDone: true
     494                            }));
     495                            if (target !== '' && fm.api >= 2.1 && Object.keys(fm.leafRoots).length) {
     496                                jQuery.each(fm.leafRoots, function(hash, roots) {
     497                                    phash = hash;
     498                                    while (phash) {
     499                                        if (target === phash) {
     500                                            jQuery.each(roots, function() {
     501                                                var f = fm.file(this);
     502                                                f && f.volumeid && targetVolids.push(f.volumeid);
     503                                                reqDef.push(fm.request({
     504                                                    data: setType({cmd: 'search', target: this, mimes: mime}),
     505                                                    notify: {type: 'search', cnt: 1, hideCnt: false},
     506                                                    cancel: true,
     507                                                    preventDone: true
     508                                                }));
     509                                            });
     510                                        }
     511                                        phash = (fm.file(phash) || {}).phash;
     512                                    }
     513                                });
     514                            }
     515                        }
     516                    } else {
     517                        reqDef = [jQuery.Deferred().resolve({files: []})];
     518                    }
     519
     520                    fm.searchStatus.mixed = (reqDef.length > 1) ? targetVolids : false;
     521
     522                    return jQuery.when.apply(jQuery, reqDef).done(function(data) {
     523                        var argLen = arguments.length, i;
     524                        data.warning && fm.error(data.warning);
     525                        if (argLen > 1) {
     526                            data.files = (data.files || []);
     527                            for (i = 1; i < argLen; i++) {
     528                                arguments[i].warning && fm.error(arguments[i].warning);
     529                                if (arguments[i].files) {
     530                                    data.files.push.apply(data.files, arguments[i].files);
     531                                }
     532                            }
     533                        }
     534                        data.files && data.files.length && fm.cache(data.files);
     535                        fm.lazy(function() {
     536                            fm.trigger('search', data);
     537                        }).then(function() {
     538                            return fm.lazy(function() {
     539                                fm.trigger('searchdone');
     540                            });
     541                        }).then(function() {
     542                            data.sync && fm.sync();
     543                        });
     544                    });
     545                } else {
     546                    return originalSearchExec.call(self, q, target, mime, type);
     547                }
     548            };
     549    }
     550    if (elfinder_object && elfinder_object.length) {
     551        var fm = elfinder_object.elfinder('instance');
     552        if (fm) {
     553            fm.one('init', function() { applyContentSearchOverride(fm); });
     554            applyContentSearchOverride(fm);
     555        }
     556    }
     557
     558    // When user clears search and presses Enter (or closes search), go back to folder they were in before search
     559    if (elfinder_object && elfinder_object.length) {
     560        var fm = elfinder_object.elfinder('instance');
     561        if (fm) {
     562            var cwdBeforeSearch = null;
     563            fm.bind('searchstart', function() {
     564                var cwd = fm.cwd();
     565                if (cwd && cwd.hash) {
     566                    cwdBeforeSearch = cwd.hash;
     567                }
     568            });
     569            fm.bind('searchend', function() {
     570                if (cwdBeforeSearch && fm.file(cwdBeforeSearch)) {
     571                    fm.exec('open', cwdBeforeSearch);
     572                }
     573                cwdBeforeSearch = null;
     574            });
     575        }
     576    }
     577
     578    // Add Content search radio button after elFinder is initialized
     579    if (elfinder_object && elfinder_object.length) {
     580        var fm = elfinder_object.elfinder('instance');
     581        if (fm) {
     582            var addContentRadioButton = function() {
     583                var searchMenu = jQuery('.elfinder-button-search-menu');
     584                if (searchMenu.length) {
     585                    var namespace = fm.namespace || 'elfinder-';
     586                    var id = function(name) {
     587                        return namespace + (fm.escape ? fm.escape(name) : name);
     588                    };
     589
     590                    var searchTypeSet = searchMenu.find('.elfinder-search-type');
     591                    if (searchTypeSet.length && !searchTypeSet.find('#' + id('SearchTag')).length) {
     592                        var tagRadio = jQuery('<input id="' + id('SearchTag') + '" name="serchcol" type="radio" value="SearchTag"/>');
     593                        var tagLabel = jQuery('<label for="' + id('SearchTag') + '">Content</label>');
     594
     595                        searchTypeSet.append(tagRadio).append(tagLabel);
     596                        searchTypeSet.buttonset('refresh');
     597
     598                        // Remember search type when target is "Here", so we can restore only when user had chosen Content then switched to "All"
     599                        var lastSearchTypeWhenHere = null;
     600
     601                        var updateContentState = function() {
     602                            var isHere = jQuery('#' + id('SearchFromCwd')).prop('checked');
     603                            var tagRadio = jQuery('#' + id('SearchTag'));
     604                            var tagLabel = tagRadio.next('label');
     605
     606                            if (tagRadio.length) {
     607                                if (isHere) {
     608                                    tagRadio.prop('disabled', false);
     609                                    tagLabel.css({'opacity': '1', 'cursor': 'pointer'});
     610                                    // Restore Content when switching back to "Here" if it was selected before
     611                                    if (lastSearchTypeWhenHere === 'SearchTag') {
     612                                        tagRadio.prop('checked', true);
     613                                        searchTypeSet.buttonset('refresh');
     614                                    }
     615                                } else {
     616                                    tagRadio.prop('disabled', true);
     617                                    tagLabel.css({'opacity': '0.5', 'cursor': 'not-allowed'});
     618                                    if (tagRadio.prop('checked')) {
     619                                        lastSearchTypeWhenHere = 'SearchTag'; // was Content before switching to All
     620                                        jQuery('#' + id('SearchName')).prop('checked', true).trigger('change');
     621                                        searchTypeSet.buttonset('refresh');
     622                                    }
     623                                }
     624                            }
     625                        };
     626
     627                        // When user changes search type while target is "Here", remember it
     628                        searchMenu.off('change.contentsearch', 'input[name="serchcol"]').on('change.contentsearch', 'input[name="serchcol"]', function() {
     629                            if (jQuery('#' + id('SearchFromCwd')).prop('checked')) {
     630                                var val = jQuery(this).val();
     631                                if (val) lastSearchTypeWhenHere = val;
     632                            }
     633                        });
     634
     635                        searchMenu.off('change.contentsearch', 'input[name="serchfrom"]').on('change.contentsearch', 'input[name="serchfrom"]', updateContentState);
     636                        updateContentState();
     637                    }
     638                }
     639            };
     640
     641            jQuery(document).on('click focus', '.elfinder-button-search input[type="text"]', function() {
     642                setTimeout(addContentRadioButton, 200);
     643            });
     644
     645            fm.bind('open', function() {
     646                setTimeout(addContentRadioButton, 500);
     647            });
     648
     649            setTimeout(addContentRadioButton, 1000);
     650        }
     651    }
    416652});
  • file-manager-advanced/trunk/application/class_fma_connector.php

    r3410804 r3477842  
    3030        if ( !function_exists( 'elFinderAutoloader' ) ) {
    3131            require 'library/php/autoload.php';
     32        }
     33
     34        // Load custom filesystem driver for content search
     35        if (defined('FMAFILEPATH')) {
     36            require_once FMAFILEPATH . 'application/class_fma_local_filesystem.php';
     37        } else {
     38            require_once dirname(__FILE__) . '/class_fma_local_filesystem.php';
    3239        }
    3340
     
    105112                // Items volume
    106113                array(
    107                     'driver'        => 'LocalFileSystem',           // driver for accessing file system (REQUIRED)
     114                    'driver'        => 'fma_local_filesystem',           // custom driver with content search support
    108115                    'path'          => $path,                 // path to files (REQUIRED)
    109116                    'URL'           => $url, // URL to files (REQUIRED)
     
    117124                    'acceptedName'  => current_user_can('manage_options') ? '' : 'afm_plugin_file_validName',
    118125                    'uploadMaxSize' => $max_upload_size,
     126                    'searchTimeout' => 300,
    119127                    'attributes'    => array(
    120128                        array(
     
    147155        );
    148156        $opts['bind']['upload'] = array( $this, 'on_upload_event' );
     157        $opts['bind']['search.pre'] = array( $this, 'on_search_command' );
    149158        $opts = apply_filters( 'fma__opts_override', $opts );
    150159
     
    180189                $file_content  = $svg_sanitizer->sanitize( $file_content );
    181190                file_put_contents( $file_path, $file_content );
     191            }
     192        }
     193    }
     194
     195    /**
     196     * Intercept search command to handle content search tag parameter
     197     * This hook is called before the search command executes
     198     * We decode the tag from q parameter which contains special marker
     199     */
     200    public function on_search_command( $cmd, &$args, $elfinder, $volume ) {
     201        if ( $cmd === 'search' ) {
     202            $type = !empty( $args['type'] ) ? $args['type'] : '';
     203            $q = !empty( $args['q'] ) ? trim( $args['q'] ) : '';
     204
     205            // Content search: type is SearchTag and/or q contains our marker
     206            if ( $type === 'SearchTag' || strpos( $q, '__CONTENT_SEARCH__:' ) === 0 ) {
     207                $tag = '';
     208                if ( strpos( $q, '__CONTENT_SEARCH__:' ) === 0 ) {
     209                    $tag = substr( $q, strlen( '__CONTENT_SEARCH__:' ) );
     210                } elseif ( $type === 'SearchTag' && $q !== '' ) {
     211                    $tag = $q; // default elFinder sends type=SearchTag and q=term (no marker)
     212                }
     213                if ( $tag !== '' ) {
     214                    elFinderVolumefma_local_filesystem::setContentSearchTag( $tag );
     215                    $args['q'] = '';
     216                } else {
     217                    elFinderVolumefma_local_filesystem::setContentSearchTag( '' );
     218                }
     219            } else {
     220                elFinderVolumefma_local_filesystem::setContentSearchTag( '' );
    182221            }
    183222        }
  • file-manager-advanced/trunk/application/pages/main.php

    r3460523 r3477842  
    2323    <?php } ?>
    2424    <hr class="wp-header-end">
    25     <?php if ('yes' !== $appsumo_banner_hide) { ?>
     25    <?php if (!class_exists('file_manager_advanced_shortcode') && 'yes' !== $appsumo_banner_hide) { ?>
    2626            <div class="fma-appsumo-banner" id="fma_appsumo_banner">
    2727                <div class="fma-appsumo-content">
  • file-manager-advanced/trunk/constants.php

    r3460523 r3477842  
    55 */
    66if ( !defined('FMA_VERSION') ) {
    7    define( 'FMA_VERSION', '5.4.9' );
     7   define( 'FMA_VERSION', '5.4.10' );
    88}
    99/**
  • file-manager-advanced/trunk/file_manager_advanced.php

    r3460523 r3477842  
    55  Description: Cpanel for files management in wordpress
    66  Author: wpexpertsio
    7   Version: 5.4.9
     7  Version: 5.4.10
    88  Author URI: https://wpexperts.io
    99  License: GPLv2
     
    1515 * @package Advance File Manager
    1616 */
     17
     18// Some hosting environments (e.g. locked-down managed hosts) disable core streaming
     19// functions like fpassthru(). elFinder and cloud drivers rely on fpassthru() for
     20// efficient streaming (PDFs, large files). If it's disabled, PHP removes the
     21// internal function, so we provide a safe polyfill here.
     22if ( ! function_exists( 'fpassthru' ) ) {
     23    function fpassthru( $handle ) {
     24        if ( ! is_resource( $handle ) ) {
     25            return 0;
     26        }
     27        $bytes = 0;
     28        while ( ! feof( $handle ) ) {
     29            $chunk = fread( $handle, 8192 );
     30            if ( $chunk === false ) {
     31                break;
     32            }
     33            $bytes += strlen( $chunk );
     34            echo $chunk;
     35        }
     36        return $bytes;
     37    }
     38}
    1739
    1840if ( ! function_exists( 'fma_fs' ) ) {
  • file-manager-advanced/trunk/readme.txt

    r3460523 r3477842  
    1 === Advanced File Manager – Ultimate WP File Manager And Document Library Solution ===
     1=== Advanced File Manager – Ultimate File Manager for WordPress And Document Library Solution ===
    22Contributors: wpexpertsio, saadiqbal
    33Tags: file-manager, wp-file-manager, document management, ftp, advance-file-manager
    44Requires at least: 4.0
    5 Tested up to: 6.9
     5Tested up to: 6.9.1
    66Requires PHP: 7.0
    7 Stable tag: 5.4.9
     7Stable tag: 5.4.10
    88License: GPLv2 or later
    99License URI: http://www.gnu.org/licenses/gpl-2.0.html
     
    1212
    1313== Description ==
    14 [📢 A Pro version Lifetime Deal is available ⏰](https://advancedfilemanager.com/appsumo-lifetime-deal?utm_source=wp_org&utm_medium=readme&utm_campaign=ltd)
    15 
    16  [Live Demo](https://filemanageradvanced-demo.instawp.xyz/?utm_source=wp_org&utm_medium=readme&utm_campaign=live_demo) | [Documentation](https://advancedfilemanager.com/documentation/?utm_source=wp_org&utm_medium=readme&utm_campaign=documentation) | [Support](https://objectsws.atlassian.net/servicedesk/customer/portal/37)
     14
     15📢 [A Pro version Lifetime Deal is available](https://advancedfilemanager.com/appsumo-lifetime-deal/?utm_source=wp_org&utm_medium=readme&utm_campaign=ltd)⏰
     16
     17[Buy Pro](https://advancedfilemanager.com/pricing/?utm_source=wp_org&utm_medium=readme&utm_campaign=buy_now) | [Live Demo](https://filemanageradvanced-demo.instawp.xyz/?utm_source=wp_org&utm_medium=readme&utm_campaign=live_demo) | [Documentation](https://advancedfilemanager.com/documentation/?utm_source=wp_org&utm_medium=readme&utm_campaign=documentation) | [Support](https://objectsws.atlassian.net/servicedesk/customer/portal/37)
    1718
    1819**Manage WordPress files and create document libraries with ease!**
     
    2223If that is the case, then ✨ **Download Advanced File Manager Now!** ✨
    2324
    24 With this WordPress file manager plugin, you can perform multiple file operations, such as **Copy, Paste, Rename, Edit, Delete, Upload, Download, Create an archive (Zip archive), etc.,** directly from the WordPress dashboard—no need for any cPanel or FTP or other hosting panels.
    25 
    26 The best part is that this WordPress file manager plugin also allows you to access files outside of the WordPress root directory—which means you can **create document libraries/download managers** as well. 😃
    27 
    28 Whether you are a developer managing large files or a casual user needing basic file operations, this plugin has something for everyone.
    29 
    30 
    31 ### ⚡ Key Features That Make WordPress File Management a Breeze!
     25With this WordPress file manager plugin, you can perform multiple file operations, such as **Copy, Paste, Rename, Edit, Delete, Upload, Download, Create an archive (Zip archive), etc.,** directly from the WordPress dashboard—no need for any cPanel, FTP or other hosting panels.
     26
     27The best part is that this WordPress file manager plugin also allows you to access files outside of the WordPress root directory, which means you can create a fully functional document library with download controls as well. 😃
     28
     29
     30Whether you are a developer or a beginner, this file management plugin has something for everyone.
     31
     32
     33### ⚡  Key Features That Make This WordPress File Manager a Complete File Management Solution!
    3234
    3335✅ **Flexible Root Directory Access:** You can easily set and modify the root directory path, which allows you to access specific files according to your development requirements.
     
    3537✅ **Access to Internal and External Directories:** Gain complete control over files located both within and outside your WordPress root directory, making file management more flexible.
    3638
    37 ✅ **Frontend File Management [Pro]:** Use shortcodes to enable logged-in and non-logged-in users to manage files on the front end. You can also control access by user roles and permissions.
     39✅ **Frontend File Management [Pro]:** Use the dedicated Advanced File Manager block or shortcode to provide logged-in and non-logged-in users access to manage files on the front end. You can also control access by user roles and permissions.
    3840
    3941✅ **Complete File Operations:** Perform all essential file operations such as copy, paste, rename, edit, delete, upload, download, and even create an archive (Zip archive) directly from your WordPress dashboard.
     
    4143✅ **Quick PDF Previews:** Save time by easily previewing PDF documents directly in the plugin without needing to download them first.
    4244
    43 ✅ **FTP-Free File Management:** The plugin acts as an alternative to traditional FTP clients and allows you to manage files securely from within WordPress.
     45✅ **FTP-Free File Management:**  This WordPress file manager acts as a secure alternative to traditional FTP clients that allows you to manage files securely from within WordPress.
    4446
    4547✅ **Path Privacy Protection:** Hide the actual file paths from users to enhance security and protect sensitive information on your site.
    4648
    47 ✅ **Drag-and-Drop File Interface:** Easily upload and move files by dragging and dropping them into the plugin interface to speed up your workflow.
    48 
    49 ✅ **Icon and List View Options:** Switch between icon and list views to find the most convenient way of navigating your files and folders.
    50 
    51 ✅ **Directory Size Calculation:** Instantly calculate the size of directories to better manage storage and optimize your site’s resources.
    52 
    53 ✅ **Archive Management:** Create or extract various archive formats, including ZIP, RAR, 7Z, TAR, GZIP, and BZIP2, without leaving WordPress.
     49✅ **Drag-and-Drop File Interface:** Use drag and drop file upload to easily upload and move files within the interface.
     50
     51✅ **Icon and List View Options:**  Use this file organizer for WordPress to switch between icon and list views for easier navigation.
     52
     53✅ **Directory Size Calculation:**  Instantly calculate directory sizes using this practical file organizer for WordPress.
     54
     55✅ **Archive Management:** Easily zip and extract archives in multiple formats (ZIP, RAR, 7Z, TAR, GZIP, and BZIP2) directly from WordPress.
    5456
    5557✅ **Themes for File Manager:** Choose between light and elegant themes to create a visually appealing and comfortable file management user interface.
     
    5759✅ **Keyboard Shortcuts:** Speed up your file management tasks by using a range of keyboard shortcuts for common operations.
    5860
    59 ✅ **Debug in Code Editor:** Identify and fix issues directly in the editor to prevent fatal errors and ensure smooth site performance.
    60 
    61 ✅ **Media Previews:** Preview video and audio files directly from the interface, ensuring quick checks without downloading them.
     61✅ **Debug in Code Editor:** Identify and fix issues directly in the file editor (code editor) to prevent fatal errors and ensure smooth site performance.
     62
     63✅ **Media Previews:** Simplify media file management by previewing video and audio files instantly.
    6264
    6365✅ **Large Files & Folder Upload Support:** The file manager allows you to upload large files and folders quickly by uploading them in chunks, ensuring a smoother file transfer process.
    6466
    65 ✅ **Advanced File Search and Sorting:** Quickly find and organize your files using advanced search and sorting capabilities, helping you save time during file management.
    66 
    67 ✅ **Thumbnails for Images:** View image thumbnails directly within the file manager, which helps in quickly identifying visual content.
     67✅ **Advanced File Search and Sorting:** Quickly find and organize your files with a smart file organizer for WordPress.
     68
     69✅ **Thumbnails for Images:** Improve media file management with built-in image thumbnails, which helps in quickly identifying visual content.
    6870
    6971✅ **Rich Context Menu and Toolbar:** Access frequently used file operations through a rich context menu and toolbar, making navigation faster and more intuitive.
    7072
    71 ✅ **Multi-Selection:** Select multiple files or folders at once to perform bulk operations such as moving or deleting.
     73✅ **Multi-Selection:** Select multiple files or folders at once to perform bulk operations and improve folder structure.
    7274
    7375✅ **Responsive Design:** The plugin’s responsive design ensures that it works flawlessly on tablets and smartphones, providing a consistent experience across all devices.
     
    7779✅ **File Sanitization and UTF-8 Normalization:** Ensure proper file naming and avoid errors with built-in sanitization and UTF-8 normalization of file names and paths.
    7880
    79 ✅ **High-Performance Backend**: The plugin offers a high-performance server backend that ensures smooth and fast file operations.
    80 
    81 ✅ **Recent Directory Access:** Quickly return to previously opened folders. It saves you time by easily jumping to your most recent navigation paths.
     81✅ **High-Performance Backend**: This file management plugin offers a high-performance server backend for smooth and fast file operations.
     82
     83✅ **Recent Directory Access:** Quickly return to previously opened folders. It saves you time by easily jumping to your most recent navigation paths from the folder structure.
    8284
    8385✅ **Email Notifications:** Get notified by email whenever a file or folder is created or deleted. Admins receive alerts for this activity, and users are informed when their files are removed, keeping everyone updated without needing to check manually.
     
    8789###⚡ **Manage and Display Document Libraries and File Manager in Front-end [Pro Version]— Key Features**
    8890
    89 The Shortcode Addon for Advanced File Manager unlocks even more possibilities by providing a range of customizable features for managing WordPress files and creating document libraries. Below are the key features of this Pro version add-on:
    90 
    91 ✔️ **Frontend Access for Logged-In Users:** Allow logged-in users to manage files directly from the front end of your website.
    92 
    93 ✔️ **Gutenberg Block & Shortcode Support:** Display your Document library or file manager with limited user access in the front end with easy to use Gutenberg block and shortcode.
    94 
    95 ✔️ **Public File Access for Visitors:** Enable non-logged-in users or visitors to access and manage files on the front end, which allows you to offer document sharing and public file access.
    96 
    97 ✔️ **Role-Based File Access Control:** Restrict file access based on user roles, allowing you to define who can view, edit, or delete files on your website.
     91The premium version of Advanced File Manager unlocks even more possibilities by providing a range of customizable features for managing WordPress files, creating document libraries, and offering cloud integration with WordPress file manager.
     92Below are the key premium features:
     93
     94
     95✔️ **Frontend Access for Logged-In Users:** Enable a secure frontend file manager for logged-in users.
     96
     97✔️ **Elementor, Divi, and WordPress Block Support:**  Display your Document library or file manager on the front end of your favorite page builder via Advanced File Manager Block or shortcode.
     98
     99✔️ **PHP Debug in Code Editor:**Enables developers to run and debug PHP code directly inside the file manager’s editor for quick troubleshooting.
     100
     101✔️ **WordPress Database Access (Adminer Data Manager):**With WP Adminer integration, you can securely access and manage the WordPress database.
     102
     103✔️ **File Logs:** Get detailed logs of complete file operations, including Log ID, User, Date & Time, Event Type, File Path, File Type, and IP Address. It helps you track changes, errors, and activities for better transparency and auditing.
     104
     105✔️ **Public File Access for Visitors:** Enable visitors (non-logged-in users) to access resources through a structured document library.
     106
     107✔️ **Role-Based File Access Control:** Implement role-based access control to restrict file access by user roles, allowing you to define who can view, edit, or delete files on your website.
    98108
    99109✔️ **Individual User Access Control:** Control file access access on a user-by-user basis, blocking or restricting specific users from accessing particular files or folders.
    100110
    101 ✔️ **Private Folder Access:** Create secure, private folder paths for specific users or groups, ensuring only authorized individuals can access sensitive files.
     111✔️ **Private Folder Access:** Create secure folders within your document library for specific users or groups, ensuring only authorized individuals can access sensitive files.
    102112
    103113✔️ **Hide Sensitive Files and Folders:** Protect sensitive files by hiding them from specific users or from the public view and ensure privacy.
    104114
    105 ✔️ **Personalized User Folders:** Assign users a personal folder for storing and managing their documents, helping them organize and manage their files in a secure, individualized space.
     115✔️ **Personalized User Folders:** Assign users personal folders using this flexible file organizer for WordPress, helping them organize and manage their files in a secure, individualized space.
    106116
    107117✔️ **Themes Selection:** Choose from a variety of themes to match the front-end file manager and document library/download manager with your site’s design and branding.
     
    109119✔️ **Multilingual Support for Global Access:** Enable language customization to present the file manager interface in your visitors’ preferred language, ideal for global users.
    110120
    111 ✔️ **Operations Control for Users:** Control which actions users can perform, such as uploading, downloading, or deleting files, via shortcode for precise file management.
     121✔️ **Operations Control for Users:** Manage file access permissions to control which actions users can perform, such as uploading, downloading, or deleting files, via shortcode for precise file management.
    112122
    113123✔️ **Flexible View Options (Grid/List):** Switch between grid and list views for better navigation of file manager and document libraries/download manager that adapts to various user preferences.
    114124
    115 ✔️ **Dropbox:** Connect your Dropbox cloud storage to WordPress and manage, upload, and sync files directly from the dashboard—no switching tabs or tools needed.
    116 
    117 ✔️ **Google Drive:** Easily link Google Drive with WordPress to access, manage, and sync your cloud files right from the file manager interface.
    118 
    119 ✔️ **OneDrive:** Seamlessly connect your OneDrive account to WordPress and manage, upload, and organize files directly from the File Manager—no external tabs or tools required.
    120 
    121 ✔️ **Amazon S3:** Seamlessly connect your Amazon S3 account to WordPress and manage, upload, and organize files directly from the File Manager—no external tabs or tools required.
     125✔️ **Dropbox:** Enable seamless cloud storage integration with Dropbox to sync files directly from your dashboard.
     126
     127✔️ **Google Drive:** Improve productivity with cloud storage integration for Google Drive
     128
     129✔️ **OneDrive:**Use cloud storage integration to manage OneDrive files inside WordPress.
     130
     131✔️ **Amazon S3:**Activate cloud storage integration to connect Amazon S3 with WordPress.
    122132
    123133✔️ **pCloud:** Seamlessly connect your pCloud account to WordPress and manage, upload, and organize files directly from the File Manager, no external tabs or tools required.
     
    136146### Benefits of Using a WordPress File Manager Plugin Instead of an FTP
    137147
    138 Using a file manager plugin like Advanced File Manager offers numerous advantages over traditional FTP clients. Here are some key benefits:
     148 Using a WordPress file manager like Advanced File Manager offers numerous advantages over traditional FTP tools.:
    139149Ease of Use: No need for technical expertise or additional software—everything is accessible from your WordPress dashboard.
    140150
     
    143153* **Quick Access:** Access files directly from the WordPress admin area without switching to another application.
    144154
    145 * **Enhanced Security:** With built-in role and user restrictions, you can better control who can access files.
     155* **Enhanced Security:** With built-in role-based access control, you can better control who can access files.
    146156
    147157* **Convenient File Operations:** Perform all file operations with just a few clicks, eliminating the need for command-line instructions.
     
    168178🌟 **Powerful Security Features**
    169179
    170 * Restrict access by user roles and permissions.
     180* Configure file access permissions by user roles and permissions.
    171181
    172182* Hide file paths for added security.
     
    196206* Enable multilingual support for global audiences.
    197207
    198 * Limit user actions with advanced shortcodes.
     208* Limit user actions with advanced settings inside Blocks.
    199209
    200210
     
    216226* Clean, responsive design for all devices.
    217227
    218 * Drag-and-drop functionality for quick uploads.
    219 
    220 * File editing for quick changes.
    221 
    222 
    223 ### ☁️ **Cloud Storage Apps Integration with WordPress**
    224 
    225 Soon, you will be able to integrate your favorite cloud storage app with WordPress to manage files and document libraries. The list of cloud storage apps is as follows:
     228* Drag-and-drop file upload functionality.
     229
     230* Make quick modifications using the integrated file editor (code editor).
     231
     232### AI-Powered Coding Assistant (NEW)
     233For developers, we have added an AI-powered coding assistant right into the code editor. You can now write functions, generate CSS or PHP, debug safely, and get instant explanations. It’s like having a coding partner, right inside your WordPress dashboard.
     234### ☁️ **Cloud Apps Integration with WordPress**
     235
     236You can integrate your favorite cloud apps with WordPress to manage files and document libraries. The list of cloud storage apps is as follows:
    226237
    227238* [DropBox](https://advancedfilemanager.com/pricing/?utm_source=wp_org&utm_medium=readme&utm_campaign=dropbox)
     
    239250* [Google Cloud](https://advancedfilemanager.com/pricing/?utm_source=wp_org&utm_medium=readme&utm_campaign=google_cloud)
    240251
     252* [Github](https://advancedfilemanager.com/pricing/?utm_source=wp_org&utm_medium=readme&utm_campaign=github)
     253
     254* [Slack](https://advancedfilemanager.com/pricing/?utm_source=wp_org&utm_medium=readme&utm_campaign=slack)
     255
    241256### 🤝 **Compatibility**
    242257
     
    279294**Step#3: Perform File Operations:**
    280295
    281 * Use the toolbar or right-click to open the context menu to perform operations such as uploading, deleting, or moving files.
     296* Use the toolbar or right-click to open the context menu to perform uploading tasks faster with advanced drag and drop file upload features.
    282297
    283298
    284299**Step #4: Set User Restrictions (Pro Version):**
    285300
    286 * Navigate to the Shortcodes settings if you have the Pro version.
    287 
    288 * Define user roles, private folders, and operation permissions as needed.
    289 
     301* Navigate to the Blocks settings if you have the Pro version.
     302
     303* Configure role-based access control, operation permissions for private folders.
    290304
    291305**Step #5: Customize the Interface:**
     
    322336
    323337= Can I create a ZIP archive of any folder or file and download it? =
    324 Yes, you can archive any file or folder as a ZIP directly from the plugin interface and download it instantly.
     338Yes, you can zip and extract archives of any folder or file instantly.
    325339
    326340= Does the plugin work like an FTP client? =
     
    335349
    336350= Can I manage files on the front end of my website? =
    337 Yes, with the Pro version, you can enable front-end file management for logged-in and non-logged-in users using shortcodes.
     351Yes, with the Pro version, you can manage files using a powerful frontend file manager for logged-in and non-logged-in users using shortcodes.
    338352
    339353= Is Advanced File Manager a secure alternative to FTP? =
     
    394408== Changelog ==
    395409
    396 = 5.4.9 - February 13, 2026 =
     410= 5.4.10 - March 09, 2026 =
     411* Improvement – Added Content search feature in the File manager search bar. 
     412
     413= 5.4.9 - February 09, 2026 =
    397414* Tweak – Updated the Integrations menu by adding new tabs for pCloud, Cloudflare R2, and DigitalOcean Spaces.
    398415
    399416= 5.4.8 - February 03, 2026 =
    400 * Fix Resolved a script dependency conflict.
     417* Fix - Resolved a script dependency conflict.
    401418* Improvement - File Manager themes.
    402 * Improvement Added a complete data deletion option in settings to remove all plugin data upon uninstallation.
     419* Improvement - Added a complete data deletion option in settings to remove all plugin data upon uninstallation.
    403420
    404421= 5.4.7 - December 04, 2025 =
Note: See TracChangeset for help on using the changeset viewer.