Plugin Directory

Changeset 3442278


Ignore:
Timestamp:
01/19/2026 07:57:06 AM (7 weeks ago)
Author:
unitecms
Message:

updated to 2.0.4 version.

Location:
unlimited-elements-for-elementor/trunk
Files:
17 edited

Legend:

Unmodified
Added
Removed
  • unlimited-elements-for-elementor/trunk/assets_libraries/filters/ue_filters.js

    r3429638 r3442278  
    13151315
    13161316        var objLink = jQuery(this);
    1317 
     1317 
    13181318        if(objLink.hasClass("uc-grid-filter")){
    13191319
     
    14961496
    14971497        if(filterType != "general"){
    1498 
     1498           
    14991499            trace(objFilter);
    15001500
     
    18601860     */
    18611861    function getFilterElementData(objElement){
    1862                
     1862       
    18631863        var id = objElement.data("id");
    1864         var slug = objElement.data("slug");
    1865         var taxonomy = objElement.data("taxonomy");
    18661864        var title = objElement.data("title");
    18671865        var key = objElement.data("key");
    18681866        var type = objElement.data("type");
    18691867       
    1870         if(!taxonomy)
    1871             return(null);
    1872 
    1873         var objTerm = {
    1874             "type": type,
    1875             "id": id,
    1876             "slug": slug,
    1877             "taxonomy": taxonomy,
    1878             "title": title,
    1879             "key": key
    1880         };
    1881 
    1882         return(objTerm);
     1868        switch(type){
     1869        case "taxonomy":
     1870        default:
     1871            var slug = objElement.data("slug");
     1872            var taxonomy = objElement.data("taxonomy");
     1873           
     1874            var objTerm = {
     1875                "type": type,
     1876                "id": id,
     1877                "slug": slug,
     1878                "taxonomy": taxonomy,
     1879                "title": title,
     1880                "key": key
     1881            };
     1882            return(objTerm);
     1883           
     1884        break;
     1885        case "author":
     1886           
     1887            var username = objElement.data("username");
     1888           
     1889            var objAuthor = {
     1890                    "type": type,
     1891                    "id": id,
     1892                    "username": username,
     1893                    "title": title,
     1894                    "key": key
     1895                };
     1896                return(objAuthor);
     1897           
     1898        break;
     1899        }
     1900       
    18831901    }
    18841902
     
    30183036        var arrTerms = [];
    30193037        var objTaxIDs = {};
     3038        var objAuthorIDs = {};
    30203039        var strSelectedTerms = "";
     3040        var strSelectedAuthors = "";
    30213041        var search = "";
    30223042        var price_from, price_to;
     3043        var arrAuthors = [];
    30233044        var orderby = null;
    30243045        var orderby_metaname = null;
     
    30893110            if(urlAdd)
    30903111                urlAddFromFilters = addUrlParam(urlAddFromFilters, urlAdd);
    3091 
     3112           
    30923113            switch(type){
    30933114                case g_types.PAGINATION:
     
    31203141                case g_types.LOADMORE:
    31213142
    3122                     if(isFiltersInitMode == true)
     3143                    //check if loadmore is before grid in init mode
     3144                    var isLoadMoreBeforeGrid = false;
     3145                    if(isFiltersInitMode == true){
     3146                        var offsetLoadMore = objFilter.offset();
     3147                        var offsetGrid = objGrid.offset();
     3148                       
     3149                        if(offsetLoadMore.top < offsetGrid.top){
     3150                            isLoadMoreBeforeGrid = true;
     3151                           
     3152                            if(g_showDebug == true)
     3153                                trace("Loadmore before grid - process in init mode");
     3154                        }
     3155                    }
     3156                   
     3157                    if(isFiltersInitMode == true && isLoadMoreBeforeGrid == false)
    31233158                        return(true);
    31243159
     
    31483183                    //if not init mode - take first item
    31493184                    var objTerm = getTermsListSelectedTerm(objFilter);
    3150                    
     3185                    var filterSource = objFilter.data("filtersource");
     3186                                       
    31513187                    if(objTerm){
    31523188                       
    31533189                        if(isFiltersInitMode == false){
    31543190                           
    3155                             arrTerms.push(objTerm);
     3191                            if(filterSource == "authors")
     3192                                arrAuthors.push(objTerm);
     3193                            else
     3194                                arrTerms.push(objTerm);
    31563195                        }
    31573196                        else{
     
    31663205                                arrTerms.push(objTerm);
    31673206                            else
    3168                                 if(isInit != true)
    3169                                     arrTerms.push(objTerm);
     3207                                if(isInit != true){
     3208                                   
     3209                                    if(filterSource == "authors")
     3210                                        arrAuthors.push(objTerm);
     3211                                    else
     3212                                        arrTerms.push(objTerm);
     3213                                   
     3214                                }
    31703215                           
    31713216                            //set selected terms string
    3172 
     3217                           
    31733218                            var termID = objTerm.id;
    3174                             if(strSelectedTerms)
    3175                                 strSelectedTerms +=",";
    3176 
    3177                             strSelectedTerms += termID;
     3219                           
     3220                            if(filterSource == "authors"){
     3221                               
     3222                                if(strSelectedAuthors)
     3223                                    strSelectedAuthors +=",";
     3224                               
     3225                                strSelectedAuthors += termID;
     3226                            }
     3227                            else{
     3228                                if(strSelectedTerms)
     3229                                    strSelectedTerms +=",";
     3230                               
     3231                                strSelectedTerms += termID;
     3232                            }
    31783233                           
    31793234                        }
    3180 
    31813235                    }
    31823236
     
    32283282                   
    32293283                    var generalIsNoRefresh = objFilter.data("norefresh");
    3230 
     3284                   
    32313285                    if(generalIsNoRefresh === true)
    32323286                        isNoRefresh = true;
     
    32373291                   
    32383292                    var dataTerms = getVal(filterData,"terms");
    3239 
     3293                   
    32403294                    if(dataTerms && dataTerms.length){ 
    32413295
     
    32983352                    }
    32993353                   
     3354                    //add authors
     3355                    var dataAuthors = getVal(filterData,"authors");
     3356                   
     3357                    if(dataAuthors && dataAuthors.length){
     3358                       
     3359                        //gather authors list
     3360                        jQuery.each(dataAuthors, function(index, author){
     3361                            arrAuthors.push(author);
     3362                        });
     3363                       
     3364                        //set selected authors string if init mode
     3365                       
     3366                        if(isFiltersInitMode == true){
     3367                           
     3368                            jQuery.each(dataAuthors, function(index, author){
     3369                               
     3370                                var authorID = getVal(author,"id");
     3371                               
     3372                                if(!authorID)
     3373                                    return(true);
     3374                               
     3375                                if(strSelectedAuthors)
     3376                                    strSelectedAuthors +=",";
     3377                               
     3378                                strSelectedAuthors += authorID;
     3379                            });
     3380                           
     3381                        }
     3382                    }
     3383                   
    33003384                   
    33013385                    if(g_showDebug == true){
     
    34003484
    34013485                //add test tax id's for init mode
    3402                 objTaxIDs = getFilterTaxIDs(objFilter, objTaxIDs);
     3486                var filterSource = objFilter.data("filtersource");
     3487                if(filterSource == "authors" && isFiltersInitMode == true){
     3488                    //add test author id's for init mode
     3489                    objAuthorIDs = getFilterTaxIDs(objFilter, objAuthorIDs);
     3490                }else{
     3491                    objTaxIDs = getFilterTaxIDs(objFilter, objTaxIDs);
     3492                }
    34033493
    34043494                if(strRefreshIDs)
     
    34383528        var urlAddition_filtersTest = "";
    34393529        var strTaxIDs = getTermDsList(objTaxIDs);
     3530        var strAuthorIDs = getTermDsList(objAuthorIDs);
    34403531               
    34413532        if(isFiltersInitMode == true){
    34423533
    3443             if(!strTaxIDs && arrFiltersForInit.length == 0)
     3534            if(!strTaxIDs && !strAuthorIDs && arrFiltersForInit.length == 0)
    34443535                urlAjax = null;
    34453536            else{
     
    34553546               
    34563547        if(strTaxIDs && (search || arrTerms.length || isFiltersInitMode == true || wasInitMode === true) ){
    3457            
     3548             
    34583549            if(urlAddition_filtersTest)
    34593550                urlAddition_filtersTest += "&";
    34603551           
    34613552            urlAddition_filtersTest += "testtermids="+strTaxIDs;
     3553        }
     3554       
     3555        //test authors - only if there are authors in query, or mode init (author mode)
     3556        if(strAuthorIDs && (search || arrAuthors.length || isFiltersInitMode == true || wasInitMode === true) ){
     3557           
     3558            if(urlAddition_filtersTest)
     3559                urlAddition_filtersTest += "&";
     3560           
     3561            urlAddition_filtersTest += "testauthorids="+strAuthorIDs;
    34623562        }
    34633563
     
    35513651        }
    35523652       
     3653        //add authors
     3654        if(arrAuthors.length){
     3655           
     3656            var strAuthors = "";
     3657            jQuery.each(arrAuthors, function(index, author){
     3658                var authorID = getVal(author, "id");
     3659                if(authorID){
     3660                    if(strAuthors)
     3661                        strAuthors += ",";
     3662                    strAuthors += authorID;
     3663                }
     3664            });
     3665           
     3666            if(strAuthors){
     3667                urlAjax += "&ucauthors="+strAuthors;
     3668                urlReplace = addUrlParam(urlReplace, "ucauthors="+strAuthors);
     3669                urlFilterString = addUrlParam(urlFilterString, "ucauthors="+strAuthors);
     3670            }
     3671        }
     3672       
    35533673         if(child_auto && arrTerms.length && childAutoString != ""){
    35543674             urlAjax += childAutoString;
     
    35563676
    35573677        if(orderby){
    3558 
     3678           
    35593679            urlAjax += "&ucorderby="+orderby;
    35603680            urlReplace = addUrlParam(urlReplace, "ucorderby="+orderby);
     
    35783698        }
    35793699       
    3580         if(isFiltersInitMode && strSelectedTerms)
     3700        if(isFiltersInitMode && strSelectedTerms && strSelectedTerms !== "undefined")
    35813701            urlAjax += "&ucinitselectedterms="+strSelectedTerms;
    35823702       
     3703        if(isFiltersInitMode && strSelectedAuthors && strSelectedAuthors !== "undefined")
     3704            urlAjax += "&ucinitselectedauthors="+strSelectedAuthors;
    35833705       
    35843706        //add refresh ids
     
    40794201            if(type == g_types.GENERAL){
    40804202                var generalType = objFilter.data("generaltype");
    4081 
     4203               
    40824204                if(!generalType){
    40834205                    trace(objFilter);
  • unlimited-elements-for-elementor/trunk/changelog.txt

    r3432094 r3442278  
    22
    33== Changelog ==
     4
     5= 2.0.4 - 2026-01-19 =
     6
     7Plugin Changes:
     8
     9* Feature - made functionality of load more before the grid
     10* Feature - added authors filter functionality to post filters.
     11
     12Widgets Changes:
     13
     14* Feature: Event List (Pro) - A new Link Entire Item option has been introduced that allows the clickable area to encompass the entire element instead of just specific parts of the content
     15* Feature: Toggle Box (Pro) - A new Show Back Button option has been added which allows for the inclusion of a dedicated button containing a specific link.
     16* Feature: Unlimited Carousel (Pro) - Added Start Item Number option, allowing to start from a specific item.
     17* Feature: File Field (Pro) - Added Required option allowing to make the File Field widget mandatory.
     18* Feature: Conditions (Free) - Added three new actions - UE Open Liquid Menu, UE Close Liquid Menu, and UE Toggle Liquid Menu - allowing full programmatic control over the Liquid Menu widget behavior
     19* Feature: Liquid Full Screen Menu (Free) - Added support for the Conditions widget, enabling seamless control over the Menu by allowing it to be opened, closed, or toggled dynamically based on defined conditions
     20* Feature: Conditions (Free) - Added three new actions - UE Open Fullscreen Menu, UE Close Fullscreen Menu, and UE Toggle Fullscreen Menu - allowing full programmatic control over the Fullscreen Menu widget behavior
     21* Feature: Fullscreen Menu (Free) - Added support for the Conditions widget, enabling seamless control over the Menu by allowing it to be opened, closed, or toggled dynamically based on defined conditions
     22* Feature: Unlimited Carousel (Pro) - A new feature has been implemented that allows users to enable an Equalize Content Height option to ensure uniform dimensions across all elements.
     23* Fix: Vertical Curved Timeline (Free) - An issue was resolved where HTML attributes were not being correctly applied to the link element.
     24* Fix: Testimonial Carousel (Free) - An issue was resolved where the Show Arrows option only successfully hid the navigation arrows on desktop devices when set to false instead of applying the setting across all device types.
     25* Fix: Google Reviews (Free) - An issue was resolved where the Show Arrows option only successfully hid the navigation arrows on desktop devices when set to false instead of applying the setting across all device types.
     26* Fix: Unlimited Carousel (Pro) - An issue was resolved where certain links within cloned items remained non-functional and could not be clicked following the initial page load.
     27* Fix: Stacking Cards (Free) - Fixed issue related to Image display with Alternate Position Image option.
     28* Fix: Content Tabs (Free) - An issue was resolved where nested content tabs widgets failed to update the active state icons of inner accordion items when those items were activated.
     29* Fix: Google Reviews (Free) - An issue has been resolved that previously prevented the remote connection options from functioning correctly when using the coverflow layout type.
    430
    531= 2.0.3 - 2026-01-04 =
     
    106132* Fix: Content Accordion (Free) - Increased the priority of the Heading Text Typography option, ensuring it can successfully override conflicting CSS rules applied by various themes.
    107133* Fix: Fullscreen Menu (Free) - Rebuilt the option so the icon size now updates automatically in the editor, and adjusted the default styling to ensure the icon is vertically centered.
    108 * Fix: Content Tabs (Free) - Removed outdated and unnecessary code that was preventing widgets from functioning correctly when their parent container was hidden using Elementor’s responsive visibility options.
     134* Fix: Content Tabs (Free) - Removed outdated and unnecessary code that was preventing widgets from functioning correctly when their parent container was hidden using Elementor's responsive visibility options.
    109135
    110136
     
    137163
    138164* Feature: Card Carousel (Free) - Made the Button Padding and Button Radius options responsive, allowing different values for desktop, tablet, and mobile devices to ensure optimal appearance across all screen sizes.
    139 * Feature: Stars Background (Pro) - Added &quot;Disable Pointer Blocking” option, allows users to prevent the widget from blocking pointer events when the background is displayed as the foreground.
     165* Feature: Stars Background (Pro) - Added &quot;Disable Pointer Blocking&quot; option, allows users to prevent the widget from blocking pointer events when the background is displayed as the foreground.
    140166* Feature: Accordion Filters (Pro) - Added an Item Box Shadow option, allowing customization of shadow effects around items to improve visual depth and overall design aesthetics.
    141167* Feature: Search Filter (Pro) - Added Button Shadow and Button Shadow Hover options, enabling customization of shadow effects for buttons in both normal and hover states to enhance visual depth and interactivity.
     
    148174* Feature: Unlimited Google Maps (Free) - Added Zoom Level Mobile option that allows setting a custom zoom level specifically for mobile devices
    149175* Feature: PDF Viewer (Free) - Improved PDF Viewer Widget accessibility - added role=&quot;region&quot; and aria-label to main wrapper for semantic identification, converted navigation arrows and fullscreen control to button elements using role attribute with descriptive aria-labels for screen reader clarity, added aria-live=&quot;polite&quot; to page counter for dynamic updates, and ensured iframe has a meaningful title attribute for screen reader context.
    150 * Feature: Currency Converter (Pro) - Added accessibility improvements — assigned role=&quot;form&quot; to the main widget, added proper aria-label attributes for inputs, search fields, and currency selectors, made the swap button keyboard-focusable with tabindex=&quot;0&quot; and role=&quot;button&quot;, added aria-live=&quot;polite&quot; to the output container for dynamic updates, and ensured all interactive elements have meaningful labels for screen readers.
     176* Feature: Currency Converter (Pro) - Added accessibility improvements - assigned role=&quot;form&quot; to the main widget, added proper aria-label attributes for inputs, search fields, and currency selectors, made the swap button keyboard-focusable with tabindex=&quot;0&quot; and role=&quot;button&quot;, added aria-live=&quot;polite&quot; to the output container for dynamic updates, and ensured all interactive elements have meaningful labels for screen readers.
    151177* Feature: Video on Hover (Free) - Added keyboard accessibility support to Video on Hover widget by enabling video play/pause on focus and blur events, ensuring users can interact with the widget using the keyboard in addition to mouse hover.
    152178* Feature: Comparison List (Pro) - Added vertical and text alignment options for the Package Column.
     
    175201* Fix: Unlimited Google Maps (Free) - Fixed an issue with the initial Category display where the All Closed, All Opened, and First Opened options were not functioning correctly, ensuring proper initial state behavior.
    176202* Fix: Job Listing (Pro) - Improved accessibility for the widget - added semantic HTML landmarks and roles, meaningful heading levels, ARIA labels for buttons, badges, and skill tags.
    177 * Fix: Image Scroll (Free) - Added accessibility features to the Widget - assigned role=&quot;group&quot; to the main wrapper, added aria-label describing the widget’s purpose, ensured all &lt;img&gt; elements have meaningful alt text, and set appropriate aria-hidden=&quot;true&quot; attributes for device overlays to improve screen reader experience.
     203* Fix: Image Scroll (Free) - Added accessibility features to the Widget - assigned role=&quot;group&quot; to the main wrapper, added aria-label describing the widget's purpose, ensured all &lt;img&gt; elements have meaningful alt text, and set appropriate aria-hidden=&quot;true&quot; attributes for device overlays to improve screen reader experience.
    178204* Fix: 360 Product Viewer (Pro) - Added role=&quot;region&quot; with aria-label to the main wrapper, aria-live=&quot;polite&quot; for dynamic updates, and aria-labels plus role=&quot;button&quot; for navigation controls to improve accessibility of the widget.
    179205* Fix: Layers (Pro) - Added role=&quot;group&quot; with aria-label=&quot;Layered visual content&quot; to the main widget wrapper and role=&quot;img&quot; to icon elements to improve accessibility and assistive technology support.
     
    193219* Fix: Christmas Icons (Free) - Improved accessibility by hiding decorative icons from assistive technologies with aria-hidden=&quot;true&quot;, and adding aria-label to links where applicable.
    194220* Fix: Morph Slider (Pro) - Improved accessibility by adding region landmark and labels to the slider, enhancing navigation with aria-controls, providing slide position context, and removing redundant roles.
    195 * Fix: Scroll Image Reveal (Free) - Updated JS to respect users’ prefers-reduced-motion setting: scroll-triggered animations are disabled for users who prefer reduced.
     221* Fix: Scroll Image Reveal (Free) - Updated JS to respect users' prefers-reduced-motion setting: scroll-triggered animations are disabled for users who prefer reduced.
    196222* Fix: Animated Hamburger Icon (Free) - Added accessibility support to the widget by including role, aria-label and aria-expanded attributes.
    197223* Fix: Image Shapes (Pro) - Added accessibility support to Image Shapes widget by including role=&quot;img&quot; and aria-label attributes.
     
    208234* Fix: Rhombus Grid (Pro) - Improved accessibility in Rhombus Grid widget by adding roles, aria-labels, keyboard navigation, and focus support.
    209235* Release: Conditions (Free) - The Conditions widget lets you show or hide elements based on custom rules or interactions. Easily control what appears on your page depending on triggers, user actions, or other conditions.
    210 * Release: Starfield Background (Pro) - The Starfield Background Widget creates a moving field of stars that gives any section a deep, cosmic atmosphere. It’s ideal for adding subtle motion and a futuristic touch to your layouts while keeping performance smooth and lightweight.
     236* Release: Starfield Background (Pro) - The Starfield Background Widget creates a moving field of stars that gives any section a deep, cosmic atmosphere. It's ideal for adding subtle motion and a futuristic touch to your layouts while keeping performance smooth and lightweight.
    211237* Release: Scroll Marquee (Free) - Scroll Marquee lets your images glide smoothly across the screen as users scroll, creating a sleek horizontal motion effect. Perfect for showcasing logos, galleries, or product shots in a dynamic, eye-catching way.
    212238* Release: Video Carousel (Free) - Video Carousel lets you showcase multiple videos in a sleek, swipeable slider with smooth navigation. Engage visitors with a modern, interactive way to browse and play your video content.
     
    279305* Feature: Flag Icons (Free) - Extended the &quot;Link&quot; option to work with all layout types, not just the dropdown layout, providing greater flexibility and consistency across different designs.
    280306* Feature: Portfolio Carousel (Pro) - Added a new Image Grow On Hover option, allowing images to smoothly scale up when hovered over.
    281 * Feature: Justified Image Carousel (Pro) - Added new elements — Subtitle and Button — to expand available content options in the widget.
     307* Feature: Justified Image Carousel (Pro) - Added new elements - Subtitle and Button - to expand available content options in the widget.
    282308* Feature: Repeater Carousel (Pro) - Added support for WYSIWYG type of ACF field, enabling rich text content to be displayed properly within the widget.
    283309* Feature: Repeater Grid (Pro) - Added support for WYSIWYG type of ACF field, enabling rich text content to be displayed properly within the widget.
     
    300326* Change: Content Grid (Free) - Changed the option name &quot;Dynamic Popup Select&quot; to &quot;Button Link Type&quot; in order to make its purpose clearer and more intuitive for users.
    301327* Fix: Mega Menu (Pro) - Fixed an issue where clicking on the Graphic Element would not follow the assigned link when the Clickable Link Item option was enabled, ensuring proper link functionality.
    302 * Fix: Justified Image Carousel (Pro) - Removed hardcoded data-elementor-lightbox-title and title attributes from widget links, allowing Elementor Lightbox to respect global “Show Title” settings.
     328* Fix: Justified Image Carousel (Pro) - Removed hardcoded data-elementor-lightbox-title and title attributes from widget links, allowing Elementor Lightbox to respect global &quot;Show Title&quot; settings.
    303329* Fix: Overlay Carousel (Pro) - Added protection to prevent padding from being applied by client website theme CSS, ensuring consistent layout and styling of the widget.
    304330* Fix: Flag Icons (Free) - Fixed an issue with the Link option where additional link attributes were not being applied, ensuring proper functionality and attribute handling.
     
    361387* Other: Select Dropdown Filter (Free) - Added additional instruction for the Select First option, providing clearer guidance on its usage and behavior.
    362388* Other: Tabs Filter (Pro) - Added additional instruction for the Select First option, providing clearer guidance on its usage and behavior.
    363 * Release: Flag Icons (Free) - New Widget: Flag Icons. Easily add country flag icons to your Elementor designs — perfect for highlighting international destinations, events, or global content!
     389* Release: Flag Icons (Free) - New Widget: Flag Icons. Easily add country flag icons to your Elementor designs - perfect for highlighting international destinations, events, or global content!
    364390
    365391
     
    575601* Feature: Post Query Summary (Pro) - Added Enable Thousand Separator option, allowing numbers to be automatically formatted with thousand separators for better readability.
    576602* Change: Vertical Curved Timeline (Free) - Changed tag for Item Description from &lt;p&gt; to &lt;div&gt;.
    577 * Fix: WordPress Menu (Free) - Added CSS fix to prevent flex container items from overlapping other elements by enabling them to shrink when there isn’t enough space.
     603* Fix: WordPress Menu (Free) - Added CSS fix to prevent flex container items from overlapping other elements by enabling them to shrink when there isn't enough space.
    578604* Fix: RSS Feed (Free) - Fixed issue where the Show Text option was missing, causing the description element to not appear.
    579605* Fix: Neon Glowing Button Effect (Pro) - Fixed issue when Glow effect was not working correctly in Safari browser.
     
    840866* Fix: Unlimited Table (Pro) - Fixed issue where the Override Icon Color option was not working in certain cases
    841867* Fix: Floating Chat Buttons (Pro) - Added a fix to address cases where custom SVG icons uploaded in the widget were not displaying due to conflicting CSS code embedded within the SVG.
    842 * Fix: Colors Swatches Filter (Pro) - Fixed issue where the Border Radius option was not working for checked checkbox items.
     868* Fix: Colors Swatches Filter (Pro) - Fixed issue where the Border Radius option was not working for checked checkbox items.
    843869* Fix: Sorting Filter (Pro) - Fixed an issue in the JavaScript code that caused unexpected behavior in certain scenarios.
    844870* Fix: Checkbox Field (Pro) - Fixed issue where, with Layout Type Image, image elements were not visible due to overriding CSS code that applied a background color to the input element.
     
    13491375 
    13501376* Feature: Email Field (Pro) - Added validation function for the email field to ensure correct email format and improve data accuracy.
    1351 * Feature: Number Field (Pro) - ​Introduced the &quot;Disable Calculation in Editor&quot; debug option to prevent the page from crashing or becoming unresponsive when multiple fields are set to calculation mode, enhancing stability during editing.​
     1377* Feature: Number Field (Pro) - Introduced the &quot;Disable Calculation in Editor&quot; debug option to prevent the page from crashing or becoming unresponsive when multiple fields are set to calculation mode, enhancing stability during editing.
    13521378* Feature: AJAX Search (Pro) - Added Show Post Image option to enable or disable the display of images in posts, providing more control over post appearance
    13531379* Feature: Submit Button (Free) - Added validation function for the email field to ensure correct email format and improve data accuracy.
     
    17401766* Feature: Mega Menu (Pro) - Implemented 'Close Transition Speed' option. This new functionality enables users to set the speed of close animations for the dropdown, enhancing visual transitions and customization.
    17411767* Feature: Unlimited Carousel (Pro) - Added 'Image Position' option, allowing users to customize the position of the image above or below the content for enhanced layout flexibility.
    1742 * Feature: Layers (Pro) - Implemented motion effects—now elements can bounce up and down and move left to right for a livelier interface.
     1768* Feature: Layers (Pro) - Implemented motion effects - now elements can bounce up and down and move left to right for a livelier interface.
    17431769* Feature: Unlimited Google Maps (Pro) - Implemented 'Center Info Window' option. This new functionality allows users to center the info window on the map, providing enhanced visibility and focus on the selected location.
    17441770* Feature: Unlimited Google Maps (Pro) - Implemented 'Close After Outside Info Window Click' option. This new functionality allows users to close the info window after clicking outside of it on the map, enhancing user interaction and control.
     
    37613787= What if I update to the Premium version after using the Free version? =
    37623788
    3763 Your existing elements/content will work with the premium version. So you won’t lose your any of your hard work.
     3789Your existing elements/content will work with the premium version. So you won't lose your any of your hard work.
    37643790
    37653791= Can I get a refund? =
  • unlimited-elements-for-elementor/trunk/inc_php/framework/functions.class.php

    r3401883 r3442278  
    41054105
    41064106        UniteFunctionsUC::validateFilepath($filepath,"export file");
    4107 
     4107       
    41084108        if(empty($filename))
    41094109            $filename = basename($filepath);
    41104110
     4111        // Clear all output buffers to prevent any previous output from corrupting the file
     4112        while (ob_get_level()) {
     4113            ob_end_clean();
     4114        }
     4115       
    41114116        header('Content-Description: File Transfer');
    41124117        header('Content-Type: application/octet-stream');
  • unlimited-elements-for-elementor/trunk/inc_php/framework/zip.class.php

    r3329756 r3442278  
    9898    private function addItem($basePath, $path){
    9999
     100        //normalize paths - remove trailing slashes for consistent comparison
     101        $basePath = rtrim($basePath, "/\\");
     102        $path = rtrim($path, "/\\");
     103       
     104        //calculate relative path
    100105        $rel_path = str_replace($basePath . "/", "", $path);
     106        $rel_path = str_replace($basePath . "\\", "", $rel_path);
     107       
     108        //if still starts with basePath (Windows paths or other edge cases), use basename
     109        if($rel_path == $path || strpos($rel_path, $basePath) === 0){
     110            $rel_path = str_replace($basePath, "", $rel_path);
     111            $rel_path = ltrim($rel_path, "/\\");
     112        }
     113       
     114        //ensure relative path doesn't start with dot or slash (prevent "./file" or "/file")
     115        $rel_path = ltrim($rel_path, "./\\");
    101116
    102117        if(is_dir($path)){    //directory
     
    110125            $files = scandir($path);
    111126            foreach($files as $file){
    112                 if($file == "." || $file == ".." || $file == ".svn")
     127                //skip hidden files and directories (starting with dot)
     128                if($file == "." || $file == ".." || $file == ".svn" || (strlen($file) > 0 && $file[0] == "."))
    113129                    continue;
    114130                $filepath = $path . "/" . $file;
  • unlimited-elements-for-elementor/trunk/inc_php/layouts/unitecreator_layouts_exporter.class.php

    r3251080 r3442278  
    263263       
    264264        $filepath = $this->pathCopyLayout.$filenameZip;
    265        
     265               
    266266       
    267267        if(file_exists($filepath)){
     
    285285        $zip = new UniteZipUC();
    286286        $zip->makeZip($this->pathExportLayout, $filepath);
    287    
     287       
     288               
    288289        if(file_exists($this->pathExportLayout) == false)
    289290            UniteFunctionsUC::throwError("zip file {$filepath} could not be created");
  • unlimited-elements-for-elementor/trunk/inc_php/unitecreator_actions.class.php

    r3429507 r3442278  
    401401                break;
    402402                case "export_addon":
    403 
     403                                       
    404404                    HelperProviderUC::verifyAdminPermission();
    405405
  • unlimited-elements-for-elementor/trunk/inc_php/unitecreator_addons.class.php

    r3429507 r3442278  
    15011501     */
    15021502    public function exportAddon($data){
    1503 
     1503               
    15041504        $addonType = $this->getAddonTypeFromData($data);
    15051505        $isLayout = HelperUC::isLayoutAddonType($addonType);
    1506 
     1506       
    15071507        try{
    15081508            if($isLayout == false){
  • unlimited-elements-for-elementor/trunk/inc_php/unitecreator_exporter.class.php

    r3317018 r3442278  
    393393     */
    394394    private function makeExportZipFile(){
    395 
     395       
    396396        $zip = new UniteZipUC();
    397397        $zip->makeZip($this->pathExportAddon, $this->filepathAddonZip);
     
    522522
    523523            $this->makeExportZipFile();
     524           
    524525            $this->deleteExportAddonFolder();
    525 
     526       
    526527            if(!empty($moveFolder)){
    527528                $this->moveExportZipToFolder($moveFolder, $createCategoryFolders);
  • unlimited-elements-for-elementor/trunk/inc_php/unitecreator_filters_process.class.php

    r3397365 r3442278  
    523523     */
    524524    private function getArrInputFilters_getOrderby($arrOutput, $request){
    525 
     525       
    526526        $orderby = UniteFunctionsUC::getVal($request, "ucorderby");
    527527        $orderby = UniteProviderFunctionsUC::sanitizeVar($orderby, UniteFunctionsUC::SANITIZE_KEY);
     
    695695        }
    696696       
     697        //authors
     698        $strAuthors = UniteFunctionsUC::getVal($request, "ucauthors");
     699        $strAuthors = UniteProviderFunctionsUC::sanitizeVar($strAuthors, UniteFunctionsUC::SANITIZE_TEXT_FIELD);
     700       
     701        if(!empty($strAuthors)){
     702            //validate IDs list
     703            UniteFunctionsUC::validateIDsList($strAuthors, "authors list");
     704           
     705            //parse comma-separated IDs
     706            $arrAuthorIDs = UniteFunctionsUC::csvToArray($strAuthors);
     707           
     708            if(!empty($arrAuthorIDs)){
     709                $arrAuthorIDs = array_unique($arrAuthorIDs);
     710                $arrOutput["authors"] = $arrAuthorIDs;
     711            }
     712        }
     713       
    697714        self::$arrInputFiltersCache = $arrOutput;
    698715       
     
    797814        if(!empty($mainTermID))
    798815            self::$filters["maintermid"] = $mainTermID;
     816       
     817        //authors
     818        $arrAuthors = UniteFunctionsUC::getVal($arrInputFilters, "authors");
     819
     820        if(!empty($arrAuthors) && is_array($arrAuthors))
     821            self::$filters["authors"] = $arrAuthors;
    799822       
    800823               
     
    9891012        $titleStart = UniteFunctionsUC::getVal($arrFilters, "titlestart");
    9901013        $mainTermID = UniteFunctionsUC::getVal($arrFilters, "maintermid");
     1014        $arrAuthors = UniteFunctionsUC::getVal($arrFilters, "authors");
    9911015       
    9921016       
     
    11431167        }
    11441168       
     1169        //authors filter
     1170        if(!empty($arrAuthors) && is_array($arrAuthors)){
     1171           
     1172            $arrAuthorIDs = array();
     1173           
     1174            foreach($arrAuthors as $authorID){
     1175                $authorID = (int)$authorID;
     1176                if($authorID > 0)
     1177                    $arrAuthorIDs[] = $authorID;
     1178            }
     1179           
     1180            if(!empty($arrAuthorIDs)){
     1181               
     1182                //if author__in already exists, merge with existing IDs
     1183                if(isset($args["author__in"]) && is_array($args["author__in"])){
     1184                    $arrAuthorIDs = array_merge($args["author__in"], $arrAuthorIDs);
     1185                    $arrAuthorIDs = array_unique($arrAuthorIDs);
     1186                }
     1187               
     1188                $args["author__in"] = $arrAuthorIDs;
     1189            }
     1190        }
    11451191       
    11461192        //set the title start
     
    18651911    }
    18661912
     1913
     1914    /**
     1915     * get init filtres author request
     1916     */
     1917    private function getInitFiltersAuthorRequest($request, $strTestIDs){
     1918
     1919        if(strpos($request, "WHERE 1=2") !== false)
     1920            return("");
     1921       
     1922        //trim the limit
     1923       
     1924        $posLimit = strpos($request, "LIMIT");
     1925
     1926        if($posLimit){
     1927            $request = substr($request, 0, $posLimit-1);
     1928            $request = trim($request);
     1929        }
     1930
     1931        //remove the calc found rows
     1932
     1933        $request = str_replace("SQL_CALC_FOUND_ROWS", "", $request);
     1934
     1935        $prefix = UniteProviderFunctionsUC::$tablePrefix;
     1936
     1937        $request = str_replace($prefix."posts.*", $prefix."posts.id", $request);
     1938
     1939        //wrap it in get author id's request
     1940       
     1941        $arrAuthorIDs = UniteFunctionsUC::csvToArray($strTestIDs);
     1942       
     1943        if(empty($arrAuthorIDs))
     1944            return("");
     1945
     1946        $selectAuthors = "";
     1947        $selectTop = "";
     1948
     1949        $query = "SELECT \n";
     1950
     1951        foreach($arrAuthorIDs as $authorID){
     1952           
     1953            if(empty($authorID))
     1954                continue;   
     1955           
     1956            if(!empty($selectAuthors)){
     1957                $selectAuthors .= ",\n";
     1958                $selectTop .= ",\n";
     1959            }
     1960
     1961            $name = "author_$authorID";
     1962           
     1963            $selectAuthors .= "SUM(if(p.`post_author` = $authorID, 1, 0)) AS $name";
     1964
     1965            $selectTop .= "SUM(if($name > 0, 1, 0)) as $name";
     1966
     1967        }
     1968       
     1969        $query .= $selectAuthors;
     1970
     1971        $sql = "
     1972            FROM `{$prefix}posts` p
     1973            WHERE p.`id` IN \n
     1974                ({$request}) \n
     1975            GROUP BY p.`id`";
     1976       
     1977        $query .= $sql;
     1978       
     1979        $fullQuery = "SELECT $selectTop from($query) as summary";
     1980       
     1981        return($fullQuery);
     1982    }
     1983
     1984
     1985
     1986    /**
     1987     * modify test author id's
     1988     */
     1989    private function modifyFoundAuthorsIDs($arrFoundAuthorIDs){
     1990
     1991        if(isset($arrFoundAuthorIDs[0]))
     1992            $arrFoundAuthorIDs = $arrFoundAuthorIDs[0];
     1993
     1994        $arrAuthorsAssoc = array();
     1995
     1996        foreach($arrFoundAuthorIDs as $strID=>$count){
     1997
     1998            $authorID = str_replace("author_", "", $strID);
     1999
     2000            $arrAuthorsAssoc[$authorID] = $count;
     2001        }
     2002
     2003        return($arrAuthorsAssoc);
     2004    }
     2005
    18672006   
    18682007   
     
    19062045        $testTermIDs = UniteFunctionsUC::getPostGetVariable("testtermids","",UniteFunctionsUC::SANITIZE_TEXT_FIELD);
    19072046        UniteFunctionsUC::validateIDsList($testTermIDs);
     2047       
     2048        $testAuthorIDs = UniteFunctionsUC::getPostGetVariable("testauthorids","",UniteFunctionsUC::SANITIZE_TEXT_FIELD);
     2049        UniteFunctionsUC::validateIDsList($testAuthorIDs);
    19082050               
    19092051        //replace terms mode
     
    20302172            GlobalsProviderUC::$arrTestTermIDs = $arrFoundTermIDs;
    20312173        }
     2174       
     2175        //find the author id's for test (find or not in the current posts query)
     2176        if(!empty($testAuthorIDs)){
     2177           
     2178            if(self::$showDebug == true)
     2179                dmp("---- Test Not Empty Authors----");
     2180                       
     2181            $args = GlobalsProviderUC::$lastQueryArgs;
     2182           
     2183            if(self::$showDebug == true){
     2184                dmp("--- Last Query Args (Authors):");
     2185                dmp($args);
     2186            }
     2187                       
     2188            if(!empty(GlobalsProviderUC::$lastQueryRequest)){
     2189                $request = GlobalsProviderUC::$lastQueryRequest;
     2190            }
     2191            else{
     2192               
     2193                $query = new WP_Query($args);
     2194               
     2195                if (is_wp_error($query)) {
     2196                    $error_message = $query->get_error_message();
     2197                    UniteFunctionsUC::throwError("test authors query failed: ".$error_message);
     2198                }
     2199                           
     2200                $request = $query->request;
     2201            }
     2202           
     2203            //some times other hooks distrubting the request
     2204            //clear filters and run again if empty requests
     2205                       
     2206            if(empty($request)){
     2207               
     2208                UniteFunctionsWPUC::clearAllWPFilters();
     2209               
     2210                $query = new WP_Query($args);
     2211                $request = $query->request;
     2212            }
     2213                       
     2214            if(self::$showDebug == true){
     2215               
     2216                if(empty($request))
     2217                    dmp("EMPTY AUTHOR REQUEST!!! - WILL CAUSE ERRORS IN TEST AUTHORS!");
     2218            }
     2219                       
     2220            $authorRequest = $this->getInitFiltersAuthorRequest($request, $testAuthorIDs);
     2221
     2222            if(self::$showDebug == true){
     2223               
     2224                $countLen = strlen($authorRequest);
     2225               
     2226                dmp("---- Test Authors request count: $countLen");
     2227               
     2228                if($countLen < 100){
     2229                    dmp("<div style='color:red;'>Note - request count is too low!</div>");
     2230                    dmp($authorRequest);
     2231                }
     2232               
     2233            }
     2234           
     2235            $arrFoundAuthorIDs = array();
     2236   
     2237            if(!empty($authorRequest)){
     2238
     2239                $db = HelperUC::getDB();
     2240                try{
     2241
     2242                    $arrFoundAuthorIDs = $db->fetchSql($authorRequest);
     2243                    $arrFoundAuthorIDs = $this->modifyFoundAuthorsIDs($arrFoundAuthorIDs);
     2244
     2245                }catch(Exception $e){
     2246                    //just leave it empty
     2247                }
     2248            }
     2249           
     2250            if(self::$showDebug == true){
     2251
     2252                dmp("--- result - authors with num posts");
     2253                dmp($arrFoundAuthorIDs);
     2254            }
     2255
     2256            //set the test author id's for the output
     2257            GlobalsProviderUC::$arrTestAuthorIDs = $arrFoundAuthorIDs;
     2258        }
    20322259
    20332260        $htmlGridItems = UniteFunctionsUC::getVal($arrHtmlWidget, "html");
     
    24692696    }
    24702697
    2471 
     2698   
     2699    private function _____MODIFY_PARAMS_PROCESS_AUTHORS_______(){}
     2700   
     2701   
     2702    /**
     2703     * modify items (terms/authors) set num posts - unified function
     2704     */
     2705    private function modifyOutputItems_setNumPosts($arrItems, $arrTestIDs, $isTerms = false){
     2706       
     2707        if(empty($arrItems))
     2708            return($arrItems);
     2709       
     2710        if($arrTestIDs === null)
     2711            return($arrItems);
     2712               
     2713        foreach($arrItems as $key => $item){
     2714           
     2715            $itemID = UniteFunctionsUC::getVal($item, "id");
     2716
     2717            $itemFound = array_key_exists($itemID, $arrTestIDs);
     2718
     2719            $numPosts = 0;
     2720
     2721            if($itemFound){
     2722                $numPosts = $arrTestIDs[$itemID];
     2723            }
     2724
     2725            //set the number of posts
     2726            $item["num_posts"] = $numPosts;
     2727           
     2728            //for terms, also set num_products if exists
     2729            if($isTerms == true && !empty($item["num_products"])){
     2730                $item["num_products"] = $numPosts;
     2731            }
     2732
     2733            $isHidden = !$itemFound;
     2734
     2735            if($numPosts == 0)
     2736                $isHidden = true;
     2737
     2738            $htmlAttributes = "";
     2739            $htmlAttributesNew = "";
     2740
     2741            if($isHidden == true){
     2742                $htmlAttributes = "hidden='hidden' style='display:none'";
     2743                $htmlAttributesNew = "hidden='hidden' ";    //no style
     2744
     2745                $addClass = UniteFunctionsUC::getVal($item, "addclass");
     2746                $addClass .= " uc-item-hidden";
     2747
     2748                $item["addclass"] = $addClass;
     2749            }
     2750
     2751            $item["hidden"] = $isHidden;
     2752            $item["html_attributes"] = $htmlAttributes;
     2753            $item["html_attributes2"] = $htmlAttributesNew;
     2754
     2755            $arrItems[$key] = $item;
     2756        }
     2757
     2758        return($arrItems);
     2759    }
     2760   
     2761   
     2762    /**
     2763     * modify the authors for init after
     2764     */
     2765    private function modifyOutputAuthors_setNumPosts($arrAuthors){
     2766   
     2767        return $this->modifyOutputTerms_setNumPosts($arrAuthors, true);
     2768    }
     2769
     2770
     2771    /**
     2772     * add first item to authors array
     2773     */
     2774    private function modifyOutputAuthors_addFirstItem($arrAuthors, $data, $filterType){
     2775
     2776        //don't add first item if no authors, if no authors, no "all" as well
     2777
     2778        if(empty($arrAuthors))
     2779            return(array());
     2780
     2781        $addFirst = UniteFunctionsUC::getVal($data, "add_first");
     2782        $addFirst = UniteFunctionsUC::strToBool($addFirst);
     2783
     2784        if($addFirst == false)
     2785            return($arrAuthors);
     2786   
     2787        $text = UniteFunctionsUC::getVal($data, "first_item_text_authors", __("All","unlimited-elements-for-elementor"));
     2788       
     2789        $firstAuthor = array();
     2790        $firstAuthor["index"] = 0;
     2791        $firstAuthor["name"] = $text;
     2792        $firstAuthor["id"] = "";
     2793        $firstAuthor["slug"] = "";
     2794        $firstAuthor["link"] = "";
     2795        $firstAuthor["username"] = "";
     2796        $firstAuthor["user_login"] = "";
     2797
     2798        $firstAuthor["addclass"] = " uc-item-all";
     2799       
     2800        if(!empty(self::$numTotalPosts))
     2801            $firstAuthor["num_posts"] = self::$numTotalPosts;
     2802       
     2803        array_unshift($arrAuthors, $firstAuthor);
     2804
     2805        return($arrAuthors);
     2806    }
     2807
     2808
     2809    /**
     2810     * set selected class by options for authors
     2811     */
     2812    private function modifyOutputAuthors_setSelectedClass($arrAuthors, $filterType){
     2813       
     2814        if(empty($arrAuthors))
     2815            return($arrAuthors);
     2816
     2817        foreach($arrAuthors as $index => $author){
     2818
     2819            $isSelected = UniteFunctionsUC::getVal($author, "isselected");
     2820            $isSelected = UniteFunctionsUC::strToBool($isSelected);
     2821
     2822            if($isSelected == false)
     2823                continue;
     2824
     2825            //hidden can't be selected
     2826
     2827            $isHidden = UniteFunctionsUC::getVal($author, "hidden");
     2828            $isHidden = UniteFunctionsUC::strToBool($isHidden);
     2829
     2830            if($isHidden == true)
     2831                continue;
     2832
     2833            $class = UniteFunctionsUC::getVal($author, "addclass","");
     2834            $class .= " uc-selected";
     2835
     2836            $author["addclass"] = $class;
     2837
     2838            //set select attribute
     2839            switch($filterType){
     2840                case self::TYPE_SELECT:
     2841               
     2842                    $htmlAttributes = UniteFunctionsUC::getVal($author, "html_attributes");
     2843               
     2844                    if(empty($htmlAttributes))
     2845                        $htmlAttributes = "";
     2846
     2847                    $htmlAttributes .= " selected";
     2848
     2849                    $author["html_attributes"] = $htmlAttributes;
     2850
     2851                break;
     2852                case self::TYPE_CHECKBOX:
     2853
     2854                    $author["html_attributes_input"] = " checked";
     2855
     2856                break;
     2857            }
     2858
     2859            $arrAuthors[$index] = $author;
     2860
     2861        }
     2862
     2863
     2864        return($arrAuthors);
     2865    }
     2866
     2867    /**
     2868     * get data attributes for authors
     2869     */
     2870    private function modifyOutputAuthors_getDataAttributes($arrAuthors, $filterType){
     2871       
     2872        if(empty($arrAuthors))
     2873            return($arrAuthors);
     2874       
     2875        foreach($arrAuthors as $index => $author){
     2876
     2877            $authorID = UniteFunctionsUC::getVal($author, "id");
     2878
     2879            if(empty($authorID))
     2880                continue;
     2881             
     2882            $title = UniteFunctionsUC::getVal($author, "name");
     2883            $username = UniteFunctionsUC::getVal($author, "username");
     2884            $userLogin = UniteFunctionsUC::getVal($author, "user_login");
     2885           
     2886            // Use username or user_login as slug equivalent
     2887            $slug = !empty($username) ? $username : $userLogin;
     2888
     2889            $type = "author";
     2890
     2891            $title = esc_attr($title);
     2892            $slug = esc_attr($slug);
     2893
     2894            $key = "{$type}|{$slug}";
     2895
     2896            $htmlData = " data-id=\"$authorID\" data-type=\"$type\" data-username=\"$slug\" data-title=\"{$title}\" data-key=\"{$key}\" ";
     2897           
     2898            $author["html_data"] = $htmlData;
     2899
     2900            $arrAuthors[$index] = $author;
     2901        }
     2902
     2903        return($arrAuthors);
     2904    }
     2905   
    24722906    private function _____MODIFY_PARAMS_PROCESS_TERMS_______(){}
    24732907
     
    26043038        if($addFirst == false)
    26053039            return($arrTerms);
    2606 
    26073040
    26083041        $text = UniteFunctionsUC::getVal($data, "first_item_text", __("All","unlimited-elements-for-elementor"));
     
    26553088        if(empty($numSelectedTab))
    26563089            $numSelectedTab = 1;
    2657 
     3090       
    26583091        //correct selected tab
    26593092
     
    27143147     * modify the terms for init after
    27153148     */
    2716     private function modifyOutputTerms_setNumPosts($arrTerms){
     3149    private function modifyOutputTerms_setNumPosts($arrTerms, $isAuthors = false){
    27173150       
    27183151        if(empty($arrTerms))
    27193152            return($arrTerms);
    27203153       
    2721         if(GlobalsProviderUC::$arrTestTermIDs === null)
     3154        $arrTestIDs = $isAuthors ? GlobalsProviderUC::$arrTestAuthorIDs : GlobalsProviderUC::$arrTestTermIDs;
     3155        $isTerms = ($isAuthors == false);
     3156       
     3157        if($arrTestIDs === null)
    27223158            return($arrTerms);
    2723 
    2724         $arrParentNumPosts = array();
    2725 
    2726         $arrPostNums = GlobalsProviderUC::$arrTestTermIDs;
    2727                
    2728         foreach($arrTerms as $key => $term){
    2729            
    2730             $termID = UniteFunctionsUC::getVal($term, "id");
    2731 
    2732             $termFound = array_key_exists($termID, $arrPostNums);
    2733 
    2734             $numPosts = 0;
    2735 
    2736             if($termFound){
    2737                 $numPosts = $arrPostNums[$termID];
    2738             }
    2739 
    2740             //add parent id if exists
    2741             $parentID = UniteFunctionsUC::getVal($term, "parent_id");
    2742 
    2743             //set the number of posts
    2744             $term["num_posts"] = $numPosts;
    2745 
    2746             if(!empty($term["num_products"]))
    2747                 $term["num_products"] = $numPosts;
    2748 
    2749             $isHidden = !$termFound;
    2750 
    2751             if($numPosts == 0)
    2752                 $isHidden = true;
    2753 
    2754             $htmlAttributes = "";
    2755             $htmlAttributesNew = "";
    2756 
    2757             if($isHidden == true){
    2758                 $htmlAttributes = "hidden='hidden' style='display:none'";
    2759                 $htmlAttributesNew = "hidden='hidden' ";    //no style
    2760 
    2761                 $addClass = UniteFunctionsUC::getVal($term, "addclass");
    2762                 $addClass .= " uc-item-hidden";
    2763 
    2764                 $term["addclass"] = $addClass;
    2765             }
    2766 
    2767             $term["hidden"] = $isHidden;
    2768             $term["html_attributes"] = $htmlAttributes;
    2769             $term["html_attributes2"] = $htmlAttributesNew;
    2770 
    2771             $arrTerms[$key] = $term;
    2772         }
    2773 
    2774 
    2775         return($arrTerms);
     3159       
     3160        return $this->modifyOutputItems_setNumPosts($arrTerms, $arrTestIDs, $isTerms);
    27763161    }
    27773162
     
    29583343        return($arrTerms);
    29593344    }
     3345
    29603346
    29613347    /**
     
    30023388        //add the filter related js and css includes
    30033389        $this->includeClientSideScripts();
    3004 
     3390       
    30053391        $isInitAfter = UniteFunctionsUC::getVal($data, "init_after");
    30063392        $isInitAfter = UniteFunctionsUC::strToBool($isInitAfter);
     
    30113397        $limitGrayedItems = UniteFunctionsUC::getVal($data, "load_limit_grayed");
    30123398        $limitGrayedItems = (int)$limitGrayedItems;
    3013    
     3399
     3400        $showNumberOfPosts = UniteFunctionsUC::getVal($data, "show_number_of_posts");
     3401        $showNumberOfPosts = UniteFunctionsUC::strToBool($showNumberOfPosts);
     3402       
     3403        $filterSource = UniteFunctionsUC::getVal($data, "filter_source");
     3404       
     3405        $isAuthors = ($filterSource == "authors");
     3406       
     3407        if($isAuthors == true && $showNumberOfPosts == true)
     3408            $isInitAfter = true;
     3409       
    30143410        $filterRole = UniteFunctionsUC::getVal($data, "filter_role");
    30153411        if($filterRole == "single")
     
    30453441            $isFirstLoad = true;
    30463442        }
    3047 
     3443       
    30483444        if($filterRole == self::ROLE_TERM_CHILD){
    30493445
     
    30693465
    30703466       
    3071         //modify terms
    3072 
    3073         $arrTerms = UniteFunctionsUC::getVal($data, "taxonomy");
     3467        if($isAuthors == true)
     3468            $arrItems = UniteFunctionsUC::getVal($data, "authors");
     3469        else
     3470            $arrItems = UniteFunctionsUC::getVal($data, "taxonomy");
    30743471       
    30753472        //modify the hidden as well
    3076            
    3077         $arrTerms = $this->modifyOutputTerms_setNumPosts($arrTerms, $isInitAfter, $isFirstLoad);
    3078    
     3473        $arrItems = $this->modifyOutputTerms_setNumPosts($arrItems, $isAuthors);
     3474       
    30793475        //modify the selected class - add first
    3080         $arrTerms = $this->modifyOutputTerms_addFirstItem($arrTerms, $data, $filterType);
    3081 
     3476        if($isAuthors == true)
     3477            $arrItems = $this->modifyOutputAuthors_addFirstItem($arrItems, $data, $filterType);
     3478        else
     3479            $arrItems = $this->modifyOutputTerms_addFirstItem($arrItems, $data, $filterType);
     3480       
    30823481        //modify the selected class
    3083         $arrTerms = $this->modifyOutputTerms_modifySelected($arrTerms, $data,$filterType);
    3084        
    3085         $arrTerms = $this->modifyOutputTerms_modifySelectedByRequest($arrTerms);
     3482        $arrItems = $this->modifyOutputTerms_modifySelected($arrItems, $data,$filterType);
     3483       
     3484        //for terms only
     3485        if($isAuthors == false)
     3486            $arrItems = $this->modifyOutputTerms_modifySelectedByRequest($arrItems);
    30863487       
    30873488        $isFilterHidden = false;
     
    30923493
    30933494                if($isInitAfter == true && !empty($limitGrayedItems) && $isUnderAjax == false)
    3094                     $arrTerms = $this->modifyOutputTerms_tabs_modifyLimitGrayed($arrTerms, $limitGrayedItems);
    3095 
    3096                 $isFilterHidden = $this->modifyOutputTerms_isFilterHidden($data, $arrTerms, $isUnderAjax);
     3495                    $arrItems = $this->modifyOutputTerms_tabs_modifyLimitGrayed($arrItems, $limitGrayedItems);
     3496
     3497                $isFilterHidden = $this->modifyOutputTerms_isFilterHidden($data, $arrItems, $isUnderAjax);
    30973498       
    30983499            break;
     
    31013502                //modify if hidden
    31023503
    3103                 $isFilterHidden = $this->modifyOutputTerms_isFilterHidden($data, $arrTerms, $isUnderAjax);
     3504                $isFilterHidden = $this->modifyOutputTerms_isFilterHidden($data, $arrItems, $isUnderAjax);
    31043505            break;
    31053506        }
    31063507
    3107 
    3108         $arrTerms = $this->modifyOutputTerms_setSelectedClass($arrTerms, $filterType);
    3109        
    3110         $arrTerms = $this->modifyOutputTerms_getDataAttributes($arrTerms, $filterType);
     3508        if($isAuthors == true)
     3509            $arrItems = $this->modifyOutputAuthors_setSelectedClass($arrItems, $filterType);
     3510        else
     3511            $arrItems = $this->modifyOutputTerms_setSelectedClass($arrItems, $filterType);
     3512       
     3513        if($isAuthors == true)
     3514            $arrItems = $this->modifyOutputAuthors_getDataAttributes($arrItems, $filterType);
     3515        else
     3516            $arrItems = $this->modifyOutputTerms_getDataAttributes($arrItems, $filterType);
     3517       
    31113518       
    31123519        //hide child filter at start
     
    31323539        $data["filter_first_load"] = $isFirstLoad?"yes":"no";
    31333540       
    3134         $data["taxonomy"] = $arrTerms;
    3135        
    3136 
     3541        if($isAuthors)
     3542            $data["authors"] = $arrItems;
     3543        else
     3544            $data["taxonomy"] = $arrItems;
     3545       
     3546           
    31373547        return($data);
    31383548    }
  • unlimited-elements-for-elementor/trunk/inc_php/unitecreator_params_processor.class.php

    r3429507 r3442278  
    12321232    private function z___________PARAMS_OUTPUT____________(){}
    12331233
     1234   
     1235    /**
     1236     * modify params by special addon behavior
     1237     * for the post filters, modify the run of some requests of terms or authors
     1238     */
     1239    protected function modifyParamsBySpecialAddonBehaviour($arrParams){
     1240       
     1241        if(is_array($arrParams) == false || empty($arrParams))
     1242            return($arrParams);
     1243       
     1244        $special = $this->addon->getOption("special");
     1245       
     1246        if(empty($special))
     1247            return($arrParams);
     1248       
     1249       
     1250        //do some operations for the filter special behaviour
     1251           
     1252        if($special != "post_filter")
     1253            return($arrParams);
     1254       
     1255        $filterSource = "";
     1256        foreach($arrParams as $param){
     1257            $name = UniteFunctionsUC::getVal($param, "name");
     1258            if($name !== "filter_source")
     1259                continue;
     1260           
     1261            $filterSource = UniteFunctionsUC::getVal($param, "value");
     1262            if($filterSource === "")
     1263                $filterSource = UniteFunctionsUC::getVal($param, "default_value");
     1264           
     1265            break;
     1266        }
     1267       
     1268        switch($filterSource){
     1269            case "terms":
     1270            case "authors":
     1271            break;
     1272            default:
     1273                return($arrParams);
     1274            break;
     1275        }
     1276       
     1277        if($filterSource === "")
     1278            return($arrParams);
     1279       
     1280        $isAuthors = ($filterSource == "authors");
     1281        $arrParamsNew = array();
     1282       
     1283        foreach($arrParams as $param){
     1284            $type = UniteFunctionsUC::getVal($param, "type");
     1285            $name = UniteFunctionsUC::getVal($param, "name");
     1286           
     1287            if($isAuthors == true){
     1288                if($type == UniteCreatorDialogParam::PARAM_POST_TERMS || $name == "taxonomy")
     1289                    continue;
     1290            }else{
     1291                if($type == UniteCreatorDialogParam::PARAM_USERS || $name == "authors")
     1292                    continue;
     1293            }
     1294           
     1295            $arrParamsNew[] = $param;
     1296        }
     1297       
     1298        return($arrParamsNew);
     1299    }
     1300   
     1301   
     1302    /**
     1303     * modify addon special behaviour
     1304     */
    12341305    protected function modifyDataBySpecialAddonBehaviour($data){
    12351306
     
    19932064        $data = array();
    19942065
     2066        //modify some params, like in filter, if the source is authors - remove the terms param
     2067        //and if the source is terms, remove the users param
     2068        $arrParams = $this->modifyParamsBySpecialAddonBehaviour($arrParams);
     2069       
    19952070        foreach($arrParams as $param){
    19962071            $type = UniteFunctionsUC::getVal($param, "type");
     
    20182093
    20192094        $data = $this->modifyDataBySpecialAddonBehaviour($data);
    2020 
     2095       
    20212096        return $data;
    20222097    }
  • unlimited-elements-for-elementor/trunk/includes.php

    r3432094 r3442278  
    1313
    1414if(!defined("UNLIMITED_ELEMENTS_VERSION"))
    15     define("UNLIMITED_ELEMENTS_VERSION", "2.0.3");
     15    define("UNLIMITED_ELEMENTS_VERSION", "2.0.4");
    1616
    1717//disable elementor support for debugging purposes. keep it commented
     
    144144    require GlobalsUC::$pathPro."includes_pro.php";
    145145
    146    
    147146GlobalsUC::initAfterIncludes();
    148  
    149  
  • unlimited-elements-for-elementor/trunk/provider/core/provider_main_file.php

    r3329756 r3442278  
    3535            dmp($trace);
    3636    }
    37    
    38    
    39 ?>
  • unlimited-elements-for-elementor/trunk/provider/functions_wordpress.class.php

    r3429507 r3442278  
    38783878       
    38793879        return ($arrData);
     3880    }
     3881
     3882    /**
     3883     * get user names from list of user objects for debug
     3884     * returns array of formatted strings: "Display Name (ID: X, Login: Y)"
     3885     */
     3886    public static function getUsersNamesShort($arrUsers){
     3887       
     3888        if(empty($arrUsers))
     3889            return(array());
     3890       
     3891        $arrUserNames = array();
     3892       
     3893        foreach($arrUsers as $user){
     3894           
     3895            $userName = $user->display_name;
     3896            $userID = $user->ID;
     3897            $userLogin = $user->user_login;
     3898           
     3899            $arrUserNames[] = "$userName (ID: $userID, Login: $userLogin)";
     3900        }
     3901       
     3902        return($arrUserNames);
    38803903    }
    38813904
  • unlimited-elements-for-elementor/trunk/provider/provider_globals.class.php

    r3379552 r3442278  
    6060   
    6161    public static $arrTestTermIDs = null;   //test term id's for render taxonomies under ajax
     62    public static $arrTestAuthorIDs = null; //test author id's for render authors under ajax
    6263   
    6364    public static $disablePostContentFiltering = false;
  • unlimited-elements-for-elementor/trunk/provider/provider_params_processor.class.php

    r3379552 r3442278  
    47394739
    47404740            $arrTerms = UniteFunctionsWPUC::getTerms($taxonomy, $orderBy, $orderDir, $isHide, $arrExcludeSlugs, $params);
    4741 
     4741           
    47424742            if($showDebug == true){
    47434743                echo "<div class='uc-div-ajax-debug'>";
     
    48034803     */
    48044804    public function getWPTermsData($value, $name, $processType, $param, $data){
    4805 
    4806                
     4805       
    48074806        $postType = UniteFunctionsUC::getVal($value, $name."_posttype","post");
    48084807        $taxonomy =  UniteFunctionsUC::getVal($value, $name."_taxonomy","category");
     
    48214820        $showDebug = UniteFunctionsUC::strToBool($showDebug);
    48224821       
    4823 
    48244822        $queryDebugType = "";
    48254823        if($showDebug == true)
     
    53545352     */
    53555353    public function getWPUsersData($value, $name, $processType, $param){
    5356 
     5354       
    53575355        $showDebug = UniteFunctionsUC::getVal($value, $name."_show_query_debug");
    53585356        $showDebug = UniteFunctionsUC::strToBool($showDebug);
    5359 
     5357       
     5358        $queryDebugType = "";
     5359
     5360        if(GlobalsUC::$showQueryDebugByUrl == true){
     5361            $showDebug = true;
     5362            $queryDebugType = "show_query";
     5363        }
     5364       
    53605365        $selectType = UniteFunctionsUC::getVal($value, $name."_type");
    53615366
     
    53715376
    53725377        }else{
    5373 
     5378           
     5379            if($showDebug == true){
     5380                dmp("users query values array");
     5381                dmp($value);
     5382            }
     5383           
    53745384            //create the args
    53755385            $strRoles = UniteFunctionsUC::getVal($value, $name."_role");
    5376 
    5377             if(is_array($strRoles))
     5386             
     5387            if(empty($strRoles)) {
     5388                $arrRoles = array("administrator");
     5389            } elseif(is_array($strRoles)) {
    53785390                $arrRoles = $strRoles;
    5379             else
     5391            } else {
     5392                $strRoles = trim($strRoles);
    53805393                $arrRoles = explode(",", $strRoles);
     5394            }
    53815395
    53825396            $arrRoles = UniteFunctionsUC::arrayToAssoc($arrRoles);
    53835397            unset($arrRoles["__all__"]);
    5384 
     5398           
    53855399            if(!empty($arrRoles)){
    53865400                $arrRoles = array_values($arrRoles);
    5387 
     5401           
    53885402                $args["role__in"] = $arrRoles;
    53895403            }
     
    54445458
    54455459        if($showDebug == true){
     5460            echo "<div class='uc-div-ajax-debug'>";
    54465461            dmp("The users query is:");
    54475462            dmp($args);
     
    54505465        HelperUC::addDebug("Get Users Args", $args);
    54515466
    5452         $arrUsers = get_users($args);
     5467        $user_query = new WP_User_Query($args);
     5468        $arrUsers = $user_query->get_results();
    54535469       
    54545470        HelperUC::addDebug("Num Users fetched: ".count($arrUsers));
    5455 
     5471 
    54565472        if($showDebug == true){
    5457             dmp("Num Users fetched: ".count($arrUsers));
    5458         }
     5473            dmp("users found: ".count($arrUsers));
     5474             
     5475            //show user names
     5476            if(!empty($arrUsers)){
     5477                $arrUserNames = UniteFunctionsWPUC::getUsersNamesShort($arrUsers);
     5478                dmp("User names found:");
     5479                dmp($arrUserNames);
     5480            }
     5481        }
     5482
     5483        //user query debug
     5484 
     5485        if($showDebug == true && $queryDebugType == "show_query"){
     5486
     5487            $originalQueryVars = $user_query->query_vars;
     5488            $originalQueryVars = UniteFunctionsWPUC::cleanQueryArgsForDebug($originalQueryVars);
     5489
     5490            dmp("The Query Request Is:");
     5491            dmp($user_query->request);
     5492
     5493            dmp("The finals query vars:");
     5494            dmp($originalQueryVars);
     5495        }
     5496
     5497        if($showDebug == true)
     5498            echo "</div>";
    54595499
    54605500       
     
    56005640     */
    56015641    private function modifyData_postFilterOptions($data, $filterType){
    5602 
     5642               
    56035643        $objFilters = new UniteCreatorFiltersProcess();
    56045644
     
    56135653     */
    56145654    protected function modifyDataBySpecialAddonBehaviour($data){
    5615 
     5655       
    56165656        $special = $this->addon->getOption("special");
    56175657        $specialData = $this->addon->getOption("special_data");
  • unlimited-elements-for-elementor/trunk/readme.txt

    r3432094 r3442278  
    940940
    941941== Changelog ==
     942
     943
     944= 2.0.4 - 2026-01-19 =
     945
     946Plugin Changes:
     947
     948* Feature - made functionality of load more before the grid
     949* Feature - added authors filter functionality to post filters.
     950
     951Widgets Changes:
     952
     953* Feature: Event List (Pro) - A new Link Entire Item option has been introduced that allows the clickable area to encompass the entire element instead of just specific parts of the content
     954* Feature: Toggle Box (Pro) - A new Show Back Button option has been added which allows for the inclusion of a dedicated button containing a specific link.
     955* Feature: Unlimited Carousel (Pro) - Added Start Item Number option, allowing to start from a specific item.
     956* Feature: File Field (Pro) - Added Required option allowing to make the File Field widget mandatory.
     957* Feature: Conditions (Free) - Added three new actions - UE Open Liquid Menu, UE Close Liquid Menu, and UE Toggle Liquid Menu - allowing full programmatic control over the Liquid Menu widget behavior
     958* Feature: Liquid Full Screen Menu (Free) - Added support for the Conditions widget, enabling seamless control over the Menu by allowing it to be opened, closed, or toggled dynamically based on defined conditions
     959* Feature: Conditions (Free) - Added three new actions - UE Open Fullscreen Menu, UE Close Fullscreen Menu, and UE Toggle Fullscreen Menu - allowing full programmatic control over the Fullscreen Menu widget behavior
     960* Feature: Fullscreen Menu (Free) - Added support for the Conditions widget, enabling seamless control over the Menu by allowing it to be opened, closed, or toggled dynamically based on defined conditions
     961* Feature: Unlimited Carousel (Pro) - A new feature has been implemented that allows users to enable an Equalize Content Height option to ensure uniform dimensions across all elements.
     962* Fix: Vertical Curved Timeline (Free) - An issue was resolved where HTML attributes were not being correctly applied to the link element.
     963* Fix: Testimonial Carousel (Free) - An issue was resolved where the Show Arrows option only successfully hid the navigation arrows on desktop devices when set to false instead of applying the setting across all device types.
     964* Fix: Google Reviews (Free) - An issue was resolved where the Show Arrows option only successfully hid the navigation arrows on desktop devices when set to false instead of applying the setting across all device types.
     965* Fix: Unlimited Carousel (Pro) - An issue was resolved where certain links within cloned items remained non-functional and could not be clicked following the initial page load.
     966* Fix: Stacking Cards (Free) - Fixed issue related to Image display with Alternate Position Image option.
     967* Fix: Content Tabs (Free) - An issue was resolved where nested content tabs widgets failed to update the active state icons of inner accordion items when those items were activated.
     968* Fix: Google Reviews (Free) - An issue has been resolved that previously prevented the remote connection options from functioning correctly when using the coverflow layout type.
     969
    942970
    943971= 2.0.3 - 2026-01-04 =
  • unlimited-elements-for-elementor/trunk/release_log.txt

    r3432094 r3442278  
    11
     2
     3version 2.0.4:
     4
     5* Feautre - made functionality of load more before the grid
     6* Feature - added authors filter functionality to post filters.
    27
    38
Note: See TracChangeset for help on using the changeset viewer.