Solved

How to implement a conditional menu destination in WordPress

Posted on 2016-07-24
9
65 Views
Last Modified: 2016-07-29
I have a standard menu at the top of my WordPress pages and I'd like the "Home" tab to go one place if the user is logged in and to another place if the user is not logged in.

Thanks for any ideas.
0
Comment
Question by:steva
  • 5
  • 4
9 Comments
 
LVL 12

Expert Comment

by:William Nettmann
ID: 41728198
I have used this snippet to do something similar:
function add_login_logout_register_menu( $items, $args ) {
	if ( $args->theme_location != 'primary' ) {
		return $items;
	}
 
	if ( is_user_logged_in() ) {
		$items .= '<li><a href="' . wp_logout_url() . '">' . __( 'Log Out' ) . '</a></li>';
	} else {
		$items .= '<li><a href="' . wp_login_url() . '">' . __( 'Login In' ) . '</a></li>';
		$items .= '<li><a href="' . wp_registration_url() . '">' . __( 'Sign Up' ) . '</a></li>';
	}
 
	return $items;
}
 
add_filter( 'wp_nav_menu_items', 'add_login_logout_register_menu', 199, 2 );

Open in new window

You will need to add a "Home Page" link to a custom menu using the Appearance -> Menus option in WordPress, and use a placeholder instead of a URL, e.g. "#dynamic-link". You can then do a "str_replace" on the string in the "$items" string in the function instead of adding the login / logout link at the end.
0
 

Author Comment

by:steva
ID: 41732471
Hi William,

It seems that what I want to do in my filter function is find the "Home" li in $items and then change its href to the new "Home" if ( is_user_logged_in()).    Is it clear to you how to do that?

Thanks
0
 
LVL 12

Expert Comment

by:William Nettmann
ID: 41732505
Yes, it is clear.

Give the "Home" link a placeholder URL, e.g. "##home##"

In the filter:
$real_url = is_user_logged_in() ? "http://example.com/logged-in" : "http://example.com/logged-out";
$items = str_replace("##home##",$real_url,$items);
return $items;

Open in new window

Job done.
0
Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

 

Author Comment

by:steva
ID: 41733416
Thank you!  I looked hours last night for documentation on how to bust open the $items objects and work with them,  and finally I thought, "You, know?  I'll bet William could do this in about a minute!"

You're the best!

But it's still not clear to me exactly what you're doing.  The first parameter to str_replace is the thing to search for and you've got "##home##".   How does  that find the highlighted <li> element below and how does the $real_url filled in line 1 work as a replacement for that in the menu?

 Thanks

Steveli element to replace
0
 
LVL 12

Accepted Solution

by:
William Nettmann earned 500 total points
ID: 41733507
How are you configuring your menu?

I am guessing you are going to "Appearance - > Menus" and then adding pages to the menu.

Instead of adding the home page as a menu item, add  a Custom Link with "##home##" as the URL, and "Home" as the label.

The "str_replace" then finds the "##home##" in the $items string (it is not an object) and replaces it with $real_url.

If you can't add the Custom link, use "http://big-black-block.staging.wpengine.com/" instead of "##home##" in the str_replace.
0
 

Author Comment

by:steva
ID: 41734027
Got it!  I ended up with:
Dynamic Menu 1Dynamic Menu 2
Many thanks!
0
 

Author Closing Comment

by:steva
ID: 41734028
Thank you again.  A very useful tool to add to my toolbox!
0
 
LVL 12

Expert Comment

by:William Nettmann
ID: 41734488
Pleasure, Steve.

Looking at your screenshot above, you could have just added two links to the menu, one for logged in users and one for logged out users.
0
 

Author Comment

by:steva
ID: 41735096
Yes.  Put in two menu tabs, both with the "Home" navigation label, and have one go to "Homepage" and the other gp to "login_home."  Then click "Logged In Users" for one and "Logged Out Users" for the other in Display mode. Thanks for that.
0

Featured Post

Free Tool: Subnet Calculator

The subnet calculator helps you design networks by taking an IP address and network mask and returning information such as network, broadcast address, and host range.

One of a set of tools we're offering as a way of saying thank you for being a part of the community.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Permalink issue in Wordpress archive 1 49
Form Submit falis 6 38
Need Wordpress help to link from outside to image item number. 6 42
Split wordpress loop 35 56
WordPress has made it easy to create scalable sites based on their powerful CMS, but as great as WordPress is, there are some SEO issues that haven’t been addressed out of the box.  Fortunately these problems can be solved with a few plugins.  The f…
WordPress is constantly evolving, and with each evolution appears to get better and better.  One of the big drawbacks prior to version 3 was that there was no way to be able to set up a custom menu from the backend. The Old Way Adding menus is…
The purpose of this video is to demonstrate how to Import and export files in WordPress. This will be demonstrated using a Windows 8 PC. Go to your WordPress login page. This will look like the following: mywebsite.com/wp-login.php : Click on Too…
The purpose of this video is to demonstrate how to prevent comment spam on a WordPress Website. This will be demonstrated using a Windows 8 PC. Plugin Akismet will be used. Go to your WordPress login page. This will look like the following: myw…

839 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question