Modificarea URL-urilor elementelor de meniu în WordPress

12 mar. 2014, 17:47:04
Vizualizări: 18.1K
Voturi: 2

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ă?

2
Comentarii

Te rog să arăți niște cod. Cum construiești link-urile? Manual? Folosind o funcție personalizată? Folosind wp_nav_menu?

gdaniel gdaniel
12 mar. 2014 17:54:45

În primul rând, folosesc tema roots. Apoi, construiesc meniul folosind wp_nav_menu(array('theme_location' => 'primary_navigation'));

marcelo2605 marcelo2605
12 mar. 2014 17:56:33
Toate răspunsurile la întrebare 3
3

Î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.

12 mar. 2014 18:05:18
Comentarii

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

marcelo2605 marcelo2605
12 mar. 2014 18:41:38

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

gdaniel gdaniel
12 mar. 2014 18:43:17

Este extrem de util, chiar și pentru nevoile mele complet diferite, mulțumesc @gdaniel!

physalis physalis
25 nov. 2014 00:27:42
0

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

6 mar. 2018 16:25:02
0

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

1 iun. 2017 12:00:33