Comment ajouter <span> à chaque lien de menu avec le texte du lien vers data-attr?


8

Comment puis-je obtenir quelque chose comme ci-dessous? Mon code est comme ceci:

wp_nav_menu(
     array(
       'theme_location' => 'header_menu',
       'container_id' => 'menu',
       'link_before' => '<span data-hover="link-text-here">',
       'link_after' => '</span>',
     )
  );

Je veux obtenir le résultat ci-dessous:

<nav class="main-nav">
    <li><a href="#"><span data-hover="Home">Home</span></a></li>
    <li><a href="#"><span data-hover="Proyects">Proyects</span></a></li>
</nav>

Conseillez-moi, s'il-vous-plaît.

Réponses:


4

Solution 1: utilisation de la personnalisation du déambulateur

J'ai eu une idée de la classe d' ajout de span dans la balise d'ancrage de lien wp_nav_menu et j'ai apporté quelques modifications à vos besoins.

1. Ajoutez d'abord ce code ci-dessous à votre fichier functions.php.

class Nav_Walker_Nav_Menu extends Walker_Nav_Menu{
  function start_el(&$output, $item, $depth, $args){
       global $wp_query;
       $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
       $class_names = $value = '';
       $classes = empty( $item->classes ) ? array() : (array) $item->classes;
       $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item ) );
       $class_names = ' class="'. esc_attr( $class_names ) . '"';

       $output .= $indent . '<li id="menu-item-'. $item->ID . '"' . $value . $class_names .'>';

       $attributes  = ! empty( $item->attr_title ) ? ' title="'  . esc_attr( $item->attr_title ) .'"' : '';
       $attributes .= ! empty( $item->target )     ? ' target="' . esc_attr( $item->target     ) .'"' : '';
       $attributes .= ! empty( $item->xfn )        ? ' rel="'    . esc_attr( $item->xfn        ) .'"' : '';
      $attributes .= ! empty( $item->url )        ? ' href="'   . esc_attr( $item->url        ) .'"' : '';


       $description  = ! empty( $item->description ) ? '<span>'.esc_attr( $item->description ).'</span>' : '';



        $item_output = $args->before;
        $item_output .= '<a'. $attributes .'><span data-hover="'. $item->title .'">';
        $item_output .=$args->link_before .apply_filters( 'the_title', $item->title, $item->ID );
        $item_output .= $description.$args->link_after;
        $item_output .= '</span></a>';
        $item_output .= $args->after;

        $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
    }
}

2. Ajoutez le code ci-dessous à votre header.phpemplacement d' wp_nav_menuinstallation. Le code est expliqué ci-dessous, il installe donc le nouveau menu personnalisé dans ce cas Nav_Walker_Nav_Menu.

<?php wp_nav_menu( array( 'container_class' => 'menu-header', 'theme_location' => 'primary', 'walker' => new Nav_Walker_Nav_Menu() ) ); ?>

J'espère que cela vous aidera bien!

Solution 2: utilisation wp_list_pages

Veuillez consulter cette page . Vous pouvez voir leur extrait. Si vous mettez les portées autour des balises de lien, vous pouvez utiliser link_beforeetlink_after

wp_list_pages("link_before=<span data-hover="link-text-here">&link_after=</span>");

son avis: essayer d'obtenir la propriété d'un non-objet dans /Applications/MAMP/htdocs/wp.dev/wp-content/themes/eta-theme/functions.php sur la ligne 98
Mohamed Rihan

Alors, quel est le code à la ligne 98?
AddWeb Solution Pvt Ltd

$ item_output = $ args-> avant; $ item_output. = '<a'. $ attributes. '> <span data-hover = "'. $ item-> title. '">'; $ item_output. = $ args-> link_before .apply_filters ('the_title', $ item-> title, $ item-> ID); $ item_output. = $ description. $ args-> link_after; $ item_output. = '</span> </a>'; $ item_output. = $ args-> after;
Mohamed Rihan

semble ok maintenant. son couse de i n'a pas ajouté de menu sur le tableau de bord .. merci
Mohamed Rihan

8

Depuis la version 4.4.0, le filtre «nav_menu_item_args» a été ajouté. Cela vous permet de définir les attributs «link_before» et «link_after» pour chaque élément.

add_filter('nav_menu_item_args', function ($args, $item, $depth) {
    if ($args->theme_location == 'header_menu') {
        $title             = apply_filters('the_title', $item->title, $item->ID);
        $args->link_before = '<span data-hover="' . $title . '">';
        $args->link_after  = '</span>';
    }
    return $args;
}, 10, 3);

Ce n'est pas correct .. ci-dessous est sorti après avoir utilisé le filtre ... <li id ​​= "menu-item-44" class = "menu-item menu-item-type-post_type menu-item-object-page current-menu -item page_item page-item-24 current_page_item menu-item-44 "> <a href=" sandbox.test/about" aria-current="page"> <span data-hover = "About"> About </span> </a> </li>
Daren Zammit

2

S'il vous plaît essayez ce qui suit:

wp_nav_menu(
 array(
   'theme_location' => 'header_menu',
   'container_id' => 'menu',
   'walker' => new description_walker()
 )
);

Et ajoutez ceci à functions.php:

class description_walker extends Walker_Nav_Menu{
  function start_el(&$output, $item, $depth, $args){
       global $wp_query;
       $indent = ( $depth ) ? str_repeat( "\t", $depth ) : '';
       $class_names = $value = '';
       $classes = empty( $item->classes ) ? array() : (array) $item->classes;
       $class_names = join( ' ', apply_filters( 'nav_menu_css_class', array_filter( $classes ), $item ) );
       $class_names = ' class="'. esc_attr( $class_names ) . '"';

       $output .= $indent . '<li id="menu-item-'. $item->ID . '"' . $value . $class_names .'>';

       $attributes  = ! empty( $item->attr_title ) ? ' title="'  . esc_attr( $item->attr_title ) .'"' : '';
       $attributes .= ! empty( $item->target )     ? ' target="' . esc_attr( $item->target     ) .'"' : '';
       $attributes .= ! empty( $item->xfn )        ? ' rel="'    . esc_attr( $item->xfn        ) .'"' : '';
      $attributes .= ! empty( $item->url )        ? ' href="'   . esc_attr( $item->url        ) .'"' : '';


       $description  = ! empty( $item->description ) ? '<span>'.esc_attr( $item->description ).'</span>' : '';



        $item_output = $args->before;
        $item_output .= '<a'. $attributes .'><span>';
        $item_output .=$args->link_before .apply_filters( 'the_title', $item->title, $item->ID );
        $item_output .= $description.$args->link_after;
        $item_output .= '<span></a>';
        $item_output .= $args->after;

        $output .= apply_filters( 'walker_nav_menu_start_el', $item_output, $item, $depth, $args );
        }
}

De cette façon, vous pouvez facilement ajouter une balise span ...


mais je veux que les données soient dans l'intervalle
Mohamed Rihan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.