Wenn du Links mit Ankern in deinen Menüs verwendest, ist dir vielleicht schon aufgefallen, dass sie automatisch die Klasse current-menu-item bekommen, was du eventuell nicht möchtest. Das kann besonders dann der Fall sein, wenn du ein Untermenü mit Ankern hast, die alle zu einer entsprechenden ID auf einer Unterseite verweisen. Das würde dann dazu führen, dass all diese Anker-Links durch die Klasse current-menu-item als aktiv markiert werden würden, wenn diese Unterseite aufgerufen wird.

Auch wenn Anker manuell im Menü gesetzt werden müssen, mag WordPress wohl keinen individuellen Inhalt, denn ähnlich wie bei 404-Seiten, bei denen WordPress nach Möglichkeit versucht, deren Anzeige zu vermeiden und lieber auf eine existierende, ähnlich klingende Seite weiterzuleiten, versucht es, individuelle Menüeinträge mit existierendem Inhalt zu verknüpfen. Wenn ich demnach eine Unterseite unter /unterseite/ habe und einen individuellen Link in meinem Menü mit diesem Pfad erstelle, wird er automatisch mit dieser Seite verknüpft und erhält auch alle entsprechenden Klassen im Menüeintrag. Und da für diese Erkennung Anker ignoriert werden, wird auch ein /unterseite/#anker als mit dieser Seite verknüpft erkannt.

In meinem Fall war das jedoch nicht gewünscht, da alle Untermenüpunkte mit einem Anker auch die Klasse current-menu-item erhielten und somit aus Designperspektive als aktiv markiert wurden. Deshalb habe ich ein kleines Code-Snippet erstellt, das prüft, ob ein Menüeintrag individuell angelegt wurde und einen Anker beinhaltet. Wenn das der Fall ist, entferne ich die Klasse current-menu-item von diesem Menüeintrag, wenn vorhanden. Das Ergebnis ist, dass Links mit Ankern nie die Klasse current-menu-item erhalten.

Das Code-Snippet:

/**
 * Remove classes from menu items.
 * 
 * @param	\WP_Post[]	$menu_items Menu items
 * @return	\WP_Post[] Updated menu items
 */
function epiphyt_remove_item_classes( array $menu_items ): array {
	foreach ( $menu_items as $menu_item ) {
		// remove class 'current-menu-item' if menu item is custom and contains an anchor
		if (
			$menu_item->type === 'custom'
			&& isset( $menu_item->url )
			&& \str_contains( $menu_item->url, '#' )
			&& ! empty( $menu_item->classes )
		) {
			$key = \array_search( 'current-menu-item', $menu_item->classes, true );
			
			if ( $key !== false ) {
				unset( $menu_item->classes[ $key ] );
			}
		}
	}
	
	return $menu_items;
}

\add_filter( 'wp_nav_menu_objects', 'epiphyt_remove_item_classes' );
Code-Sprache: PHP (php)

Neuveröffentlichungen

Schreibe einen Kommentar

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

Um auf deiner eigenen Website zu antworten, gib die URL deiner Antwort ein, die einen Link zur Permalink-URL dieses Beitrags enthalten sollte. Deine Antwort wird dann (möglicherweise nach der Moderation) auf dieser Seite erscheinen. Möchtest du deine Antwort aktualisieren oder entfernen? Aktualisiere oder lösche deinen Beitrag und gib die URL deines Beitrags noch einmal ein. (Mehr über die Funktion von Webmentions erfahren)