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).
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:
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)
Tout
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.
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.