I create a single page website and use only anchors (#) on main menu items.

Now, I need to include a second page on the website and keep the same menu.

I’m using roots theme. Then, I’m building menu using:

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

But how to change items url from, for example, #contact to mywebsite.com.br/#contact only on this second page?

3 Answers
3

In your template you can check whether you’re on the front-page or not and then echo out a different menu.

For example:

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

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

}else{

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

}

You would also have to register a second menu locations in the functions.php file (if it hasn’t been done yet).

To register a new menu location:

function register_my_menus() {

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

}

add_action( 'init', 'register_my_menus' );

The downside is that you would have to manage two menus in the backend. That could be a problem if the menu changes often, because you would have to update two menus.

Instead, you could filter the wp_nav_menu and alter the url before the menu is printed. For example, this would go in functions.php

function change_menu($items){

if(!is_front_page()){

  foreach($items as $item){


    $item->url = get_bloginfo("url") . "https://wordpress.stackexchange.com/" .  $item->url;


  }

}

  return $items;

}

add_filter('wp_nav_menu_objects', 'change_menu');

the code above filters the wp_nav_menu_object. It adds the full url if you’re not on the front-page of the website. Otherwise it just returns the regular menu. Using this method you would not have to create a second menu in the admin.

Tags:

Leave a Reply

Your email address will not be published. Required fields are marked *