[Accessibility] Incorrect aria role in the loop grid list
Author: gruocco-anastasisCreated Sep 22, 2026Updated Sep 22, 2026
Labelsstatus/awaiting_triage
Description
When you use the "loop grid" widget, the div with the class "elementor-grid" has role="list" but the children don't have the role "listitem".
Steps to reproduce
You can see an example here: https://exampledev.anastasis.it/loop-grid-example/
Expected behavior
As indicated here: https://dequeuniversity.com/rules/axe/4.10/aria-required-children?application=axeAPI and here: https://developer.mozilla.org/en-US/docs/Web/Accessibility/ARIA/Reference/Roles/list_role, a list can only contain zero or more listitem children.
Elementor System Info
== Server Environment ==
Operating System: Linux
Software: Apache/2.4.62 (Debian)
MySQL version: MySQL Community Server - GPL v8.0.44
PHP Version: 8.2.29
PHP Memory Limit: 128M
PHP Max Input Vars: 1000
PHP Max Post Size: 8M
GD Installed: Yes
ZIP Installed: Yes
Write Permissions: All right
Elementor Library: Connected
== WordPress Environment ==
Version: 7.1.1
Site URL: https://exampledev.anastasis.it
Home URL: https://exampledev.anastasis.it
WP Multisite: No
Max Upload Size: 2 MB
Memory limit: 40M
Max Memory limit: 256M
Permalink Structure: /%year%/%monthnum%/%day%/%postname%/
Language: it_IT
Timezone: Europe/Rome
Admin Email: [email protected]
Debug Mode: Inactive
== Theme ==
Name: Hello Elementor
Version: 3.4.7
Author: Elementor Team
Child Theme: No
== User ==
Role: administrator
WP Profile lang: it-IT
User Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:156.0) Gecko/20100101 Firefox/156.0
== Active Plugins ==
Elementor
Version: 4.2.3
Author: Elementor.com
Elementor Pro
Version: 4.2.2
Author: Elementor.com
Nexi XPay
Version: 8.3.3
Author: Nexi SpA
Temporary Login
Version: 1.3.0
Author: Elementor.com
WooCommerce
Version: 10.7.0
Author: Automattic
WooCommerce PayPal Payments
Version: 4.0.2
Author: PayPal
== Utilizzo degli elementi ==
footer : 1
container : 1
image : 1
text-editor : 1
header : 1
button : 1
container : 4
nav-menu : 1
theme-site-logo : 1
woocommerce-menu-cart : 1
page : 1
container : 1
wp-page : 6
container : 10
heading : 2
image : 1
loop-grid : 1
shortcode : 1
text-editor : 3
woocommerce-cart : 1
woocommerce-checkout-page : 1
single-page : 1
container : 1
theme-post-content : 1
loop-item : 1
button : 1
container : 1
theme-post-excerpt : 1
theme-post-featured-image : 1
theme-post-title : 1
== Impostazioni ==
cpt_support: post, page
allow_tracking: yes
editor_break_lines: 1
unfiltered_files_upload: 1
font_display: swap
== Features ==
Custom Fonts: 0
Custom Icons: 0
== Integrations ==
woocommerce: Active
== Esperimenti Elementor ==
Icone dei font in linea: Attivo per impostazione predefinita
Punti di interruzione aggiuntivi: Attivo per impostazione predefinita
Contenitore: Attivo per impostazione predefinita
Markup ottimizzato: Inattivo per impostazione predefinita
Promozioni nel pannello: Attivo per impostazione predefinita
Default to New Theme Builder: Attivo per impostazione predefinita
Header e Footer: Attivo per impostazione predefinita
API delle funzionalità di Elementor MCP per WordPress: Inattivo per impostazione predefinita
Popup della prova gratuita della versione Pro: Inattivo per impostazione predefinita
Elementi annidati: Attivo per impostazione predefinita
Pannello pagine: Inattivo per impostazione predefinita
Widget atomici: Inattivo per impostazione predefinita
Classi globali: Inattivo per impostazione predefinita
Applica le capacità delle classi globali: Attivo per impostazione predefinita
Variabili: Attivo per impostazione predefinita
Editor v4 (pagina Opt In): Attivo per impostazione predefinita
Editor V4: Inattivo per impostazione predefinita
Componenti: Attivo per impostazione predefinita
Interazioni: Attivo per impostazione predefinita
Creazione di widget: Attivo per impostazione predefinita
Genera il markdown del sito web: Inattivo per impostazione predefinita
Gestione dinamica degli asset: Inattivo per impostazione predefinita
Personalizza la funzione di importazione/esportazione: Attivo per impostazione predefinita
Site Builder: Inattivo per impostazione predefinita
Eventi dell'editor di Elementor: Inattivo per impostazione predefinita
Atomic Form: Attivo per impostazione predefinita
Loop: Attivo per impostazione predefinita
Menu: Inattivo per impostazione predefinita
Size Variables: Attivo per impostazione predefinita
Pro Interactions: Attivo per impostazione predefinita
Feedback nell'editor: Inattivo per impostazione predefinita
== Registro ==
JS: showing 8 of 8JS: 2025-10-16 13:02:48 [error X 2][https://wordpress.anastasis.it/wp-includes/js/jquery/jquery.min.js?ver=3.7.1:2:28760] Cannot read properties of undefined (reading 'tools')
JS: 2026-04-15 07:19:31 [error X 1][https://wordpress.anastasis.it/wp-admin/load-scripts.php?c=0&loadchunk_0=wp-hooks,jquery-core,jquery-migrate,utils,moxiejs,plupload&ver=6.9.4:4:28760] Cannot read properties of undefined (reading 'value')
JS: 2026-04-15 09:01:50 [error X 3][https://wordpress.anastasis.it/wp-content/plugins/elementor/assets/js/editor.min.js?ver=4.0.2:2:246283] this.ui.input.val is not a function
JS: 2026-05-14 07:18:09 [error X 2][https://wordpress.anastasis.it/wp-content/plugins/elementor/assets/js/admin.min.js?ver=4.0.2:2:42303] r.startsWith is not a function
JS: 2026-05-14 07:39:46 [error X 615][https://wordpress.anastasis.it/wp-content/plugins/elementor/assets/lib/pickr/pickr.min.js?ver=1.8.2:2:14799] Cannot read properties of null (reading 'clone')
JS: 2026-05-14 07:39:47 [error X 11][https://wordpress.anastasis.it/wp-content/plugins/elementor/assets/lib/pickr/pickr.min.js?ver=1.8.2:2:19552] Cannot read properties of null (reading 'changestop')
JS: 2026-05-14 07:41:23 [error X 1][https://wordpress.anastasis.it/wp-content/plugins/elementor/assets/js/editor.min.js?ver=4.0.2:2:1282432] Cannot read properties of null (reading 'id')
JS: 2026-08-25 13:49:32 [error X 1][https://wordpress.anastasis.it/wp-content/plugins/elementor/assets/js/editor.min.js?ver=4.0.2:2:1062843] can't access property "toLowerCase", T.originalEvent.key is undefined
PHP: showing 13 of 13PHP: 2025-10-16 16:29:32 [notice X 49][/var/www/html/wp-content/plugins/elementor-pro/license/notices/trial-period-notice.php::37] strtotime(): Passing null to parameter #1 ($datetime) of type string is deprecated [array (
'trace' => '
#0: Elementor\Core\Logger\Manager -> shutdown()
',
)]
PHP: 2025-10-16 17:11:07 [warning X 1][/var/www/html/wp-content/plugins/elementor-pro/license/notices/trial-period-notice.php::37] Undefined array key "expires" [array (
'trace' => '
#0: /var/www/html/wp-content/plugins/elementor-pro/license/notices/trial-period-notice.php(37): Elementor\Core\Logger\Manager -> rest_error_handler()
#1: /var/www/html/wp-content/plugins/elementor/core/admin/admin-notices.php(694): ElementorPro\License\Notices\Trial_Period_Notice -> get_config()
#2: /var/www/html/wp-includes/class-wp-hook.php(324): Elementor\Core\Admin\Admin_Notices -> admin_notices()
#3: /var/www/html/wp-includes/class-wp-hook.php(348): WP_Hook -> apply_filters()
#4: /var/www/html/wp-includes/plugin.php(517): WP_Hook -> do_action()
',
)]
PHP: 2025-10-16 17:11:07 [notice X 1][/var/www/html/wp-content/plugins/elementor-pro/license/notices/trial-period-notice.php::37] strtotime(): Passing null to parameter #1 ($datetime) of type string is deprecated [array (
'trace' => '
#0: Elementor\Core\Logger\Manager -> rest_error_handler()
#1: /var/www/html/wp-content/plugins/elementor-pro/license/notices/trial-period-notice.php(37): class type strtotime()
#2: /var/www/html/wp-content/plugins/elementor/core/admin/admin-notices.php(694): ElementorPro\License\Notices\Trial_Period_Notice -> get_config()
#3: /var/www/html/wp-includes/class-wp-hook.php(324): Elementor\Core\Admin\Admin_Notices -> admin_notices()
#4: /var/www/html/wp-includes/class-wp-hook.php(348): WP_Hook -> apply_filters()
',
)]
PHP: 2026-04-15 09:11:09 [warning X 3][/var/www/html/wp-content/plugins/elementor-pro/license/notices/trial-period-notice.php::37] Undefined array key "expires" [array (
'trace' => '
#0: /var/www/html/wp-content/plugins/elementor-pro/license/notices/trial-period-notice.php(37): Elementor\Core\Logger\Manager -> rest_error_handler()
#1: /var/www/html/wp-content/plugins/elementor/core/admin/admin-notices.php(694): ElementorPro\License\Notices\Trial_Period_Notice -> get_config()
#2: /var/www/html/wp-includes/class-wp-hook.php(341): Elementor\Core\Admin\Admin_Notices -> admin_notices()
#3: /var/www/html/wp-includes/class-wp-hook.php(365): WP_Hook -> apply_filters()
#4: /var/www/html/wp-includes/plugin.php(522): WP_Hook -> do_action()
',
)]
PHP: 2026-04-15 09:11:09 [notice X 3][/var/www/html/wp-content/plugins/elementor-pro/license/notices/trial-period-notice.php::37] strtotime(): Passing null to parameter #1 ($datetime) of type string is deprecated [array (
'trace' => '
#0: Elementor\Core\Logger\Manager -> rest_error_handler()
#1: /var/www/html/wp-content/plugins/elementor-pro/license/notices/trial-period-notice.php(37): class type strtotime()
#2: /var/www/html/wp-content/plugins/elementor/core/admin/admin-notices.php(694): ElementorPro\License\Notices\Trial_Period_Notice -> get_config()
#3: /var/www/html/wp-includes/class-wp-hook.php(341): Elementor\Core\Admin\Admin_Notices -> admin_notices()
#4: /var/www/html/wp-includes/class-wp-hook.php(365): WP_Hook -> apply_filters()
',
)]
PHP: 2026-04-15 09:34:41 [error X 2][/var/www/html/wp-content/plugins/elementor/modules/ai/module.php::351] Uncaught Error: Call to a member function get_gallery_image_ids() on bool in /var/www/html/wp-content/plugins/elementor/modules/ai/module.php:351
Stack trace:
#0 /var/www/html/wp-includes/class-wp-hook.php(341): Elementor\Modules\Ai\Module->get_product_images_ajax('')
#1 /var/www/html/wp-includes/class-wp-hook.php(365): WP_Hook->apply_filters('', Array)
#2 /var/www/html/wp-includes/plugin.php(522): WP_Hook->do_action(Array)
#3 /var/www/html/wp-admin/admin-ajax.php(192): do_action('wp_ajax_element...')
#4 {main}
thrown [array (
'trace' => '
#0: Elementor\Core\Logger\Manager -> shutdown()
',
)]
PHP: 2026-04-28 17:56:33 [warning X 4][/var/www/html/wp-content/plugins/elementor-pro/license/notices/trial-period-notice.php::37] Undefined array key "expires" [array (
'trace' => '
#0: /var/www/html/wp-content/plugins/elementor-pro/license/notices/trial-period-notice.php(37): Elementor\Core\Logger\Manager -> rest_error_handler()
#1: /var/www/html/wp-content/plugins/elementor/core/admin/admin-notices.php(1079): ElementorPro\License\Notices\Trial_Period_Notice -> get_config()
#2: /var/www/html/wp-includes/class-wp-hook.php(341): Elementor\Core\Admin\Admin_Notices -> admin_notices()
#3: /var/www/html/wp-includes/class-wp-hook.php(365): WP_Hook -> apply_filters()
#4: /var/www/html/wp-includes/plugin.php(522): WP_Hook -> do_action()
',
)]
PHP: 2026-04-28 17:56:33 [notice X 4][/var/www/html/wp-content/plugins/elementor-pro/license/notices/trial-period-notice.php::37] strtotime(): Passing null to parameter #1 ($datetime) of type string is deprecated [array (
'trace' => '
#0: Elementor\Core\Logger\Manager -> rest_error_handler()
#1: /var/www/html/wp-content/plugins/elementor-pro/license/notices/trial-period-notice.php(37): class type strtotime()
#2: /var/www/html/wp-content/plugins/elementor/core/admin/admin-notices.php(1079): ElementorPro\License\Notices\Trial_Period_Notice -> get_config()
#3: /var/www/html/wp-includes/class-wp-hook.php(341): Elementor\Core\Admin\Admin_Notices -> admin_notices()
#4: /var/www/html/wp-includes/class-wp-hook.php(365): WP_Hook -> apply_filters()
',
)]
PHP: 2026-05-14 09:19:10 [warning X 1][/var/www/html/wp-content/plugins/elementor/includes/managers/image.php::113] Trying to access array offset on value of type bool [array (
'trace' => '
#0: Elementor\Core\Logger\Manager -> shutdown()
',
)]
PHP: 2026-05-14 09:40:27 [warning X 1][/var/www/html/wp-content/plugins/elementor/core/logger/items/js.php::17] Undefined array key "url" [array (
'trace' => '
#0: Elementor\Core\Logger\Manager -> shutdown()
',
)]
PHP: 2026-05-14 09:41:23 [warning X 3][/var/www/html/wp-content/plugins/elementor/modules/history/revisions-manager.php::363] Undefined array key "editor_post_id" [array (
'trace' => '
#0: Elementor\Core\Logger\Manager -> shutdown()
',
)]
PHP: 2026-08-25 15:25:53 [warning X 10][/var/www/html/wp-content/plugins/elementor-pro/license/notices/trial-period-notice.php::37] Undefined array key "expires" [array (
'trace' => '
#0: /var/www/html/wp-content/plugins/elementor-pro/license/notices/trial-period-notice.php(37): Elementor\Core\Logger\Manager -> rest_error_handler()
#1: /var/www/html/wp-content/plugins/elementor/core/admin/admin-notices.php(1079): ElementorPro\License\Notices\Trial_Period_Notice -> get_config()
#2: /var/www/html/wp-includes/class-wp-hook.php(353): Elementor\Core\Admin\Admin_Notices -> admin_notices()
#3: /var/www/html/wp-includes/class-wp-hook.php(377): WP_Hook -> apply_filters()
#4: /var/www/html/wp-includes/plugin.php(523): WP_Hook -> do_action()
',
)]
PHP: 2026-08-25 15:25:53 [notice X 10][/var/www/html/wp-content/plugins/elementor-pro/license/notices/trial-period-notice.php::37] strtotime(): Passing null to parameter #1 ($datetime) of type string is deprecated [array (
'trace' => '
#0: Elementor\Core\Logger\Manager -> rest_error_handler()
#1: /var/www/html/wp-content/plugins/elementor-pro/license/notices/trial-period-notice.php(37): class type strtotime()
#2: /var/www/html/wp-content/plugins/elementor/core/admin/admin-notices.php(1079): ElementorPro\License\Notices\Trial_Period_Notice -> get_config()
#3: /var/www/html/wp-includes/class-wp-hook.php(353): Elementor\Core\Admin\Admin_Notices -> admin_notices()
#4: /var/www/html/wp-includes/class-wp-hook.php(377): WP_Hook -> apply_filters()
',
)]
Log: showing 17 of 172026-04-15 09:32:37 [info] Elementor data updater process has been queued. [array (
'plugin' => 'Elementor',
'from' => '3.29.0',
'to' => '4.0.2',
)]
2026-04-15 09:32:38 [info] elementor::elementor_updater Started
2026-04-15 09:32:38 [info] Elementor/Upgrades - _on_each_version Start
2026-04-15 09:32:38 [info] Elementor/Upgrades - _on_each_version Finished
2026-04-15 09:32:38 [info] Elementor data updater process has been completed. [array (
'plugin' => 'Elementor',
'from' => '3.29.0',
'to' => '4.0.2',
)]
2026-08-31 14:59:38 [info] Elementor data updater process has been queued. [array (
'plugin' => 'Elementor',
'from' => '4.0.2',
'to' => '4.2.3',
)]
2026-08-31 14:59:39 [info] elementor::elementor_updater Started
2026-08-31 14:59:39 [info] Elementor/Upgrades - _on_each_version Start
2026-08-31 14:59:39 [info] Elementor/Upgrades - _on_each_version Finished
2026-08-31 14:59:39 [info] Elementor data updater process has been completed. [array (
'plugin' => 'Elementor',
'from' => '4.0.2',
'to' => '4.2.3',
)]
2026-08-31 15:21:42 [info] Elementor data updater process has been queued. [array (
'plugin' => 'Elementor Pro',
'from' => '3.29.0',
'to' => '4.2.2',
)]
2026-08-31 15:21:43 [info] elementor-pro::elementor_pro_updater Started
2026-08-31 15:21:43 [info] Elementor Pro/Upgrades - _on_each_version Start
2026-08-31 15:21:43 [info] Elementor Pro/Upgrades - _on_each_version Finished
2026-08-31 15:21:43 [info] Elementor Pro/Upgrades - _v_3_30_0_post_navigation_inline_icons Start
2026-08-31 15:21:43 [info] Elementor Pro/Upgrades - _v_3_30_0_post_navigation_inline_icons Finished
2026-08-31 15:21:43 [info] Elementor data updater process has been completed. [array (
'plugin' => 'Elementor Pro',
'from' => '3.29.0',
'to' => '4.2.2',
)]
== Elementor - Compatibility Tag ==
Elementor Pro: Compatibilità non specificata
== Elementor Pro - Compatibility Tag ==Agreement
- I confirm I have read and followed all the guidelines and instructions outlined in the Elementor Bug Report form.
- I agree that my issue may be closed without further action if it doesn't meet all the requirements outlined in the Elementor Bug Report form.
Source: elementor/elementor