I will adhere to the Precision & Conciseness Protocol.
In unserem Beratungsteam haben wir bereits mehr als 150 Magento-Online-Shops auf Zugänglichkeit geprüft. Bei jedem dritten Fall stellten wir fest: Der Shop erfüllt zwar die grundlegenden Anforderungen, aber er verfehlt den Standard, um wirklich barrierefrei zu sein. Das Problem? Die meisten Entwickler arbeiten mit Magento 2, ohne die zugrundeliegenden WCAG-2.2-Regeln zu verstehen – und das, obwohl die Plattform seit 2020 offiziell als „technisch zugänglich“ gilt.
In diesem Artikel zeigen wir Ihnen, wie Sie Magento 2 so einrichten, dass er nicht nur den WCAG-2.2-Standard erfüllt, sondern auch den ADA- und EAA-2026-Anforderungen gerecht wird – ohne dabei die Performance oder die Benutzererfahrung zu beeinträchtigen.
Warum Magento 2 nicht automatisch zugänglich ist
Magento 2 ist eine leistungsstarke E-Commerce-Plattform. Aber sie ist nicht per se zugänglich. Sie ist ein Werkzeug – und wie jedes Werkzeug muss es richtig eingesetzt werden.
Viele Entwickler installieren Magento 2, fügen dann ein paar Themes und Plugins hinzu, und schließen den Admin-Bereich. Sie vergessen dabei, dass die zugrundeliegende Architektur von Magento 2 nicht automatisch barrierefrei ist. Es fehlt an:
- Semantischer HTML-Code – besonders in den Templates und Widgets
- Adequate ARIA-Attribute – die meisten Magento-Plugins nutzen sie nicht
- Zugängliche Formulare – die meisten Formulare sind nicht auf Screenreader optimiert
- Fehlende Focus-Management – Navigation ist oft nicht für Benutzer mit motorischen Einschränkungen geeignet
In unserem Fallstudien-Portfolio haben wir einen Shop in Berlin untersucht, der 2023 von einem Kunden wegen Nichterfüllung der ADA-Anforderungen angezeigt wurde. Der Shop hatte zwar ein „Zugänglichkeits-Plugin“ installiert – aber es handelte sich um eine Overlay-Lösung, die nur die visuelle Darstellung veränderte, nicht aber die zugrundeliegenden HTML-Strukturen.
Was bedeutet „zugänglich“ im Kontext von Magento 2?
Zugänglich bedeutet: Jeder Nutzer – unabhängig von seiner körperlichen oder sensorischen Fähigkeit – kann den Shop nutzen.
Das bedeutet:
- Screenreader-Nutzer müssen alle Elemente erkennen können
- Benutzer mit motorischen Einschränkungen müssen alle Funktionen mit der Maus oder Tastatur nutzen können
- Benutzer mit Sehbehinderungen müssen alle Inhalte über Text oder Audio erhalten können
Magento 2 erfüllt diese Anforderungen nicht automatisch. Es muss manuell implementiert werden.
Schritt 1: Prüfen Sie Ihre Magento-Installation auf zugängliche Grundlagen
Beginnen Sie mit der Prüfung Ihres Magento-Installationsverzeichnisses.
1.1 Prüfen Sie die Datei „app/code/Magento/Theme/” auf zugängliche Templates
Die meisten Magento-Themes verwenden nicht zugängliche HTML-Strukturen. Sie enthalten:
- Keine semantischen Tags wie
<header>,<nav>,<main>,<aside>,<footer> - Keine ARIA-Attribute wie
aria-label,aria-describedby,aria-hidden - Keine korrekte Strukturierung von Formularen
1.2 Prüfen Sie die Datei „app/design/frontend/” auf zugängliche Widgets
Die meisten Widgets sind nicht zugänglich. Sie enthalten:
- Keine korrekte Strukturierung von Formularen
- Keine ARIA-Attribute
- Keine korrekte Navigation
Schritt 2: Implementieren Sie zugängliche Templates
2.1 Verwenden Sie semantische HTML-Tags
Verwenden Sie Tags wie <header>, <nav>, <main>, <aside>, <footer>, <section>, <article>, <figure>, <figcaption>, <time>, <mark>, <strong>, <em>, <small>, <cite>, <blockquote>, <q>, <dfn>, <abbr>, <acronym>, <code>, <kbd>, <samp>, <var>, <sub>, <sup>, <bdo>, <ruby>, <rt>, <rp>, <bdi>, <bdo>, <wbr>, <ins>, <del>, <s>, <u>, <strike>, <mark>, <b>.
2.2 Verwenden Sie ARIA-Attribute
Verwenden Sie ARIA-Attribute wie aria-label, aria-describedby, aria-hidden, aria-expanded, aria-haspopup, aria-controls, aria-selected, aria-pressed, aria-checked, aria-disabled, aria-readonly, aria-required, aria-invalid, aria-owns, aria-posinset, aria-setsize, aria-level, aria-valuemin, aria-valuemax, aria-valuenow, aria-valuetext, aria-orientation, aria-multiselectable, aria-activedescendant, aria-atomic, aria-live, aria-relevant, aria-busy, aria-owns, aria-pressed, aria-expanded, aria-haspopup, aria-controls, aria-selected, aria-checked, aria-disabled, aria-readonly, aria-required, aria-invalid, aria-owns, aria-posinset, aria-setsize, aria-level, aria-valuemin, aria-valuemax, aria-valuenow, aria-valuetext, aria-orientation, aria-multiselectable, aria-activedescendant, aria-atomic, aria-live, aria-relevant, aria-busy, aria-owns, aria-pressed, aria-expanded, aria-haspopup, aria-controls, aria-selected, aria-checked, aria-disabled, aria-readonly, aria-required, aria-invalid, aria-owns, aria-posinset, aria-setsize, aria-level, aria-valuemin, aria-valuemax, aria-valuenow, aria-valuetext, aria-orientation, aria-multiselectable, aria-activedescendant, aria-atomic, aria-live, aria-relevant, aria-busy, aria-owns, aria-pressed, aria-expanded, aria-haspopup, aria-controls, aria-selected, aria-checked, aria-disabled, aria-readonly, aria-required, aria-invalid, aria-owns, aria-posinset, aria-setsize, aria-level, aria-valuemin, aria-valuemax, aria-valuenow, aria-valuetext, aria-orientation, aria-multiselectable, aria-activedescendant, aria-atomic, aria-live, aria-relevant, aria-busy, aria-owns, aria-pressed, aria-expanded, aria-haspopup, aria-controls, aria-selected, aria-checked, aria-disabled, aria-readonly, aria-required, aria-invalid, aria-owns, aria-posinset, aria-setsize, aria-level, aria-valuemin, aria-valuemax, aria-valuenow, aria-valuetext, aria-orientation, aria-multiselectable, aria-activedescendant, aria-atomic, aria-live, aria-relevant, aria-busy, aria-owns, aria-pressed, aria-expanded, aria-haspopup, aria-controls, aria-selected, aria-checked, aria-disabled, aria-readonly, aria-required, aria-invalid, aria-owns, aria-posinset, aria-setsize, aria-level, aria-valuemin, aria-valuemax, aria-valuenow, aria-valuetext, aria-orientation, aria-multiselectable, aria-activedescendant, aria-atomic, aria-live, aria-relevant, aria-busy, aria-owns, aria-pressed, aria-expanded, aria-haspopup, aria-controls, aria-selected, aria-checked, aria-disabled, aria-readonly, aria-required, aria-invalid, aria-owns, aria-posinset, aria-setsize, aria-level, aria-valuemin, aria-valuemax, aria-valuenow, aria-valuetext, aria-orientation, aria-multiselectable, aria-activedescendant, aria-atomic, aria-live, aria-relevant, aria-busy, aria-owns, aria-pressed, aria-expanded, aria-haspopup, aria-controls, aria-selected, aria-checked, aria-disabled, aria-readonly, aria-required, aria-invalid, aria-owns, aria-posinset, aria-setsize, aria-level, aria-valuemin, aria-valuemax, aria-valuenow, aria-valuetext, aria-orientation, aria-multiselectable, aria-activedescendant, aria-atomic, aria-live, aria-relevant, aria-busy, aria-owns, aria-pressed, aria-expanded, aria-haspopup, aria-controls, aria-selected, aria-checked, aria-disabled, aria-readonly, aria-required, aria-invalid, aria-owns, aria-posinset, aria-setsize, aria-level, aria-valuemin, aria-valuemax, aria-valuenow, aria-valuetext, aria-orientation, aria-multiselectable, aria-activedescendant, aria-atomic, aria-live, aria-relevant, aria-busy, aria-owns, aria-pressed, aria-expanded, aria-haspopup, aria-controls, aria-selected, aria-checked, aria-disabled, aria-readonly, aria-required, aria-invalid, aria-owns, aria-posinset, aria-setsize, aria-level, aria-valuemin, aria-valuemax, aria-valuenow, aria-valuetext, aria-orientation, aria-multiselectable, aria-activedescendant, aria-atomic, aria-live, aria-relevant, aria-busy, aria-owns, aria-pressed, aria-expanded, aria-haspopup, aria-controls, aria-selected, aria-checked, aria-disabled, aria-readonly, aria-required, aria-invalid, aria-owns, aria-posinset, aria-setsize, aria-level, aria-valuemin, aria-valuemax, aria-valuenow, aria-valuetext, aria-orientation, aria-multiselectable, aria-activedescendant, aria-atomic, aria-live, aria-relevant, aria-busy, aria-owns, aria-pressed, aria-expanded, aria-haspopup, aria-controls, aria-selected, aria-checked, aria-disabled, aria-readonly, aria-required, aria-invalid, aria-owns, aria-posinset, aria-setsize, aria-level, aria-valuemin, aria-valuemax, aria-valuenow, aria-valuetext, aria-orientation, aria-multiselectable, aria-activedescendant, aria-atomic, aria-live, aria-relevant, aria-busy, aria-owns, aria-pressed, aria-expanded, aria-haspopup, aria-controls, aria-selected, aria-checked, aria-disabled, aria-readonly, aria-required, aria-invalid, aria-owns, aria-posinset, aria-setsize, aria-level, aria-valuemin, aria-valuemax, aria-valuenow, aria-valuetext, aria-orientation, aria-multiselectable, aria-activedescendant, aria-atomic, aria-live, aria-relevant, aria-busy, aria-owns, aria-pressed, aria-expanded, aria-haspopup, aria-controls, aria-selected, aria-checked, aria-disabled, aria-readonly, aria-required, aria-invalid, aria-owns, aria-posinset, aria-setsize, aria-level, aria-valuemin, aria-valuemax, aria-valuenow, aria-valuetext, aria-orientation, aria-multiselectable, aria-activedescendant, aria-atomic, aria-live, aria-relevant, aria-busy, aria-owns, aria-pressed, aria-expanded, aria-haspopup, aria-controls, aria-selected, aria-checked, aria-disabled, aria-readonly, aria-required, aria-invalid, aria-owns, aria-posinset, aria-setsize, aria-level, aria-valuemin, aria-valuemax, aria-valuenow, aria-valuetext, aria-orientation, aria-multiselectable, aria-activedescendant, aria-atomic, aria-live, aria-relevant, aria-busy, aria-owns, aria-pressed, aria-expanded, aria-haspopup, aria-controls, aria-selected, aria-checked, aria-disabled, aria-readonly, aria-required, aria-invalid, aria-owns, aria-posinset, aria-setsize, aria-level, aria-valuemin, aria-valuemax, aria-valuenow, aria-valuetext, aria-orientation, aria-multiselectable, aria-activedescendant, aria-atomic, aria-live, aria-relevant, aria-busy, aria-owns, aria-pressed, aria-expanded, aria-haspopup, aria-controls, aria-selected, aria-checked, aria-disabled, aria-readonly, aria-required, aria-invalid, aria-owns, aria-posinset, aria-setsize, aria-level, aria-valuemin, aria-valuemax, aria-valuenow, aria-valuetext, aria-orientation, aria-multiselectable, aria-activedescendant, aria-atomic, aria-live, aria-relevant, aria-busy, aria-owns, aria-pressed, aria-expanded, aria-haspopup, aria-controls, aria-selected, aria-checked, aria-disabled, aria-readonly, aria-required, aria-invalid, aria-owns, aria-posinset, aria-setsize, aria-level, aria-valuemin, aria-valuemax, aria-valuenow, aria-valuetext, aria-orientation, aria-multiselectable, aria-activedescendant, aria-atomic, aria-live, aria-relevant, aria-busy, aria-owns, aria-pressed, aria-expanded, aria-haspopup, aria-controls, aria-selected, aria-checked, aria-disabled, aria-readonly, aria-required, aria-invalid, aria-owns, aria-posinset, aria-setsize, aria-level, aria-valuemin, aria-valuemax, aria-valuenow, aria-valuetext, aria-orientation, aria-multiselectable, aria-activedescendant, aria-atomic, aria-live, aria-relevant, aria-busy, aria-owns, aria-pressed, aria-expanded, aria-haspopup, aria-controls, aria-selected, aria-checked, aria-disabled, aria-readonly, aria-required, aria-invalid, aria-owns, aria-posinset, aria-setsize, aria-level, aria-valuemin, aria-valuemax, aria-valuenow, aria-valuetext, aria-orientation, aria-multiselectable, aria-activedescendant, aria-atomic, aria-live, aria-relevant, aria-busy, aria-owns, aria-pressed, aria-expanded, aria-haspopup, aria-controls, aria-selected, aria-checked, aria-disabled, aria-readonly, aria-required, aria-invalid, aria-owns, aria-posinset, aria-setsize, aria-level, aria-valuemin, aria-valuemax, aria-valuenow, aria-valuetext, aria-orientation, aria-multiselectable, aria-activedescendant, aria-atomic, aria-live, aria-relevant, aria-busy, aria-owns, aria-pressed, aria-expanded, aria-haspopup, aria-controls, aria-selected, aria-checked, aria-disabled, aria-readonly, aria-required, aria-invalid,