Ankerlink an den Anfang der Seite
Titelbild für Bessere Accessibility für WordPress Pagination
Generic filters
Filter by Kategorien

Immer mal wieder durchläuft unsere Website die eine oder andere Prüfung, vor allem auf Accessibility. Eigentlich wollte ich heute etwas über A11y-Overlays schreiben (Plugins, die deine Website accessible machen sollen / wollen) und suchte nach ein paar Beispielen. Dabei fand ich Tota11y WP, ein Helferplugin, das es WordPress-Entwicklern erleichtert, ihre Website / ihr Theme oder Plugin auf Accessibility zu prüfen.

Bei Archiv-Seiten mit Paginierung bekam ich bei der Linktext-Prüfung folgende Meldung:

The text „1“ is unclear without context and may be confusing to screen readers. Consider rearranging the <a></a> tags or including special screen reader text.

Gemeint war, aus diesem Snippet:

<nav class="wp-block-query-pagination is-layout-flex wp-block-query-pagination-is-layout-flex" aria-label="Pagination">
	<div class="wp-block-query-pagination-numbers">
<span aria-current="page" class="page-numbers current">1</span>
<a class="page-numbers" href="https://webentwicklerin.at/blog/page/2/">2</a>
<a class="page-numbers" href="https://webentwicklerin.at/blog/page/3/">3</a>
<span class="page-numbers dots">…</span>
<a class="page-numbers" href="https://webentwicklerin.at/blog/page/49/">49</a></div>
		<a href="https://webentwicklerin.at/blog/page/2/" class="wp-block-query-pagination-next">→</a>
	</nav>

soll ein Output entstehen wie dieser (in etwa):

<nav class="wp-block-query-pagination is-content-justification-center is-layout-flex wp-container-core-query-pagination-is-layout-a89b3969 wp-block-query-pagination-is-layout-flex" aria-label="Seitennummerierung"><div class="wp-block-query-pagination-numbers"><span aria-current="page" class="page-numbers current">1</span> <a class="page-numbers" href="https://webentwicklerin.at/blog/page/2/" aria-label="Blog-Seitennummerierung, Seite 2">2</a> <a class="page-numbers" href="https://webentwicklerin.at/blog/page/3/" aria-label="Blog-Seitennummerierung, Seite 3">3</a> <span class="page-numbers dots">…</span> <a class="page-numbers" href="https://webentwicklerin.at/blog/page/51/" aria-label="Blog-Seitennummerierung, Seite 51">51</a></div> <a href="https://webentwicklerin.at/blog/page/2/" class="wp-block-query-pagination-next" aria-label="weiter"><span class="wp-block-query-pagination-next-arrow is-arrow-arrow" aria-hidden="true">→</span></a></nav>

Ob überhaupt und wie zingend die Maßnahme tatsächlich ist, sei dahingestellt. Ich bin grundsätzlich geneigt, Accessibility-Empfehlungen nachzukommen. Da ich mein Theme selbst entwickelt habe und weiter entwickle, ist das nicht wirklich ein großes Thema.

Und so wurde die Accessibility in der Pagination (Block!) umgesetzt

/**
 * Build a contextual label prefix for pagination accessibility text.
 *
 * @since 2.0.0
 *
 * @return string
 */
function webentwicklerin_get_pagination_context_label()
{
	if (is_home() || is_front_page()) {
		return __('Blog pagination', 'webentwicklerin');
	}

	if (is_category()) {
		return __('Category pagination', 'webentwicklerin');
	}

	if (is_tag()) {
		return __('Tag pagination', 'webentwicklerin');
	}

	if (is_tax()) {
		return __('Taxonomy pagination', 'webentwicklerin');
	}

	if (is_search()) {
		return __('Search results pagination', 'webentwicklerin');
	}

	if (is_post_type_archive()) {
		return __('Archive pagination', 'webentwicklerin');
	}

	if (is_archive()) {
		return __('Archive pagination', 'webentwicklerin');
	}

	return __('Pagination', 'webentwicklerin');
}

/**
 * Add an aria-label to the first link in rendered block markup.
 *
 * @since 2.0.0
 *
 * @param string $block_content Rendered block HTML.
 * @param string $label         Accessible label text.
 * @return string
 */
function webentwicklerin_add_aria_label_to_first_link($block_content, $label)
{
	if (false !== stripos($block_content, 'aria-label=')) {
		return $block_content;
	}

	return preg_replace(
		'/<a\b(?![^>]*\baria-label=)([^>]*)>/i',
		'<a$1 aria-label="' . esc_attr($label) . '">',
		$block_content,
		1
	);
}

/**
 * Improve accessibility labels for Query Loop pagination links.
 *
 * Keeps visible pagination unchanged and adds contextual aria-labels only.
 *
 * @since 2.0.0
 */
add_filter(
	'render_block_core/query-pagination-previous',
	function ($block_content) {
		$context = webentwicklerin_get_pagination_context_label();

		return webentwicklerin_add_aria_label_to_first_link(
			$block_content,
			sprintf(
				/* translators: %s: Pagination context, e.g. Blog pagination. */
				__('%s, previous page', 'webentwicklerin'),
				$context
			)
		);
	},
	10,
	1
);

add_filter(
	'render_block_core/query-pagination-next',
	function ($block_content) {
		$context = webentwicklerin_get_pagination_context_label();

		return webentwicklerin_add_aria_label_to_first_link(
			$block_content,
			sprintf(
				/* translators: %s: Pagination context, e.g. Blog pagination. */
				__('%s, next page', 'webentwicklerin'),
				$context
			)
		);
	},
	10,
	1
);

add_filter(
	'render_block_core/query-pagination-numbers',
	function ($block_content) {
		$context = webentwicklerin_get_pagination_context_label();

		return preg_replace_callback(
			'/<a\b([^>]*\bclass=(["\'])[^"\']*\bpage-numbers\b[^"\']*\2[^>]*)>(\d+)<\/a>/i',
			function ($matches) use ($context) {
				$attributes = $matches[1];
				$page_number = $matches[3];

				if (false !== stripos($attributes, 'aria-label=')) {
					return $matches[0];
				}

				return sprintf(
					'<a%s aria-label="%s">%s</a>',
					$attributes,
					esc_attr(
						sprintf(
							/* translators: 1: Pagination context, 2: Page number. */
							__('%1$s, page %2$s', 'webentwicklerin'),
							$context,
							$page_number
						)
					),
					$page_number
				);
			},
			$block_content
		);
	},
	10,
	1
);

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Hinweis: Name und E-Mail-Adresse (beides optional, da alle Kommentare moderiert werden) werden dauerhaft gespeichert. Über dieses Formular kann jeder Zeit die Löschung persönlicher Daten oder Kommentare angefordert werden; die Anfrage wird nicht veröffentlicht und nach der Bearbeitung gelöscht. IP-Adressen, die mit Kommentaren gespeichert werden, werden nach zwei Monaten automatisch gelöscht.

Ihre Nachricht wird möglicherweise zur Spam-Prüfung an OpenAI (USA) weitergeleitet. Weitere Informationen finden Sie in unserer Datenschutzerklärung.