it-swarm.com.de

Ändern Sie die URL der Menüelemente

Ich erstelle eine einseitige Website und verwende nur Anker (#) für Hauptmenüelemente.

Jetzt muss ich der Website eine zweite Seite hinzufügen und das gleiche Menü beibehalten.

Ich benutze Roots-Theme. Dann erstelle ich ein Menü mit:

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

Aber wie kann man die URL von Artikeln, zum Beispiel von #contact zu mywebsite.com.br/#contact, nur auf dieser zweiten Seite ändern?

1
marcelo2605

In Ihrer Vorlage können Sie überprüfen, ob Sie sich auf der Titelseite befinden oder nicht, und dann ein anderes Menü ausgeben.

Zum Beispiel:

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

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

}else{

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

}

Sie müssten auch einen zweiten Menüpunkt in der Datei functions.php registrieren (falls dies noch nicht geschehen ist).

So registrieren Sie einen neuen Menüpunkt:

function register_my_menus() {

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

}

add_action( 'init', 'register_my_menus' );

Der Nachteil ist, dass Sie zwei Menüs im Backend verwalten müssten. Dies könnte ein Problem sein, wenn sich das Menü häufig ändert, da Sie zwei Menüs aktualisieren müssten.

Stattdessen können Sie das wp_nav_menu filtern und die URL ändern, bevor das Menü gedruckt wird. Zum Beispiel würde dies in functions.php gehen

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

der obige Code filtert das wp_nav_menu_object. Die vollständige URL wird hinzugefügt, wenn Sie nicht auf der Startseite der Website sind. Andernfalls wird nur das normale Menü zurückgegeben. Mit dieser Methode müssten Sie kein zweites Menü im Admin erstellen.

3
gdaniel

Wenn Ihr Menü benutzerdefinierte Anker-Links UND Seiten-Links enthält (z. B. zu dieser zweiten Seite, Startseite, Impressum oder was auch immer), werden diese Seiten-Links durch die Funktion change_menu von gdaniels unterbrochen, wenn Sie nicht auf der Startseite sind. Das ist das Problem, auf das Boywonder stieß, als die Funktion 'change_menu' die Site-URL vor all menu-Links stellt. Aber mit der Boywonders-Funktion 'lb_menu_anchors' erhalten Sie am Ende Seitenaktualisierungen auf der Titelseite , wenn Sie zwischen Ankerlinks wechseln. Um dies zu vermeiden, müssen lb_menu_anchors nur ausgeführt werden, wenn die aktuelle Seite nicht die Startseite ist :

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

Danke für all deine Gedanken

1
klausduraditz

Ich hatte eine modifizierte Version von gdaniels Lösung verwendet, stieß jedoch kürzlich auf ein Problem, bei dem bei Verwendung benutzerdefinierter Menüverknüpfungen, um Menüelemente auf externe Links zu verweisen, die Site-URL vor den externen Link gestellt wurde.

Der folgende Code sollte funktionieren, wenn Sie Ankerlinks und keine externen Links ändern müssen.

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

Alle Requisiten gehen an Laubsterboy und Faye: https://laubsterboy.com/blog/2014/09/wordpress-menu-anchor/https://laubsterboy.com/blog/2014/09/wordpress- Menü-Anker/# comment-35170

1
boywonder