دسترس‌پذیری در بلاک‌های وردپرس طبق WCAG (Web Content Accessibility Guidelines) یک الزام مهندسی است که تضمین می‌کند تمام کاربران، از جمله افراد دارای معلولیت، بتوانند با محتوا تعامل کنند. WCAG چهار اصل POUR را تعریف می‌کند: قابل ادراک بودن (Perceivable)، قابل کار کردن بودن (Operable)، قابل فهم بودن (Understandable)، و استوار بودن (Robust). هر بلاک سفارشی گوتنبرگ باید این اصول را در ویرایشگر و فرانت‌اند رعایت کند. رعایت نکردن این اصول نه فقط یک نقص اخلاقی، بلکه یک ریسک قانونی و تجاری است. این مقاله چارچوب عملی پیاده‌سازی WCAG در بلاک‌های وردپرس را از سطح کد تا تست ارائه می‌کند.

در یک پروژه دولتی، یک بلاک سفارشی نمایش جدول داده را تحویل دادم. همه‌چیز درست کار می‌کرد: داده‌ها نمایش داده می‌شدند، فیلترها عمل می‌کردند، و طراحی بی‌نقص به نظر می‌رسید. اما ممیز دسترس‌پذیری آن را رد کرد. دلیل: جدول هیچ عنصر <th> نداشت و صفحه‌خوان نمی‌توانست رابطه بین سرستون و داده را تشخیص دهد. آن تجربه نشان داد که دسترس‌پذیری نه یک ویژگی اضافی، بلکه بخشی از صحت فنی است.

WCAG چیست و چرا برای بلاک‌های وردپرس حیاتی است؟

WCAG (Web Content Accessibility Guidelines) مجموعه‌ای از دستورالعمل‌های بین‌المللی است که توسط W3C (World Wide Web Consortium) منتشر می‌شود و استاندارد جهانی برای دسترس‌پذیری محتوای وب را تعریف می‌کند. این دستورالعمل‌ها در سه سطح A، AA و AAA تنظیم شده‌اند و هر سطح، معیارهای سخت‌گیرانه‌تری نسبت به سطح قبل دارد. اگر با مفاهیم پایه WCAG و کاربرد آن آشنا باشید، می‌دانید که رعایت سطح AA برای اکثر پروژه‌های حرفه‌ای یک الزام است.

اهمیت WCAG برای بلاک‌های وردپرس از چند جهت قابل بررسی است. اول، دامنه کاربران: طبق آمار سازمان بهداشت جهانی، بیش از یک میلیارد نفر در جهان با نوعی معلولیت زندگی می‌کنند. این یعنی حدود ۱۵٪ از کاربران بالقوه هر وب‌سایت، ممکن است به فناوری‌های کمکی (Assistive Technologies) مثل صفحه‌خوان، بزرگ‌نما، یا کیبورد جایگزین وابسته باشند. اگر بلاک شما با این فناوری‌ها کار نکند، بخش قابل توجهی از مخاطبان را از دست می‌دهید.

دوم، الزامات قانونی: در بسیاری از کشورها، از جمله ایالات متحده (ADA)، اتحادیه اروپا (EAA) و کانادا (AODA)، دسترس‌پذیری وب‌سایت‌های عمومی و تجاری یک الزام قانونی است. عدم رعایت این الزامات می‌تواند به شکایت‌های حقوقی و جریمه‌های سنگین منجر شود. اگر بلاک شما در یک سایت تجاری استفاده شود و دسترس‌پذیر نباشد، مسئولیت قانونی متوجه صاحب سایت و توسعه‌دهنده بلاک است.

سوم، بهبود SEO: بسیاری از معیارهای WCAG با معیارهای SEO همپوشانی دارند. HTML سمنتیک، متن جانشین برای تصاویر، ساختار Heading صحیح، و سرعت بارگذاری — همه این‌ها هم برای دسترس‌پذیری و هم برای موتورهای جستجو حیاتی هستند. اگر با استانداردهای دسترس‌پذیری وب آشنا شده باشید، این همپوشانی را به‌عنوان یک مزیت دوگانه می‌شناسید.

«دسترس‌پذیری یک ویژگی لوکس نیست؛ یک الزام مهندسی است که کیفیت محصول را در تمام ابعاد بهبود می‌دهد.»

چهارم، کیفیت کد: بلاکی که دسترس‌پذیر است، معمولاً کد تمیزتر، ساختار منطقی‌تر و نگهداشت‌پذیری بالاتری دارد.这是因为 رعایت WCAG نیازمند توجه به جزئیات ساختاری است که در نهایت به کیفیت کلی کد کمک می‌کند. اگر با HTML سمنتیک و اهمیت آن آشنا شده باشید، این ارتباط را به‌عنوان یک اصل بنیادین می‌شناسید.

چهار اصل POUR در بلاک‌های گوتنبرگ

WCAG بر پایه چهار اصل بنیادین بنا شده که به اختصار POUR نامیده می‌شوند. هر بلاک سفارشی گوتنبرگ باید این چهار اصل را در ویرایشگر و فرانت‌اند رعایت کند. درک این اصول، پیش‌نیاز پیاده‌سازی صحیح دسترس‌پذیری است.

اصل انگلیسی توضیح مثال در بلاک
قابل ادراک Perceivable اطلاعات باید به‌صورتی ارائه شود که کاربر بتواند آن را درک کند متن جانشین برای تصاویر، کنتراست کافی
قابل کار کردن Operable اجزای رابط باید با کیبورد و سایر ابزارها قابل استفاده باشند ناوبری با Tab، دکمه‌های قابل کلیک با Enter
قابل فهم Understandable اطلاعات و عملیات باید قابل درک باشند پیام‌های خطای واضح، برچسب‌های فرم
استوار Robust محتوا باید با فناوری‌های کمکی مختلف کار کند ARIA، HTML سمنتیک

قابل ادراک بودن (Perceivable)

اصل اول WCAG می‌گوید که اطلاعات و اجزای رابط باید به‌صورتی ارائه شوند که کاربر بتواند آن‌ها را درک کند. این یعنی هر عنصر بصری باید یک معادل غیربصری داشته باشد. برای بلاک‌های گوتنبرگ، این اصل چند پیامد عملی دارد:

متن جانشین (Alt Text): هر تصویر یا آیکن در بلاک باید متن جانشین داشته باشد. اگر بلاک شما یک آیکن تزئینی دارد، باید alt="" و aria-hidden="true" داشته باشد تا صفحه‌خوان آن را نادیده بگیرد. اگر آیکن معنادار است، متن جانشین باید معنای آن را توصیف کند، نه ظاهر آن را.

کنتراست رنگ: نسبت کنتراست بین متن و پس‌زمینه باید حداقل ۴.۵:۱ برای متن معمولی و ۳:۱ برای متن بزرگ باشد. اگر بلاک شما اجازه تغییر رنگ می‌دهد، باید اطمینان حاصل کنید که ترکیب‌های انتخابی کاربر از این حد پایین‌تر نروند. اگر با نقش رنگ در طراحی رابط کاربری آشنا شده باشید، این موضوع را به‌عنوان یک اصل طراحی می‌شناسید.

ساختار قابل درک: محتوای بلاک باید ساختار منطقی داشته باشد. اگر بلاک شامل یک لیست است، باید از عناصر <ul> یا <ol> استفاده کند، نه <div> با استایل لیست. اگر بلاک شامل یک جدول است، باید از <th> برای سرستون‌ها و <caption> برای عنوان جدول استفاده کند.

قابل کار کردن بودن (Operable)

اصل دوم WCAG می‌گوید که اجزای رابط باید قابل استفاده باشند. این یعنی کاربر باید بتواند تمام عملکردهای بلاک را با کیبورد، ماوس، لمس، یا فناوری‌های کمکی انجام دهد. برای بلاک‌های گوتنبرگ، این اصل چند الزام مشخص دارد:

ناوبری با کیبورد: هر عنصر تعاملی (دکمه، لینک، فیلد ورودی) باید با کلید Tab قابل دسترسی و با Enter یا Space قابل فعال‌سازی باشد. اگر بلاک شما یک عنصر تعاملی دارد که فقط با ماوس کار می‌کند، این یک نقض جدی WCAG است.

Focus Visible: هر عنصر تعاملی باید یک نشانگر فوکوس (Focus Indicator) قابل مشاهده داشته باشد. مرورگرها به‌طور پیش‌فرض یک Outline برای عناصر فوکوس‌شده نمایش می‌دهند، اما اگر با CSS آن را حذف کرده‌اید، باید یک جایگزین مناسب فراهم کنید:

/* ❌ نادرست: حذف Outline بدون جایگزین */
button:focus {
    outline: none;
}

/* ✅ درست: جایگزین مناسب */
button:focus-visible {
    outline: 2px solid #005fcc;
    outline-offset: 2px;
}

عدم وابستگی به زمان: اگر بلاک شما یک انیمیشن یا Transition دارد، کاربر باید بتواند آن را متوقف کند یا زمان آن را افزایش دهد. این موضوع برای کاربرانی که با اختلالات شناختی یا حرکتی مواجهند، حیاتی است.

قابل فهم بودن (Understandable)

اصل سوم WCAG می‌گوید که اطلاعات و عملیات باید قابل درک باشند. این یعنی کاربر باید بتواند بفهمد بلاک چه کاری انجام می‌دهد و چگونه با آن تعامل کند. برای بلاک‌های گوتنبرگ:

برچسب‌های واضح: هر فیلد ورودی باید یک برچسب (<label>) داشته باشد که هدف آن را توصیف کند. استفاده از Placeholder به‌جای Label کافی نیست، چون Placeholder پس از تایپ ناپدید می‌شود و توسط برخی صفحه‌خوان‌ها خوانده نمی‌شود. اگر با فرم در HTML و اصول آن آشنا شده باشید، این موضوع را به‌عنوان یک اصل بنیادین می‌شناسید.

پیام‌های خطای توصیفی: اگر بلاک شما اعتبارسنجی دارد، پیام خطا باید دقیقاً بگوید چه مشکلی وجود دارد و چگونه رفع می‌شود. پیام‌های عمومی مثل «خطا رخ داد» کافی نیستند.

پیش‌بینی‌پذیری: رفتار بلاک باید قابل پیش‌بینی باشد. اگر کلیک روی یک دکمه، کاربر را به صفحه دیگری می‌برد یا محتوا را تغییر می‌دهد، این باید از قبل مشخص باشد.

استوار بودن (Robust)

اصل چهارم WCAG می‌گوید که محتوا باید با فناوری‌های کمکی مختلف کار کند. این یعنی بلاک شما باید با صفحه‌خوان‌ها، بزرگ‌نماها، و سایر ابزارهای کمکی سازگار باشد. برای بلاک‌های گوتنبرگ:

HTML معتبر: ساختار HTML باید استاندارد و بدون خطا باشد. عناصر بسته‌نشده، Attributeهای نادرست، یا ساختار نامعتبر می‌توانند باعث رفتار غیرقابل پیش‌بینی در صفحه‌خوان‌ها شوند.

ARIA صحیح: اگر از ARIA (Accessible Rich Internet Applications) استفاده می‌کنید، باید دقیق و مطابق با استاندارد باشد. استفاده نادرست از ARIA می‌تواند وضعیت را بدتر از عدم استفاده کند. اگر با استانداردهای HTML و CSS آشنا شده باشید، این موضوع را به‌عنوان یک الزام فنی می‌شناسید.

دسترس‌پذیری در ویرایشگر گوتنبرگ

یکی از چالش‌های منحصر به فرد بلاک‌های گوتنبرگ این است که دسترس‌پذیری باید در دو محیط متفاوت رعایت شود: ویرایشگر (Editor) و فرانت‌اند (Front-end). این دو محیط، ساختار DOM، APIها و رفتار متفاوتی دارند و هرکدام نیازمند رویکرد خاص خود هستند.

در ویرایشگر گوتنبرگ، بلاک شما در یک محیط React اجرا می‌شود که توسط @wordpress/block-editor مدیریت می‌شود. این محیط چند ویژگی خاص دارد:

Block Toolbar: هر بلاک یک Toolbar دارد که با کلیک روی بلاک ظاهر می‌شود. این Toolbar باید با کیبورد قابل دسترسی باشد و دکمه‌های آن برچسب مناسب داشته باشند. اگر بلاک شما کنترل‌های سفارشی به Toolbar اضافه می‌کند، باید اطمینان حاصل کنید که آن‌ها نیز دسترس‌پذیر هستند.

Inspector Controls: پنل تنظیمات بلاک در نوار کناری (Sidebar) قرار دارد. این پنل باید ساختار Heading صحیح داشته باشد و هر کنترل، برچسب مناسب داشته باشد. اگر با ساخت بلاک سفارشی گوتنبرگ آشنا شده باشید، می‌دانید که این پنل با کامپوننت‌های @wordpress/components ساخته می‌شود که به‌طور پیش‌فرض دسترس‌پذیر هستند.

Block Canvas: ناحیه‌ای که محتوای بلاک در آن رندر می‌شود، یک iframe جداگانه است (در API Version 3). این جداسازی، استایل‌های ویرایشگر و فرانت‌اند را مستقل می‌کند، اما چالش‌های دسترس‌پذیری خاص خود را دارد. مثلاً Focus Management بین iframe و والد باید به‌درستی مدیریت شود.

«دسترس‌پذیری در ویرایشگر گوتنبرگ، فقط یک الزام فنی نیست؛ یک تجربه کاربری است که مستقیماً بر بهره‌وری تیم محتوا اثر می‌گذارد.»

ناوبری با کیبورد و مدیریت فوکوس

ناوبری با کیبورد یکی از مهم‌ترین جنبه‌های دسترس‌پذیری است. کاربرانی که نمی‌توانند از ماوس استفاده کنند، به کیبورد وابسته هستند. برای بلاک‌های گوتنبرگ، این موضوع چند لایه دارد:

Focus Trap و Focus Management

اگر بلاک شما یک Modal (پنجره بازشو) یا Dropdown دارد، باید Focus Trap را پیاده‌سازی کنید. Focus Trap یعنی وقتی Modal باز است، فوکوس کیبورد نتواند از آن خارج شود و کاربر نتواند به محتوای پشت Modal دسترسی پیدا کند:

import { useEffect, useRef } from 'react';

function Modal({ isOpen, onClose, children }) {
    const modalRef = useRef(null);

    useEffect(() => {
        if (!isOpen) return;

        const focusableElements = modalRef.current.querySelectorAll(
            'button, [href], input, select, textarea, [tabindex]:not([tabindex="-1"])'
        );
        const firstElement = focusableElements[0];
        const lastElement = focusableElements[focusableElements.length - 1];

        function handleTab(e) {
            if (e.key !== 'Tab') return;
            if (e.shiftKey && document.activeElement === firstElement) {
                e.preventDefault();
                lastElement.focus();
            } else if (!e.shiftKey && document.activeElement === lastElement) {
                e.preventDefault();
                firstElement.focus();
            }
        }

        document.addEventListener('keydown', handleTab);
        firstElement?.focus();

        return () => document.removeEventListener('keydown', handleTab);
    }, [isOpen]);

    if (!isOpen) return null;

    return (
        <div
            ref={modalRef}
            role="dialog"
            aria-modal="true"
            aria-labelledby="modal-title"
        >
            {children}
        </div>
    );
}

نکته مهم: پس از بسته شدن Modal، فوکوس باید به عنصری برگردد که Modal را باز کرده است. این الگو، Focus Restoration نامیده می‌شود و برای تجربه کاربری کیبورد حیاتی است.

Skip Links و Landmark Regions

Skip Links لینک‌هایی هستند که در ابتدای صفحه قرار می‌گیرند و به کاربر اجازه می‌دهند مستقیماً به محتوای اصلی برود. این لینک‌ها معمولاً برای کاربران کیبورد حیاتی هستند، چون از پیمایش تکراری منوها جلوگیری می‌کنند:

<a href="#main-content" class="skip-link">
    پرش به محتوای اصلی
</a>

<main id="main-content">
    <!-- محتوای اصلی -->
</main>

Landmark Regions نیز عناصر سمنتیک HTML5 هستند که ساختار صفحه را برای فناوری‌های کمکی توصیف می‌کنند: <header>، <nav>، <main>، <aside>، <footer>. اگر بلاک شما یک بخش از صفحه را می‌سازد، باید اطمینان حاصل کنید که این عناصر به‌درستی استفاده شده‌اند.

پشتیبانی از صفحه‌خوان و ARIA

صفحه‌خوان‌ها (Screen Readers) نرم‌افزارهایی هستند که محتوای صفحه را برای کاربران نابینا یا کم‌بینا می‌خوانند. محبوب‌ترین صفحه‌خوان‌ها عبارتند از: NVDA (رایگان، ویندوز)، JAWS (پولی، ویندوز)، VoiceOver (بومی، macOS و iOS)، و TalkBack (بومی، اندروید). هرکدام رفتار متفاوتی با ARIA و HTML دارند و تست با چند صفحه‌خوان ضروری است.

ARIA Labels و Roles

ARIA مجموعه‌ای از Attributeهاست که به فناوری‌های کمکی کمک می‌کند تا نقش، وضعیت و ویژگی‌های عناصر را درک کنند. مهم‌ترین Attributeهای ARIA در بلاک‌های گوتنبرگ:

Attribute کاربرد مثال
aria-label برچسب متنی برای عناصر بدون متن قابل مشاهده <button aria-label="بستن">×</button>
aria-labelledby ارجاع به عنصری که برچسب را نگه می‌دارد <div aria-labelledby="title-id">
aria-describedby ارجاع به توضیح تکمیلی <input aria-describedby="help-id">
aria-expanded وضعیت باز یا بسته بودن <button aria-expanded="false">
aria-hidden پنهان کردن عنصر تزئینی از صفحه‌خوان <span aria-hidden="true">★</span>
aria-live اطلاع‌رسانی تغییرات پویا <div aria-live="polite">

نکته حیاتی: ARIA فقط زمانی باید استفاده شود که HTML سمنتیک کافی نیست. قاعده طلایی ARIA این است: «اولین قانون ARIA این است که از ARIA استفاده نکن.» یعنی اگر می‌توانید با عناصر HTML بومی به هدف برسید، از آن‌ها استفاده کنید. مثلاً به‌جای <div role="button">، از <button> استفاده کنید.

Live Regions و اطلاع‌رسانی تغییرات

اگر بلاک شما محتوای پویا دارد (مثلاً نتایج جستجو، شمارنده، یا پیام وضعیت)، باید از Live Regions استفاده کنید تا صفحه‌خوان تغییرات را اطلاع دهد:

<div role="status" aria-live="polite" aria-atomic="true">
    {isLoading ? 'در حال بارگذاری...' : `${results.length} نتیجه یافت شد`}
</div>

سه مقدار برای aria-live وجود دارد:

  • off: تغییرات اطلاع داده نمی‌شوند (پیش‌فرض)
  • polite: تغییرات پس از اتمام کار فعلی صفحه‌خوان اطلاع داده می‌شوند
  • assertive: تغییرات فوراً اطلاع داده می‌شوند (فقط برای پیام‌های خطای حیاتی)

استفاده نادرست از assertive می‌تواند تجربه کاربری را مختل کند، چون صفحه‌خوان را متوقف می‌کند. اگر با تست بلاک‌های وردپرس با Jest و Playwright آشنا شده باشید، می‌دانید که این نوع رفتارها را می‌توان با تست خودکار بررسی کرد.

کنتراست رنگ و طراحی بصری

کنتراست رنگ یکی از معیارهای اصلی WCAG است که مستقیماً بر خوانایی محتوا اثر می‌گذارد. طبق استاندارد WCAG 2.2، حداقل نسبت کنتراست به شرح زیر است:

سطح نوع متن نسبت کنتراست
AA متن معمولی 4.5:1
AA متن بزرگ (18pt+ یا 14pt Bold) 3:1
AAA متن معمولی 7:1
AAA متن بزرگ 4.5:1
AA اجزای رابط (دکمه، فیلد ورودی) 3:1

برای تست کنتراست در بلاک‌های گوتنبرگ، چند ابزار وجود دارد. اول، Chrome DevTools که در پنل Elements، نسبت کنتراست هر عنصر را نمایش می‌دهد و پیشنهادهای اصلاحی ارائه می‌کند. دوم، WebAIM Contrast Checker که یک ابزار آنلاین برای تست ترکیب‌های رنگی است. سوم، Stark که یک پلاگین Figma و Chrome برای تست کنتراست در طراحی و کد است.

نکته مهم در طراحی بلاک‌های گوتنبرگ این است که اگر بلاک شما اجازه تغییر رنگ می‌دهد (مثلاً از طریق supports.color در block.json)، باید اطمینان حاصل کنید که کاربر نمی‌تواند ترکیب‌های ناسازگار با WCAG ایجاد کند. یک راه‌حل، محدود کردن پالت رنگ به ترکیب‌های از پیش تأییدشده است:

{
  "supports": {
    "color": {
      "text": true,
      "background": true,
      "palette": [
        { "name": "Dark Blue", "slug": "dark-blue", "color": "#003366" },
        { "name": "White", "slug": "white", "color": "#FFFFFF" },
        { "name": "Light Gray", "slug": "light-gray", "color": "#F0F0F0" }
      ]
    }
  }
}

اگر با تایپوگرافی فارسی در طراحی وب آشنا شده باشید، می‌دانید که کنتراست در زبان فارسی به‌دلیل پیچیدگی حروف و نیم‌فاصله، اهمیت بیشتری دارد. متن‌های نازک با کنتراست پایین، در فارسی بسیار سخت‌تر خوانده می‌شوند.

HTML سمنتیک در بلاک‌ها

HTML سمنتیک پایه دسترس‌پذیری است. عناصر سمنتیک به فناوری‌های کمکی کمک می‌کنند تا ساختار و معنای محتوا را درک کنند. برای بلاک‌های گوتنبرگ، رعایت سمنتیک در چند سطح حیاتی است:

ساختار Heading صحیح

هر صفحه باید یک ساختار Heading منطقی داشته باشد: یک <h1> و سپس <h2>، <h3> و... به‌ترتیب سلسله‌مراتبی. بلاک‌های گوتنبرگ باید این ساختار را رعایت کنند و از پرش سطح (مثلاً از <h2> به <h4>) خودداری نمایند:

// ❌ نادرست: پرش سطح
<h2>عنوان بخش</h2>
<h4>زیربخش</h4>

// ✅ درست: سلسله‌مراتب منطقی
<h2>عنوان بخش</h2>
<h3>زیربخش</h3>

مشکل رایج در بلاک‌های گوتنبرگ این است که بلاک‌های مختلف (مثل Heading، Paragraph، List) به‌صورت مستقل رندر می‌شوند و هیچ مکانیزمی برای بررسی سلسله‌مراتب کلی صفحه وجود ندارد. راه‌حل، استفاده از ابزارهای بررسی خودکار است که ساختار نهایی صفحه را تحلیل می‌کنند.

لیست‌ها، جداول و فرم‌ها

سه عنصر سمنتیک که در بلاک‌های گوتنبرگ بیشترین اشتباه را دارند:

لیست‌ها: اگر بلاک شما مجموعه‌ای از آیتم‌ها را نمایش می‌دهد، باید از <ul> یا <ol> استفاده کند، نه <div> با استایل لیست. صفحه‌خوان‌ها تعداد آیتم‌ها را از عنصر <li> تشخیص می‌دهند و اگر از <div> استفاده شود، این اطلاعات از دست می‌رود.

جداول: جدول‌های داده باید دارای <caption>، <thead>، <th> و <tbody> باشند. برای جدول‌های پیچیده، Attribute scope باید مشخص کند که سرستون برای سطر است یا ستون:

<table>
    <caption>قیمت محصولات</caption>
    <thead>
        <tr>
            <th scope="col">نام محصول</th>
            <th scope="col">قیمت</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <th scope="row">کتاب</th>
            <td>۱۲۰,۰۰۰ تومان</td>
        </tr>
    </tbody>
</table>

فرم‌ها: هر فیلد ورودی باید یک <label> مرتبط داشته باشد. اگر Label قابل مشاهده نیست (مثلاً در طراحی Minimal)، باید از aria-label یا کلاس screen-reader-text استفاده شود:

<label for="search-input" class="screen-reader-text">
    جستجو
</label>
<input
    id="search-input"
    type="search"
    placeholder="جستجو..."
    aria-label="جستجو در سایت"
/>

تست دسترس‌پذیری بلاک‌ها

تست دسترس‌پذیری یک فرآیند چندلایه است که ترکیبی از ابزارهای خودکار و بررسی دستی را شامل می‌شود. هیچ ابزار خودکاری نمی‌تواند تمام جنبه‌های دسترس‌پذیری را پوشش دهد و هیچ بررسی دستی بدون ابزار، مقیاس‌پذیر نیست.

ابزارهای خودکار

مهم‌ترین ابزارهای خودکار برای تست دسترس‌پذیری:

  • axe-core: کتابخانه‌ای متن‌باز که بیش از ۹۰ قانون WCAG را بررسی می‌کند. این کتابخانه در Chrome DevTools، Lighthouse و Playwright ادغام شده است.
  • Lighthouse: ابزاری در Chrome DevTools که یک بخش کامل را به دسترس‌پذیری اختصاص می‌دهد.
  • WAVE: افزونه مرورگری که مشکلات دسترس‌پذیری را به‌صورت بصری روی صفحه علامت‌گذاری می‌کند.
  • Pa11y: ابزاری خط فرمان که برای CI/CD مناسب است.

برای تست خودکار بلاک‌های گوتنبرگ، می‌توان از Playwright با axe-core استفاده کرد:

import { test, expect } from '@playwright/test';
import AxeBuilder from '@axe-core/playwright';

test('block should have no accessibility violations', async ({ page }) => {
    await page.goto('/?p=1');
    const results = await new AxeBuilder({ page })
        .withTags(['wcag2a', 'wcag2aa', 'wcag21a', 'wcag21aa'])
        .analyze();
    expect(results.violations).toEqual([]);
});

این تست، تمام قوانین WCAG سطح A و AA را بررسی می‌کند و در صورت وجود نقض، لیست دقیقی از مشکلات ارائه می‌دهد. اگر با تست بلاک‌های وردپرس با Jest و Playwright آشنا شده باشید، این الگو را به‌عنوان بخشی از استراتژی کیفیت می‌شناسید.

تست دستی و Screen Reader

تست خودکار فقط بخشی از تصویر را نشان می‌دهد. بررسی دستی با Screen Reader و کیبورد، جنبه‌هایی را کشف می‌کند که ابزارهای خودکار نمی‌توانند:

  • آیا ترتیب فوکوس منطقی است؟
  • آیا برچسب‌ها هنگام خواندن با Screen Reader معنادار هستند؟
  • آیا پیام‌های پویا به‌درستی اطلاع داده می‌شوند؟
  • آیا تجربه کاربر با کیبورد روان است؟

برای تست دستی، توصیه می‌شود از ترکیب زیر استفاده کنید:

  1. ناوبری کامل صفحه با Tab و Shift+Tab
  2. تست با NVDA (ویندوز) یا VoiceOver (macOS)
  3. تست با بزرگ‌نمایی ۲۰۰٪
  4. تست با حالت High Contrast مرورگر
«تست خودکار، ۳۰ تا ۴۰ درصد مشکلات دسترس‌پذیری را کشف می‌کند. باقی، نیازمند چشم و گوش انسانی است.»

اشتباهات رایج در دسترس‌پذیری بلاک‌ها

اشتباه اول: استفاده از <div> به‌جای <button>. اگر یک عنصر تعاملی با onClick دارید، باید از <button> استفاده کنید. عنصر <div> به‌طور پیش‌فرض قابل فوکوس نیست، نقش دکمه ندارد، و با کلید Enter فعال نمی‌شود.

اشتباه دوم: حذف Focus Outline بدون جایگزین. حذف outline: none بدون فراهم کردن یک نشانگر جایگزین، کاربران کیبورد را کور می‌کند. اگر ظاهر Outline پیش‌فرض مرورگر را دوست ندارید، از :focus-visible با استایل سفارشی استفاده کنید.

اشتباه سوم: استفاده از Placeholder به‌جای Label. Placeholder پس از تایپ ناپدید می‌شود و کاربر نمی‌تواند به یاد بیاورد چه چیزی باید وارد کند. علاوه بر این، برخی صفحه‌خوان‌ها Placeholder را نمی‌خوانند.

اشتباه چهارم: کنتراست ناکافی. متن خاکستری روشن روی پس‌زمینه سفید، یکی از رایج‌ترین مشکلات است. حداقل نسبت ۴.۵:۱ را رعایت کنید.

اشتباه پنجم: عدم اطلاع‌رسانی تغییرات پویا. اگر بلاک شما محتوایی را به‌صورت داینامیک تغییر می‌دهد (مثلاً فیلتر نتایج)، باید از aria-live استفاده کنید تا کاربران صفحه‌خوان از تغییر مطلع شوند.

اشتباه ششم: ساختار Heading نامناسب. اگر بلاک شما یک عنوان دارد، باید از <h2> یا <h3> استفاده کند، نه <div class="title">. ساختار Heading، ستون فقرات ناوبری صفحه‌خوان است.

اشتباه هفتم: نادیده گرفتن RTL. اگر بلاک شما در زبان‌های راست‌به‌چپ (مثل فارسی یا عربی) استفاده می‌شود، باید اطمینان حاصل کنید که چیدمان، متن‌چین و آیکن‌ها به‌درستی معکوس می‌شوند. اگر با بین‌المللی‌سازی بلاک‌های وردپرس آشنا شده باشید، این موضوع را به‌عنوان بخشی از i18n می‌شناسید.

پرسش‌های پرتکرار درباره دسترس‌پذیری بلاک‌های وردپرس

آیا رعایت WCAG برای همه بلاک‌ها ضروری است؟

اگر بلاک شما در یک سایت عمومی، تجاری، دولتی یا آموزشی استفاده می‌شود، رعایت WCAG سطح AA یک الزام قانونی در بسیاری از کشورهاست. حتی اگر الزام قانونی وجود نداشته باشد، رعایت دسترس‌پذیری یک تعهد اخلاقی و یک مزیت رقابتی است. برای بلاک‌های داخلی که فقط در یک سازمان استفاده می‌شوند، اولویت پایین‌تری دارد اما همچنان توصیه می‌شود.

چگونه بلاک خود را برای صفحه‌خوان تست کنم؟

سه گام اصلی: اول، از ابزارهای خودکار مثل axe-core و Lighthouse برای کشف مشکلات پایه استفاده کنید. دوم، بلاک را با یک صفحه‌خوان واقعی (NVDA یا VoiceOver) تست کنید و تمام Workflowها را با کیبورد انجام دهید. سوم، از کاربران دارای معلولیت برای تست واقعی دعوت کنید. ترکیب این سه، پوشش جامعی ایجاد می‌کند.

آیا استفاده از ARIA همیشه ضروری است؟

خیر. قاعده طلایی این است: «اولین قانون ARIA این است که از ARIA استفاده نکن.» اگر با HTML سمنتیک می‌توانید به هدف برسید، از ARIA استفاده نکنید. ARIA فقط برای مواقعی است که HTML بومی کافی نیست (مثلاً برای Widgetهای پیچیده مثل Tab، Accordion، یا Modal). استفاده نادرست از ARIA می‌تواند وضعیت را بدتر کند.

چگونه کنتراست رنگ را در بلاک تست کنم؟

سه ابزار اصلی: اول، Chrome DevTools که در پنل Elements نسبت کنتراست را نمایش می‌دهد. دوم، WebAIM Contrast Checker برای تست ترکیب‌های خاص. سوم، افزونه Stark برای Figma و Chrome. برای تست خودکار، می‌توانید از axe-core در Playwright استفاده کنید که کنتراست را نیز بررسی می‌کند.

آیا دسترس‌پذیری بر سرعت سایت تأثیر منفی می‌گذارد؟

خیر، برعکس. بسیاری از معیارهای دسترس‌پذیری با معیارهای عملکرد همپوشانی دارند. HTML سمنتیک، تصاویر با متن جانشین، و ساختار منطقی — همه به عملکرد بهتر کمک می‌کنند. اگر با طراحی ریسپانسیو و اهمیت آن آشنا شده باشید، می‌دانید که این دو حوزه مکمل یکدیگرند.

چه تفاوتی بین WCAG 2.1 و 2.2 و 3.0 وجود دارد؟

WCAG 2.1 در سال ۲۰۱۸ منتشر شد و معیارهای جدیدی برای موبایل و افراد کم‌بینا اضافه کرد. WCAG 2.2 در سال ۲۰۲۳ منتشر شد و ۹ معیار جدید اضافه کرد، از جمله Focus Appearance و Dragging Movements. WCAG 3.0 در حال توسعه است و یک مدل امتیازدهی متفاوت ارائه می‌دهد. برای اکثر پروژه‌ها، رعایت WCAG 2.2 سطح AA کافی است.

آیا می‌توانم از کتابخانه‌های آماده برای دسترس‌پذیری استفاده کنم؟

بله. کامپوننت‌های @wordpress/components به‌طور پیش‌فرض دسترس‌پذیر هستند و می‌توانید از آن‌ها استفاده کنید. برای Widgetهای پیچیده، کتابخانه‌هایی مثل Reach UI، Headless UI و Radix UI وجود دارند که Focus Management و ARIA را به‌درستی پیاده‌سازی می‌کنند. استفاده از این کتابخانه‌ها، از بازنویسی چرخ را جلوگیری می‌کند.

نگاه پایانی به دسترس‌پذیری بلاک‌های وردپرس

دسترس‌پذیری بلاک‌های وردپرس طبق WCAG، یک ضرورت مهندسی است که از چند لایه تشکیل شده: ساختار HTML سمنتیک، مدیریت فوکوس، پشتیبانی از صفحه‌خوان، کنتراست رنگ، و تست مداوم. هر لایه، نیازمند توجه و ابزار خاص خود است و نادیده گرفتن هرکدام، تجربه کاربری را برای بخشی از مخاطبان مختل می‌کند.

سه معیار کلیدی برای موفقیت در این حوزه:

۱. طراحی از ابتدا. دسترس‌پذیری یک ویژگی نیست که در انتهای پروژه اضافه شود. باید از روز اول در معماری بلاک لحاظ شود. افزودن دسترس‌پذیری بعد از انتشار، هزینه‌های پنهانی ایجاد می‌کند: بازنویسی، بازبینی، و تست مجدد.

۲. ترکیب ابزار و انسان. ابزارهای خودکار مثل axe-core بخشی از مشکلات را کشف می‌کنند، اما تست دستی با صفحه‌خوان و کیبورد ضروری است. هیچ ابزاری جایگزین چشم و گوش انسان نمی‌شود.

۳. تست مداوم. دسترس‌پذیری یک وضعیت نیست، یک فرآیند است. با هر ویژگی جدید، باید اطمینان حاصل کنید که دسترس‌پذیری حفظ شده است. ادغام تست‌های دسترس‌پذیری در CI/CD، این تداوم را تضمین می‌کند.

اگر در حال ساخت بلاک سفارشی هستید، دسترس‌پذیری را به‌عنوان بخشی از تعریف «تمام‌شده» در نظر بگیرید. بلاکی که دسترس‌پذیر نیست، یک بلاک نیمه‌کاره است. برای آشنایی بیشتر با توسعه بلاک و تست، ساخت بلاک سفارشی گوتنبرگ و تست بلاک‌های وردپرس می‌توانند نقاط شروع خوبی باشند.

تحلیل مهندسی سطح بالا

از منظر معماری نرم‌افزار، دسترس‌پذیری یک Cross-Cutting Concern است که تمام لایه‌های بلاک را تحت تأثیر قرار می‌دهد: از DOM Structure و CSS تا State Management و Event Handling. چالش اصلی، Sync بین دو Runtime است: ویرایشگر گوتنبرگ که در React اجرا می‌شود و فرانت‌اند که HTML نهایی را رندر می‌کند. هر بلاک باید در هر دو محیط دسترس‌پذیر باشد و این دو محیط، APIها و چرخه‌های حیات متفاوتی دارند. راه‌حل معماری، استفاده از Shared Accessibility Primitives است: کامپوننت‌ها و Helperهایی که در هر دو محیط قابل استفاده باشند و رفتار یکسانی ارائه دهند. کتابخانه @wordpress/components نمونه‌ای از این رویکرد است: کامپوننت‌هایی مثل Button، Modal، و Dropdown که به‌طور پیش‌فرض دسترس‌پذیر هستند و در هر دو محیط کار می‌کنند. چالش بعدی، Automated Verification at Scale است: تست دسترس‌پذیری به‌صورت خودکار در CI/CD، نیازمند زیرساختی است که بتواند axe-core را در Playwright اجرا کند، نتایج را تحلیل کند، و در صورت نقض، Build را متوقف کند. این سطح از اتوماسیون، در پروژه‌های بزرگ که ده‌ها بلاک و صدها صفحه دارند، حیاتی است. در نهایت، دسترس‌پذیری یک Quality Attribute است، نه یک ویژگی. مانند Performance یا Security، باید در تمام مراحل توسعه — از طراحی تا استقرار — لحاظ شود و به‌عنوان یک معیار پذیرش (Acceptance Criteria) تعریف گردد. تیم‌هایی که این رویکرد را اتخاذ می‌کنند، محصولاتی می‌سازند که نه فقط الزامات قانونی را برآورده می‌کنند، بلکه تجربه‌ای فراگیر برای تمام کاربران فراهم می‌نمایند.

اگر این تجربه را در یک پروژه واقعی داشته‌اید، جالب است بدانید کدام بخش از دسترس‌پذیری بیشترین زمان را از شما گرفت. تجربه خودتان را در دیدگاه‌ها بنویسید؛ به‌خصوص اگر راه‌حل دیگری پیدا کرده‌اید که می‌تواند برای خواننده بعدی مفید باشد. ♿

همچنین اگر می‌خواهید در مورد پیاده‌سازی عملی دسترس‌پذیری و توسعه بلاک بیشتر بدانید، استانداردهای دسترس‌پذیری وب و HTML سمنتیک و اهمیت آن می‌توانند نقاط شروع خوبی باشند.