web-dev-qa-db-fra.com

Remplacement d'un élément de menu spécifique

Je comprends donc comment cibler un menu spécifique en utilisant ce qui suit pour ajouter un code personnalisé.

<?php

wp_nav_menu(
 array(
  'menu' => 'Project Nav',
  // do not fall back to first non-empty menu
  'theme_location' => '__no_such_location',
  // do not fall back to wp_page_menu()
  'fallback_cb' => false
 )
 );

?>

La question que j'ai est la suivante.

Disons que j'ai un menu appelé "primaire". Dans ce menu, il y a 4 éléments de menu (image ci-dessous).

enter image description here

L'un des éléments s'appelle "Profil".

Je souhaite remplacer le mot "Profil" par le code suivant, qui montre la photo du profil de l'utilisateur au lieu du mot "Profil".

    <?php global $my_profile; ?>
    <?php if (is_user_logged_in()) : ?>
    <div class="img" data-key="profile"><?php echo get_avatar( get_current_user_id(), 64 ); ?></div>
    <?php endif; ?>

Ainsi, le résultat final ressemblerait à ceci:

enter image description here

Maintenant, comment puis-je cibler spécifiquement un titre d'élément de menu?

MODIFIER:

Donc, je me suis basé sur ce qui suit et je ne sais pas pourquoi cela ne fonctionne pas.

function nav_replace_wpse_189788($item_output, $item, $args) {
 //var_dump($item_output, $item);
 if( $args->theme_location == 'primary' ){
  return $items;

   if ('royal_profile_menu_title' == $item->title) {
    global $my_profile;

    if (is_user_logged_in()) { 
      return '<div class="img" data-key="profile">'.get_avatar( get_current_user_id(), 64 ).'</div>';
        }
    }
  }
   return $item_output;
 }
 add_filter('walker_nav_menu_start_el','nav_replace_wpse_189788',10,2);

Voici ma logique. Commencez par cibler le menu "primaire", puis recherchez le titre de l'élément "royal_profile_menu_title", puis remplacez le titre du mot par le résultat.

(Le titre de mon menu est "royal_profile_menu_title": image ci-dessous) enter image description here

Tout

1
steve Kim

Ceci est relativement facile à faire en utilisant le filtre walker_nav_menu_start_el (sans tout ce que PHP tag spam):

function nav_replace_wpse_189788($item_output, $item) {
  //   var_dump($item_output, $item);
  if ('Profile' == $item->title) {
    global $my_profile; // no idea what this does?
    if (is_user_logged_in()) { 
      return '<div class="img" data-key="profile">'.get_avatar( get_current_user_id(), 64 ).'</div>';
    }
  }
  return $item_output;
}
add_filter('walker_nav_menu_start_el','nav_replace_wpse_189788',10,2);

Remarque: je devais modifier votre code pour return une chaîne, pas echo une. Vous devrez peut-être modifier la condition if. Décommentez la var_dump() pour voir avec quoi vous devez travailler.

5
s_ha_dum

Presonally, je voudrais utiliser une solution de contournement CSS. Dans l’administration du menu, vous pouvez ajouter une classe CSS à un élément de menu (si le champ n’est pas affiché, vous pouvez le trouver dans les Options d’écran), par exemple, "profil-lien".

Et puis vous pouvez ajouter quelque chose comme ceci à votre modèle HEAD section:

<?php
$avatar = get_avatar_url( get_current_user_id(), array('size' => 64) ); // from WP 4.2
$image_url = $avatar['url'];
?>

<style type="text/css">
.menu li.profile-link { background-image: url(<?php echo $image_url ?>); /* + another CSS*/  }
.menu li.profile-link span { display: none; }
</style>

Et ajoutez à vos options wp_nav_menu fonction 'link_before' => '<span>', 'link_after' => '</span>'.

Pas testé, mais ça devrait faire l'affaire.

1
Marek