Changeset 3442278
- Timestamp:
- 01/19/2026 07:57:06 AM (7 weeks ago)
- Location:
- unlimited-elements-for-elementor/trunk
- Files:
-
- 17 edited
-
assets_libraries/filters/ue_filters.js (modified) (18 diffs)
-
changelog.txt (modified) (15 diffs)
-
inc_php/framework/functions.class.php (modified) (1 diff)
-
inc_php/framework/zip.class.php (modified) (2 diffs)
-
inc_php/layouts/unitecreator_layouts_exporter.class.php (modified) (2 diffs)
-
inc_php/unitecreator_actions.class.php (modified) (1 diff)
-
inc_php/unitecreator_addons.class.php (modified) (1 diff)
-
inc_php/unitecreator_exporter.class.php (modified) (2 diffs)
-
inc_php/unitecreator_filters_process.class.php (modified) (20 diffs)
-
inc_php/unitecreator_params_processor.class.php (modified) (3 diffs)
-
includes.php (modified) (2 diffs)
-
provider/core/provider_main_file.php (modified) (1 diff)
-
provider/functions_wordpress.class.php (modified) (1 diff)
-
provider/provider_globals.class.php (modified) (1 diff)
-
provider/provider_params_processor.class.php (modified) (9 diffs)
-
readme.txt (modified) (1 diff)
-
release_log.txt (modified) (1 diff)
Legend:
- Unmodified
- Added
- Removed
-
unlimited-elements-for-elementor/trunk/assets_libraries/filters/ue_filters.js
r3429638 r3442278 1315 1315 1316 1316 var objLink = jQuery(this); 1317 1317 1318 1318 if(objLink.hasClass("uc-grid-filter")){ 1319 1319 … … 1496 1496 1497 1497 if(filterType != "general"){ 1498 1498 1499 1499 trace(objFilter); 1500 1500 … … 1860 1860 */ 1861 1861 function getFilterElementData(objElement){ 1862 1862 1863 1863 var id = objElement.data("id"); 1864 var slug = objElement.data("slug");1865 var taxonomy = objElement.data("taxonomy");1866 1864 var title = objElement.data("title"); 1867 1865 var key = objElement.data("key"); 1868 1866 var type = objElement.data("type"); 1869 1867 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 1883 1901 } 1884 1902 … … 3018 3036 var arrTerms = []; 3019 3037 var objTaxIDs = {}; 3038 var objAuthorIDs = {}; 3020 3039 var strSelectedTerms = ""; 3040 var strSelectedAuthors = ""; 3021 3041 var search = ""; 3022 3042 var price_from, price_to; 3043 var arrAuthors = []; 3023 3044 var orderby = null; 3024 3045 var orderby_metaname = null; … … 3089 3110 if(urlAdd) 3090 3111 urlAddFromFilters = addUrlParam(urlAddFromFilters, urlAdd); 3091 3112 3092 3113 switch(type){ 3093 3114 case g_types.PAGINATION: … … 3120 3141 case g_types.LOADMORE: 3121 3142 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) 3123 3158 return(true); 3124 3159 … … 3148 3183 //if not init mode - take first item 3149 3184 var objTerm = getTermsListSelectedTerm(objFilter); 3150 3185 var filterSource = objFilter.data("filtersource"); 3186 3151 3187 if(objTerm){ 3152 3188 3153 3189 if(isFiltersInitMode == false){ 3154 3190 3155 arrTerms.push(objTerm); 3191 if(filterSource == "authors") 3192 arrAuthors.push(objTerm); 3193 else 3194 arrTerms.push(objTerm); 3156 3195 } 3157 3196 else{ … … 3166 3205 arrTerms.push(objTerm); 3167 3206 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 } 3170 3215 3171 3216 //set selected terms string 3172 3217 3173 3218 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 } 3178 3233 3179 3234 } 3180 3181 3235 } 3182 3236 … … 3228 3282 3229 3283 var generalIsNoRefresh = objFilter.data("norefresh"); 3230 3284 3231 3285 if(generalIsNoRefresh === true) 3232 3286 isNoRefresh = true; … … 3237 3291 3238 3292 var dataTerms = getVal(filterData,"terms"); 3239 3293 3240 3294 if(dataTerms && dataTerms.length){ 3241 3295 … … 3298 3352 } 3299 3353 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 3300 3384 3301 3385 if(g_showDebug == true){ … … 3400 3484 3401 3485 //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 } 3403 3493 3404 3494 if(strRefreshIDs) … … 3438 3528 var urlAddition_filtersTest = ""; 3439 3529 var strTaxIDs = getTermDsList(objTaxIDs); 3530 var strAuthorIDs = getTermDsList(objAuthorIDs); 3440 3531 3441 3532 if(isFiltersInitMode == true){ 3442 3533 3443 if(!strTaxIDs && arrFiltersForInit.length == 0)3534 if(!strTaxIDs && !strAuthorIDs && arrFiltersForInit.length == 0) 3444 3535 urlAjax = null; 3445 3536 else{ … … 3455 3546 3456 3547 if(strTaxIDs && (search || arrTerms.length || isFiltersInitMode == true || wasInitMode === true) ){ 3457 3548 3458 3549 if(urlAddition_filtersTest) 3459 3550 urlAddition_filtersTest += "&"; 3460 3551 3461 3552 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; 3462 3562 } 3463 3563 … … 3551 3651 } 3552 3652 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 3553 3673 if(child_auto && arrTerms.length && childAutoString != ""){ 3554 3674 urlAjax += childAutoString; … … 3556 3676 3557 3677 if(orderby){ 3558 3678 3559 3679 urlAjax += "&ucorderby="+orderby; 3560 3680 urlReplace = addUrlParam(urlReplace, "ucorderby="+orderby); … … 3578 3698 } 3579 3699 3580 if(isFiltersInitMode && strSelectedTerms )3700 if(isFiltersInitMode && strSelectedTerms && strSelectedTerms !== "undefined") 3581 3701 urlAjax += "&ucinitselectedterms="+strSelectedTerms; 3582 3702 3703 if(isFiltersInitMode && strSelectedAuthors && strSelectedAuthors !== "undefined") 3704 urlAjax += "&ucinitselectedauthors="+strSelectedAuthors; 3583 3705 3584 3706 //add refresh ids … … 4079 4201 if(type == g_types.GENERAL){ 4080 4202 var generalType = objFilter.data("generaltype"); 4081 4203 4082 4204 if(!generalType){ 4083 4205 trace(objFilter); -
unlimited-elements-for-elementor/trunk/changelog.txt
r3432094 r3442278 2 2 3 3 == Changelog == 4 5 = 2.0.4 - 2026-01-19 = 6 7 Plugin Changes: 8 9 * Feature - made functionality of load more before the grid 10 * Feature - added authors filter functionality to post filters. 11 12 Widgets 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. 4 30 5 31 = 2.0.3 - 2026-01-04 = … … 106 132 * 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. 107 133 * 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. 109 135 110 136 … … 137 163 138 164 * 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 "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 "Disable Pointer Blocking" option, allows users to prevent the widget from blocking pointer events when the background is displayed as the foreground. 140 166 * 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. 141 167 * 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. … … 148 174 * Feature: Unlimited Google Maps (Free) - Added Zoom Level Mobile option that allows setting a custom zoom level specifically for mobile devices 149 175 * Feature: PDF Viewer (Free) - Improved PDF Viewer Widget accessibility - added role="region" 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="polite" 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="form" to the main widget, added proper aria-label attributes for inputs, search fields, and currency selectors, made the swap button keyboard-focusable with tabindex="0" and role="button", added aria-live="polite" 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="form" to the main widget, added proper aria-label attributes for inputs, search fields, and currency selectors, made the swap button keyboard-focusable with tabindex="0" and role="button", added aria-live="polite" to the output container for dynamic updates, and ensured all interactive elements have meaningful labels for screen readers. 151 177 * 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. 152 178 * Feature: Comparison List (Pro) - Added vertical and text alignment options for the Package Column. … … 175 201 * 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. 176 202 * 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="group" to the main wrapper, added aria-label describing the widget s purpose, ensured all <img> elements have meaningful alt text, and set appropriate aria-hidden="true" attributes for device overlays to improve screen reader experience.203 * Fix: Image Scroll (Free) - Added accessibility features to the Widget - assigned role="group" to the main wrapper, added aria-label describing the widget's purpose, ensured all <img> elements have meaningful alt text, and set appropriate aria-hidden="true" attributes for device overlays to improve screen reader experience. 178 204 * Fix: 360 Product Viewer (Pro) - Added role="region" with aria-label to the main wrapper, aria-live="polite" for dynamic updates, and aria-labels plus role="button" for navigation controls to improve accessibility of the widget. 179 205 * Fix: Layers (Pro) - Added role="group" with aria-label="Layered visual content" to the main widget wrapper and role="img" to icon elements to improve accessibility and assistive technology support. … … 193 219 * Fix: Christmas Icons (Free) - Improved accessibility by hiding decorative icons from assistive technologies with aria-hidden="true", and adding aria-label to links where applicable. 194 220 * 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. 196 222 * Fix: Animated Hamburger Icon (Free) - Added accessibility support to the widget by including role, aria-label and aria-expanded attributes. 197 223 * Fix: Image Shapes (Pro) - Added accessibility support to Image Shapes widget by including role="img" and aria-label attributes. … … 208 234 * Fix: Rhombus Grid (Pro) - Improved accessibility in Rhombus Grid widget by adding roles, aria-labels, keyboard navigation, and focus support. 209 235 * 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. 211 237 * 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. 212 238 * 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. … … 279 305 * Feature: Flag Icons (Free) - Extended the "Link" option to work with all layout types, not just the dropdown layout, providing greater flexibility and consistency across different designs. 280 306 * 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. 282 308 * Feature: Repeater Carousel (Pro) - Added support for WYSIWYG type of ACF field, enabling rich text content to be displayed properly within the widget. 283 309 * Feature: Repeater Grid (Pro) - Added support for WYSIWYG type of ACF field, enabling rich text content to be displayed properly within the widget. … … 300 326 * Change: Content Grid (Free) - Changed the option name "Dynamic Popup Select" to "Button Link Type" in order to make its purpose clearer and more intuitive for users. 301 327 * 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 Titlesettings.328 * 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. 303 329 * 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. 304 330 * 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. … … 361 387 * Other: Select Dropdown Filter (Free) - Added additional instruction for the Select First option, providing clearer guidance on its usage and behavior. 362 388 * 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! 364 390 365 391 … … 575 601 * Feature: Post Query Summary (Pro) - Added Enable Thousand Separator option, allowing numbers to be automatically formatted with thousand separators for better readability. 576 602 * Change: Vertical Curved Timeline (Free) - Changed tag for Item Description from <p> to <div>. 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. 578 604 * Fix: RSS Feed (Free) - Fixed issue where the Show Text option was missing, causing the description element to not appear. 579 605 * Fix: Neon Glowing Button Effect (Pro) - Fixed issue when Glow effect was not working correctly in Safari browser. … … 840 866 * Fix: Unlimited Table (Pro) - Fixed issue where the Override Icon Color option was not working in certain cases 841 867 * 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. 843 869 * Fix: Sorting Filter (Pro) - Fixed an issue in the JavaScript code that caused unexpected behavior in certain scenarios. 844 870 * 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. … … 1349 1375 1350 1376 * 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 "Disable Calculation in Editor" 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 "Disable Calculation in Editor" debug option to prevent the page from crashing or becoming unresponsive when multiple fields are set to calculation mode, enhancing stability during editing. 1352 1378 * 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 1353 1379 * Feature: Submit Button (Free) - Added validation function for the email field to ensure correct email format and improve data accuracy. … … 1740 1766 * 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. 1741 1767 * 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. 1743 1769 * 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. 1744 1770 * 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. … … 3761 3787 = What if I update to the Premium version after using the Free version? = 3762 3788 3763 Your existing elements/content will work with the premium version. So you won ÐÑвâ¬вâÑt lose your any of your hard work.3789 Your existing elements/content will work with the premium version. So you won't lose your any of your hard work. 3764 3790 3765 3791 = Can I get a refund? = -
unlimited-elements-for-elementor/trunk/inc_php/framework/functions.class.php
r3401883 r3442278 4105 4105 4106 4106 UniteFunctionsUC::validateFilepath($filepath,"export file"); 4107 4107 4108 4108 if(empty($filename)) 4109 4109 $filename = basename($filepath); 4110 4110 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 4111 4116 header('Content-Description: File Transfer'); 4112 4117 header('Content-Type: application/octet-stream'); -
unlimited-elements-for-elementor/trunk/inc_php/framework/zip.class.php
r3329756 r3442278 98 98 private function addItem($basePath, $path){ 99 99 100 //normalize paths - remove trailing slashes for consistent comparison 101 $basePath = rtrim($basePath, "/\\"); 102 $path = rtrim($path, "/\\"); 103 104 //calculate relative path 100 105 $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, "./\\"); 101 116 102 117 if(is_dir($path)){ //directory … … 110 125 $files = scandir($path); 111 126 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] == ".")) 113 129 continue; 114 130 $filepath = $path . "/" . $file; -
unlimited-elements-for-elementor/trunk/inc_php/layouts/unitecreator_layouts_exporter.class.php
r3251080 r3442278 263 263 264 264 $filepath = $this->pathCopyLayout.$filenameZip; 265 265 266 266 267 267 if(file_exists($filepath)){ … … 285 285 $zip = new UniteZipUC(); 286 286 $zip->makeZip($this->pathExportLayout, $filepath); 287 287 288 288 289 if(file_exists($this->pathExportLayout) == false) 289 290 UniteFunctionsUC::throwError("zip file {$filepath} could not be created"); -
unlimited-elements-for-elementor/trunk/inc_php/unitecreator_actions.class.php
r3429507 r3442278 401 401 break; 402 402 case "export_addon": 403 403 404 404 HelperProviderUC::verifyAdminPermission(); 405 405 -
unlimited-elements-for-elementor/trunk/inc_php/unitecreator_addons.class.php
r3429507 r3442278 1501 1501 */ 1502 1502 public function exportAddon($data){ 1503 1503 1504 1504 $addonType = $this->getAddonTypeFromData($data); 1505 1505 $isLayout = HelperUC::isLayoutAddonType($addonType); 1506 1506 1507 1507 try{ 1508 1508 if($isLayout == false){ -
unlimited-elements-for-elementor/trunk/inc_php/unitecreator_exporter.class.php
r3317018 r3442278 393 393 */ 394 394 private function makeExportZipFile(){ 395 395 396 396 $zip = new UniteZipUC(); 397 397 $zip->makeZip($this->pathExportAddon, $this->filepathAddonZip); … … 522 522 523 523 $this->makeExportZipFile(); 524 524 525 $this->deleteExportAddonFolder(); 525 526 526 527 if(!empty($moveFolder)){ 527 528 $this->moveExportZipToFolder($moveFolder, $createCategoryFolders); -
unlimited-elements-for-elementor/trunk/inc_php/unitecreator_filters_process.class.php
r3397365 r3442278 523 523 */ 524 524 private function getArrInputFilters_getOrderby($arrOutput, $request){ 525 525 526 526 $orderby = UniteFunctionsUC::getVal($request, "ucorderby"); 527 527 $orderby = UniteProviderFunctionsUC::sanitizeVar($orderby, UniteFunctionsUC::SANITIZE_KEY); … … 695 695 } 696 696 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 697 714 self::$arrInputFiltersCache = $arrOutput; 698 715 … … 797 814 if(!empty($mainTermID)) 798 815 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; 799 822 800 823 … … 989 1012 $titleStart = UniteFunctionsUC::getVal($arrFilters, "titlestart"); 990 1013 $mainTermID = UniteFunctionsUC::getVal($arrFilters, "maintermid"); 1014 $arrAuthors = UniteFunctionsUC::getVal($arrFilters, "authors"); 991 1015 992 1016 … … 1143 1167 } 1144 1168 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 } 1145 1191 1146 1192 //set the title start … … 1865 1911 } 1866 1912 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 1867 2006 1868 2007 … … 1906 2045 $testTermIDs = UniteFunctionsUC::getPostGetVariable("testtermids","",UniteFunctionsUC::SANITIZE_TEXT_FIELD); 1907 2046 UniteFunctionsUC::validateIDsList($testTermIDs); 2047 2048 $testAuthorIDs = UniteFunctionsUC::getPostGetVariable("testauthorids","",UniteFunctionsUC::SANITIZE_TEXT_FIELD); 2049 UniteFunctionsUC::validateIDsList($testAuthorIDs); 1908 2050 1909 2051 //replace terms mode … … 2030 2172 GlobalsProviderUC::$arrTestTermIDs = $arrFoundTermIDs; 2031 2173 } 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 } 2032 2259 2033 2260 $htmlGridItems = UniteFunctionsUC::getVal($arrHtmlWidget, "html"); … … 2469 2696 } 2470 2697 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 2472 2906 private function _____MODIFY_PARAMS_PROCESS_TERMS_______(){} 2473 2907 … … 2604 3038 if($addFirst == false) 2605 3039 return($arrTerms); 2606 2607 3040 2608 3041 $text = UniteFunctionsUC::getVal($data, "first_item_text", __("All","unlimited-elements-for-elementor")); … … 2655 3088 if(empty($numSelectedTab)) 2656 3089 $numSelectedTab = 1; 2657 3090 2658 3091 //correct selected tab 2659 3092 … … 2714 3147 * modify the terms for init after 2715 3148 */ 2716 private function modifyOutputTerms_setNumPosts($arrTerms ){3149 private function modifyOutputTerms_setNumPosts($arrTerms, $isAuthors = false){ 2717 3150 2718 3151 if(empty($arrTerms)) 2719 3152 return($arrTerms); 2720 3153 2721 if(GlobalsProviderUC::$arrTestTermIDs === null) 3154 $arrTestIDs = $isAuthors ? GlobalsProviderUC::$arrTestAuthorIDs : GlobalsProviderUC::$arrTestTermIDs; 3155 $isTerms = ($isAuthors == false); 3156 3157 if($arrTestIDs === null) 2722 3158 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); 2776 3161 } 2777 3162 … … 2958 3343 return($arrTerms); 2959 3344 } 3345 2960 3346 2961 3347 /** … … 3002 3388 //add the filter related js and css includes 3003 3389 $this->includeClientSideScripts(); 3004 3390 3005 3391 $isInitAfter = UniteFunctionsUC::getVal($data, "init_after"); 3006 3392 $isInitAfter = UniteFunctionsUC::strToBool($isInitAfter); … … 3011 3397 $limitGrayedItems = UniteFunctionsUC::getVal($data, "load_limit_grayed"); 3012 3398 $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 3014 3410 $filterRole = UniteFunctionsUC::getVal($data, "filter_role"); 3015 3411 if($filterRole == "single") … … 3045 3441 $isFirstLoad = true; 3046 3442 } 3047 3443 3048 3444 if($filterRole == self::ROLE_TERM_CHILD){ 3049 3445 … … 3069 3465 3070 3466 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"); 3074 3471 3075 3472 //modify the hidden as well 3076 3077 $arrTerms = $this->modifyOutputTerms_setNumPosts($arrTerms, $isInitAfter, $isFirstLoad); 3078 3473 $arrItems = $this->modifyOutputTerms_setNumPosts($arrItems, $isAuthors); 3474 3079 3475 //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 3082 3481 //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); 3086 3487 3087 3488 $isFilterHidden = false; … … 3092 3493 3093 3494 if($isInitAfter == true && !empty($limitGrayedItems) && $isUnderAjax == false) 3094 $arr Terms = $this->modifyOutputTerms_tabs_modifyLimitGrayed($arrTerms, $limitGrayedItems);3095 3096 $isFilterHidden = $this->modifyOutputTerms_isFilterHidden($data, $arr Terms, $isUnderAjax);3495 $arrItems = $this->modifyOutputTerms_tabs_modifyLimitGrayed($arrItems, $limitGrayedItems); 3496 3497 $isFilterHidden = $this->modifyOutputTerms_isFilterHidden($data, $arrItems, $isUnderAjax); 3097 3498 3098 3499 break; … … 3101 3502 //modify if hidden 3102 3503 3103 $isFilterHidden = $this->modifyOutputTerms_isFilterHidden($data, $arr Terms, $isUnderAjax);3504 $isFilterHidden = $this->modifyOutputTerms_isFilterHidden($data, $arrItems, $isUnderAjax); 3104 3505 break; 3105 3506 } 3106 3507 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 3111 3518 3112 3519 //hide child filter at start … … 3132 3539 $data["filter_first_load"] = $isFirstLoad?"yes":"no"; 3133 3540 3134 $data["taxonomy"] = $arrTerms; 3135 3136 3541 if($isAuthors) 3542 $data["authors"] = $arrItems; 3543 else 3544 $data["taxonomy"] = $arrItems; 3545 3546 3137 3547 return($data); 3138 3548 } -
unlimited-elements-for-elementor/trunk/inc_php/unitecreator_params_processor.class.php
r3429507 r3442278 1232 1232 private function z___________PARAMS_OUTPUT____________(){} 1233 1233 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 */ 1234 1305 protected function modifyDataBySpecialAddonBehaviour($data){ 1235 1306 … … 1993 2064 $data = array(); 1994 2065 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 1995 2070 foreach($arrParams as $param){ 1996 2071 $type = UniteFunctionsUC::getVal($param, "type"); … … 2018 2093 2019 2094 $data = $this->modifyDataBySpecialAddonBehaviour($data); 2020 2095 2021 2096 return $data; 2022 2097 } -
unlimited-elements-for-elementor/trunk/includes.php
r3432094 r3442278 13 13 14 14 if(!defined("UNLIMITED_ELEMENTS_VERSION")) 15 define("UNLIMITED_ELEMENTS_VERSION", "2.0. 3");15 define("UNLIMITED_ELEMENTS_VERSION", "2.0.4"); 16 16 17 17 //disable elementor support for debugging purposes. keep it commented … … 144 144 require GlobalsUC::$pathPro."includes_pro.php"; 145 145 146 147 146 GlobalsUC::initAfterIncludes(); 148 149 -
unlimited-elements-for-elementor/trunk/provider/core/provider_main_file.php
r3329756 r3442278 35 35 dmp($trace); 36 36 } 37 38 39 ?> -
unlimited-elements-for-elementor/trunk/provider/functions_wordpress.class.php
r3429507 r3442278 3878 3878 3879 3879 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); 3880 3903 } 3881 3904 -
unlimited-elements-for-elementor/trunk/provider/provider_globals.class.php
r3379552 r3442278 60 60 61 61 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 62 63 63 64 public static $disablePostContentFiltering = false; -
unlimited-elements-for-elementor/trunk/provider/provider_params_processor.class.php
r3379552 r3442278 4739 4739 4740 4740 $arrTerms = UniteFunctionsWPUC::getTerms($taxonomy, $orderBy, $orderDir, $isHide, $arrExcludeSlugs, $params); 4741 4741 4742 4742 if($showDebug == true){ 4743 4743 echo "<div class='uc-div-ajax-debug'>"; … … 4803 4803 */ 4804 4804 public function getWPTermsData($value, $name, $processType, $param, $data){ 4805 4806 4805 4807 4806 $postType = UniteFunctionsUC::getVal($value, $name."_posttype","post"); 4808 4807 $taxonomy = UniteFunctionsUC::getVal($value, $name."_taxonomy","category"); … … 4821 4820 $showDebug = UniteFunctionsUC::strToBool($showDebug); 4822 4821 4823 4824 4822 $queryDebugType = ""; 4825 4823 if($showDebug == true) … … 5354 5352 */ 5355 5353 public function getWPUsersData($value, $name, $processType, $param){ 5356 5354 5357 5355 $showDebug = UniteFunctionsUC::getVal($value, $name."_show_query_debug"); 5358 5356 $showDebug = UniteFunctionsUC::strToBool($showDebug); 5359 5357 5358 $queryDebugType = ""; 5359 5360 if(GlobalsUC::$showQueryDebugByUrl == true){ 5361 $showDebug = true; 5362 $queryDebugType = "show_query"; 5363 } 5364 5360 5365 $selectType = UniteFunctionsUC::getVal($value, $name."_type"); 5361 5366 … … 5371 5376 5372 5377 }else{ 5373 5378 5379 if($showDebug == true){ 5380 dmp("users query values array"); 5381 dmp($value); 5382 } 5383 5374 5384 //create the args 5375 5385 $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)) { 5378 5390 $arrRoles = $strRoles; 5379 else 5391 } else { 5392 $strRoles = trim($strRoles); 5380 5393 $arrRoles = explode(",", $strRoles); 5394 } 5381 5395 5382 5396 $arrRoles = UniteFunctionsUC::arrayToAssoc($arrRoles); 5383 5397 unset($arrRoles["__all__"]); 5384 5398 5385 5399 if(!empty($arrRoles)){ 5386 5400 $arrRoles = array_values($arrRoles); 5387 5401 5388 5402 $args["role__in"] = $arrRoles; 5389 5403 } … … 5444 5458 5445 5459 if($showDebug == true){ 5460 echo "<div class='uc-div-ajax-debug'>"; 5446 5461 dmp("The users query is:"); 5447 5462 dmp($args); … … 5450 5465 HelperUC::addDebug("Get Users Args", $args); 5451 5466 5452 $arrUsers = get_users($args); 5467 $user_query = new WP_User_Query($args); 5468 $arrUsers = $user_query->get_results(); 5453 5469 5454 5470 HelperUC::addDebug("Num Users fetched: ".count($arrUsers)); 5455 5471 5456 5472 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>"; 5459 5499 5460 5500 … … 5600 5640 */ 5601 5641 private function modifyData_postFilterOptions($data, $filterType){ 5602 5642 5603 5643 $objFilters = new UniteCreatorFiltersProcess(); 5604 5644 … … 5613 5653 */ 5614 5654 protected function modifyDataBySpecialAddonBehaviour($data){ 5615 5655 5616 5656 $special = $this->addon->getOption("special"); 5617 5657 $specialData = $this->addon->getOption("special_data"); -
unlimited-elements-for-elementor/trunk/readme.txt
r3432094 r3442278 940 940 941 941 == Changelog == 942 943 944 = 2.0.4 - 2026-01-19 = 945 946 Plugin Changes: 947 948 * Feature - made functionality of load more before the grid 949 * Feature - added authors filter functionality to post filters. 950 951 Widgets 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 942 970 943 971 = 2.0.3 - 2026-01-04 = -
unlimited-elements-for-elementor/trunk/release_log.txt
r3432094 r3442278 1 1 2 3 version 2.0.4: 4 5 * Feautre - made functionality of load more before the grid 6 * Feature - added authors filter functionality to post filters. 2 7 3 8
Note: See TracChangeset
for help on using the changeset viewer.