[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

x
?
Solved

How to implement a conditional menu destination in WordPress

Posted on 2016-07-24
9
Medium Priority
?
101 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: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say 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 2000 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

New feature and membership benefit!

New feature! Upgrade and increase expert visibility of your issues with Priority Questions.

Question has a verified solution.

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

I want to start by talking about the use of plug-ins for WordPress. I started a web-site for a company I was working for a few years ago; I had extremely basic knowledge of HTML. I am a Graphic Designer by trade so I invited the opportunity as a cha…
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…
This video teaches users how to migrate an existing Wordpress website to a new domain.
The purpose of this video is to demonstrate how to integrate Mailchimp with WordPress, by placing a Mailchimp signup form on a WordPress Page or Post. This will be demonstrated using a Windows 8 PC. Mailchimp will be used. Log into your Mailchi…
Suggested Courses
Course of the Month19 days, 11 hours left to enroll

872 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