Modificarea URL-urilor elementelor de meniu în WordPress
Am creat un website single page și folosesc doar ancore (#) pentru elementele din meniul principal.
Acum, trebuie să adaug o a doua pagină pe website și să păstrez același meniu.
Folosesc tema Roots. Construiesc meniul folosind:
wp_nav_menu(array('theme_location' => 'primary_navigation'));
Cum pot schimba URL-urile elementelor din, de exemplu, #contact în mywebsite.com.br/#contact doar pe această a doua pagină?
În template-ul tău poți verifica dacă te afli pe pagina principală sau nu și apoi să afișezi un meniu diferit.
De exemplu:
if(is_front_page() || is_home()){
wp_nav_menu(array('theme_location' => 'primary_navigation'));
}else{
wp_nav_menu(array('theme_location' => 'secondary_navigation'));
}
De asemenea, va trebui să înregistrezi o a doua locație de meniu în fișierul functions.php (dacă nu a fost deja făcut).
Pentru a înregistra o nouă locație de meniu:
function register_my_menus() {
register_nav_menus(array(
'secondary-location' => __('Locație Secundară'),
));
}
add_action( 'init', 'register_my_menus' );
Dezavantajul este că va trebui să gestionezi două meniuri în backend. Acest lucru poate fi o problemă dacă meniul se schimbă des, deoarece va trebui să actualizezi două meniuri.
În schimb, poți filtra wp_nav_menu și să modifici URL-ul înainte ca meniul să fie afișat. De exemplu, acest cod ar fi plasat în 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');
Codul de mai sus filtrează wp_nav_menu_object. Acesta adaugă URL-ul complet dacă nu te afli pe pagina principală a site-ului. În caz contrar, returnează meniul obișnuit. Folosind această metodă, nu va trebui să creezi un al doilea meniu în admin.

Mulțumesc. Deci, folosind wp_nav_menu nu pot adăuga un șir de caractere la URL?

Tocmai am actualizat răspunsul meu. Poți folosi un filtru pentru a modifica URL-ul înainte de afișare.

Dacă meniul tău conține link-uri ancoră personalizate ȘI link-uri către pagini (de exemplu, către a doua pagină, acasă, imprimare sau orice altceva), funcția change_menu a lui gdaniels va strica acele link-uri către pagini atunci când nu te afli pe pagina principală. Aceasta este problema pe care a întâmpinat-o boywonder, deoarece funcția 'change_menu' adaugă URL-ul site-ului în fața tuturor link-urilor din meniu. Dar cu funcția lui boywonder 'lb_menu_anchors' vei ajunge să ai reîncărcări ale paginii principale când treci între link-urile ancoră. Pentru a evita acest lucru, lb_menu_anchors trebuie executată doar atunci când pagina curentă nu este pagina principală:
function lb_menu_anchors($items, $args) {
// pagina curentă NU este pagina principală?
if(!is_front_page()){
// parcurge obiectele meniului (link-urile)
foreach ($items as $key => $item) {
// verifică dacă link-ul începe cu '#'
if ($item->object == 'custom' && substr($item->url, 0, 1) == '#') {
// dacă da, adaugă site_url în fața link-ului
$item->url = site_url() . $item->url ;
}
}
// returnează link-urile modificate
return $items;
}
else {
// returnează link-urile nemodificate dacă pagina curentă ESTE pagina principală
return $items;
}
}
add_filter('wp_nav_menu_objects', 'lb_menu_anchors', 10, 2);
Mulțumesc pentru toate gândurile voastre

Am folosit o versiune modificată a soluției lui gdaniel, dar recent am întâmpinat o problemă în care, atunci când foloseam linkuri personalizate din meniu pentru a direcționa elementele către linkuri externe, URL-ul site-ului era adăugat în fața linkului extern.
Codul de mai jos ar trebui să funcționeze dacă doriți să modificați linkurile ancore fără a afecta linkurile externe.
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);
Toate creditele merg către laubsterboy și faye: https://laubsterboy.com/blog/2014/09/wordpress-menu-anchor/ https://laubsterboy.com/blog/2014/09/wordpress-menu-anchor/#comment-35170
