Modificare gli URL degli elementi del menu

12 mar 2014, 17:47:04
Visualizzazioni: 18.1K
Voti: 2

Ho creato un sito web a pagina singola e utilizzo solo anchor (#) per gli elementi del menu principale.

Ora devo includere una seconda pagina nel sito e mantenere lo stesso menu.

Sto usando il tema Roots. Sto costruendo il menu con:

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

Ma come posso cambiare gli URL degli elementi da, ad esempio, #contact a mywebsite.com.br/#contact solo su questa seconda pagina?

2
Commenti

Per favore mostra del codice. Come stai costruendo i tuoi link? Manualmente? Usando una funzione personalizzata? Usando wp_nav_menu?

gdaniel gdaniel
12 mar 2014 17:54:45

Prima di tutto, sto usando il tema roots. Poi, sto costruendo il menu usando wp_nav_menu(array('theme_location' => 'primary_navigation'));

marcelo2605 marcelo2605
12 mar 2014 17:56:33
Tutte le risposte alla domanda 3
3

Nel tuo template puoi verificare se ti trovi nella front-page o meno e quindi visualizzare un menu diverso.

Ad esempio:

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

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

}else{

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

}

Dovresti anche registrare una seconda posizione del menu nel file functions.php (se non è già stato fatto).

Per registrare una nuova posizione del menu:

function register_my_menus() {

    register_nav_menus(array( 
        'secondary-location' => __('Posizione Secondaria'),
    ));

}

add_action( 'init', 'register_my_menus' );

Lo svantaggio è che dovresti gestire due menu nel backend. Questo potrebbe essere un problema se il menu cambia spesso, perché dovresti aggiornare due menu.

In alternativa, potresti filtrare il wp_nav_menu e modificare l'URL prima che il menu venga stampato. Ad esempio, questo codice andrebbe nel file 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');

Il codice sopra filtra wp_nav_menu_object. Aggiunge l'URL completo se non ti trovi nella front-page del sito web. Altrimenti restituisce semplicemente il menu regolare. Utilizzando questo metodo non dovresti creare un secondo menu nell'amministrazione.

12 mar 2014 18:05:18
Commenti

Grazie. Quindi, usando wp_nav_menu non posso aggiungere una stringa all'URL?

marcelo2605 marcelo2605
12 mar 2014 18:41:38

Ho appena aggiornato la mia risposta. Puoi usare un filtro per modificare l'URL prima che venga stampato.

gdaniel gdaniel
12 mar 2014 18:43:17

È molto utile, anche per le mie esigenze completamente diverse, grazie @gdaniel!

physalis physalis
25 nov 2014 00:27:42
0

Se il tuo menu contiene link personalizzati ad ancore E link a pagine (ad esempio a quella seconda pagina, home, imprint o qualsiasi altra) la funzione change_menu di gdaniels interromperà quei link alle pagine quando non sei nella pagina principale. Questo è il problema che boywonder stava riscontrando poiché la funzione 'change_menu' antepone l'URL del sito a tutti i link del menu. Ma con la funzione 'lb_menu_anchors' di boywonder finirai con refresh della pagina nella homepage quando cambi tra i link ad ancoraggio. Per evitare ciò, lb_menu_anchors deve essere eseguita solo quando la pagina corrente non è la homepage:

function lb_menu_anchors($items, $args) {
// la pagina corrente NON è la homepage?
  if(!is_front_page()){
    // scorri gli oggetti del menu (i link)
    foreach ($items as $key => $item) {
        // controlla se il link inizia con '#'
        if ($item->object == 'custom' && substr($item->url, 0, 1) == '#') {
            // se sì, anteponi site_url al link
            $item->url = site_url() . $item->url ;
        }
    }
    // restituisci i link modificati
    return $items;
  }
  else {
    // restituisci i link non modificati se la pagina corrente È la homepage
    return $items;
  }
  }

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

Grazie per tutti i vostri pensieri

6 mar 2018 16:25:02
0

Stavo utilizzando una versione modificata della soluzione di gdaniel, ma recentemente ho riscontrato un problema in cui, quando si utilizzano link personalizzati nel menu per puntare a link esterni, l'URL del sito veniva preposto al link esterno.

Il codice qui sotto dovrebbe funzionare se hai bisogno di modificare i link ad ancoraggio e non modificare i link esterni.

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);

Tutti i crediti vanno a laubsterboy e faye: https://laubsterboy.com/blog/2014/09/wordpress-menu-anchor/ https://laubsterboy.com/blog/2014/09/wordpress-menu-anchor/#comment-35170

1 giu 2017 12:00:33