web-dev-qa-db-fra.com

Modifier l'URL des éléments de menu

Je crée un site Web d'une seule page et n'utilise que des ancres (#) sur les éléments du menu principal.

Maintenant, je dois inclure une deuxième page sur le site Web et conserver le même menu.

J'utilise le thème des racines. Ensuite, je construis un menu en utilisant:

wp_nav_menu(array('theme_location' => 'primary_navigation')); 

Mais comment modifier l’url des éléments, par exemple, #contact en mywebsite.com.br/#contact uniquement sur cette deuxième page?

1
marcelo2605

Dans votre modèle, vous pouvez vérifier si vous êtes sur la page d'accueil ou non, puis afficher un menu différent.

Par exemple:

if(is_front_page() || is_home()){

 wp_nav_menu(array('theme_location' => 'primary_navigation'));

}else{

 wp_nav_menu(array('theme_location' => 'secondary_navigation'));

}

Vous devez également enregistrer un deuxième emplacement de menu dans le fichier functions.php (si cela n'a pas encore été fait).

Pour enregistrer un nouvel emplacement de menu:

function register_my_menus() {

    register_nav_menus(array( 
        'secondary-location' => __('Secondary Location'),
    ));

}

add_action( 'init', 'register_my_menus' );

L'inconvénient est que vous devrez gérer deux menus dans le backend. Cela pourrait poser problème si le menu change souvent, car il faudrait mettre à jour deux menus.

Au lieu de cela, vous pouvez filtrer le wp_nav_menu et modifier l’URL avant l’impression du menu. Par exemple, cela irait dans functions.php

function change_menu($items){

if(!is_front_page()){

  foreach($items as $item){


    $item->url = get_bloginfo("url") . "/" .  $item->url;


  }

}

  return $items;

}

add_filter('wp_nav_menu_objects', 'change_menu');

le code ci-dessus filtre l'objet wp_nav_menu_object. Il ajoute l'URL complète si vous n'êtes pas sur la première page du site. Sinon, il ne fait que retourner au menu habituel. En utilisant cette méthode, vous n’auriez pas à créer un deuxième menu dans l’administrateur.

3
gdaniel

Si votre menu contient des liens d'ancrage ET des liens de page personnalisés (par exemple, vers la deuxième page, la page d'accueil, l'impression ou quoi que ce soit d'autre), la fonction gdaniels change_menu rompra ces liens de page lorsque vous n'êtes pas sur la page d'accueil. C'est le problème rencontré par le garçon lorsque la fonction 'change_menu' ajoute le site-url à all menu-links. Mais avec la fonction 'lb_menu_anchors' de boywonders, vous vous retrouverez avec la page s'actualise sur la page de garde lors du passage d'un lien à un autre. Pour éviter cela, lb_menu_anchors ne doit être exécuté que lorsque la page en cours n'est pas la page de couverture :

function lb_menu_anchors($items, $args) {
// current page is NOT front page?
  if(!is_front_page()){
    // loop through menu-objects (the links)
    foreach ($items as $key => $item) {
        // check if link begins with '#'
        if ($item->object == 'custom' && substr($item->url, 0, 1) == '#') {
            // if so, prepend site_url to link
            $item->url = site_url() . $item->url ;
        }
    }
    // return edited links
    return $items;
  }
  else {
    // return unedited links if current page IS front page
    return $items;
  }
  }

add_filter('wp_nav_menu_objects', 'lb_menu_anchors', 10, 2);

Merci pour toutes tes pensées

1
klausduraditz

J'avais utilisé une version modifiée de la solution de gdaniel, mais je me suis récemment heurté à un problème suivant: lors de l'utilisation de liens de menu personnalisés pour diriger les éléments de menu vers des liens externes, l'URL du site était préfixée au lien externe.

Le code ci-dessous devrait fonctionner si vous devez modifier des liens d'ancrage et non des liens externes.

function lb_menu_anchors($items, $args) {
    foreach ($items as $key => $item) {
        if ($item->object == 'custom' && substr($item->url, 0, 1) == '#') {
            $item->url = site_url() . $item->url;
        }
    }

    return $items;
}
add_filter('wp_nav_menu_objects', 'lb_menu_anchors', 10, 2);

Tous les accessoires vont à laubsterboy et faye: https://laubsterboy.com/blog/2014/09/wordpress-menu-anchor/https://laubsterboy.com/blog/2014/09/wordpress- menu-anchor/# comment-35170

1
boywonder