Modificare gli URL degli elementi del menu
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?
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.

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

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

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

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
