web-dev-qa-db-de.com

füge span zu den Top Level Links eines WordPress-Menüs namens "main" hinzu

Ich möchte den Links auf oberster Ebene eines WordPress-Menüs mit dem Namen "main" einen Bereich hinzufügen.

Die gewünschte HTML-Ausgabe (WordPress-Klassen für eine übersichtliche Darstellung entfernt) würde folgendermaßen aussehen:

<ul><li><a href="#"><span>Link</span></a></li><li><a href="#"><span>Link</span></a><ul><li><a href="#">Sub Link (no span)</a></li><li><a href="#">Sub Link (no span)</a></li><li><a href="#">Sub Link (no span)</a></li></ul> ____.] </li><li><a href="#"><span>Link</span></a></li><li><a href="#"><span>Link</span></a></li></ul> 
 

Ich habe diesen WordPress-Filter vor einiger Zeit beim Googeln (wahrscheinlich Stapelüberlauf, ich kann mich nicht erinnern, wo) gefunden, der die Spanne schön hinzufügt, aber er fügt sie zu jedem Menü in meinem Thema hinzu.

add_filter( 'wp_nav_menu_objects', function( $items ) {
      foreach ( $items as $item ) {
        if (!$item->menu_item_parent) {
           $item->title = '<span>' . $item->title . '</span>';
        }
    }
    return $items;
});

Q1. Gibt es eine Möglichkeit, diesen Filter nur zum Hauptmenü hinzuzufügen?

Q2. Ist das der beste Filter/Weg, um dies zu erreichen?

Danke für jede Hilfe.

1
user3643520

$args, der zweite Parameter, der an wp_nav_menu_objects übergeben wird, kann verwendet werden, um zu überprüfen, welches Menü verarbeitet wird. Auf diese Weise können wir nur das gewünschte Menü auswählen.

Im folgenden Code überprüfen wir, ob der Slug des Menüs main ist, und schließen Sie in diesem Fall die Menüelemente der obersten Ebene in span-Tags ein.

/**
 * Filters the sorted list of menu item objects before generating the menu's HTML.
 *
 * @param array    $sorted_menu_items The menu items, sorted by each menu item's menu order.
 * @param stdClass $args              An object containing wp_nav_menu() arguments.
 */
add_filter( 'wp_nav_menu_objects', 'wpse_wp_nav_menu_objects', 10, 2 );
function wpse_wp_nav_menu_objects( $sorted_menu_items, $args  ) {
    // Only modify the "main" menu.
    if ( ! isset( $args->menu->slug ) || 'main' !== $args->menu->slug ) {
        return $sorted_menu_items;
    }

    // Loop over the menu items wrapping only top level items in span tags.
    foreach ( $sorted_menu_items as $item ) {
        if ( ! $item->menu_item_parent ) {
            $item->title = '<span>' . $item->title . '</span>';
        }
    }

    return $sorted_menu_items;
}

Der Filter oben funktioniert technisch für alle Menüs, aber mit unserem Check-in wirkt er sich nur auf das gewünschte Menü aus.

Ob wp_nav_menu_objects der beste Filter ist oder nicht, steht zur Debatte, aber ich denke, es ist eine gute Lösung für das vorliegende Problem. Es ist sicherlich besser, als einen der späteren Filter wie wp_nav_menu_items, wp_nav_menu_{$menu->slug}_items oder wp_nav_menu zu verwenden, bei denen das HTML des Menüs analysiert werden müsste.

0
Dave Romsey