March 26, 2013

How to Add a Login/Logout Link to WordPress Menus

In my last post, I talked about how to add a custom meta box with a custom link to WordPress navigation menus. Several times, I mentioned how I needed to add a specific class to that link for WishList Login 2.0, so that I could find that link later and do stuff with it.

This is the part where we “do stuff” with that link. Specifically, we’re going to hook into the navigation menu before it displays, find our link and change its display based on the current user’s login status. Here’s what it looks like:

Adding a Login/Logout Link

So, if they’re logged in, we’re going to change it to a logout link. If they’re not logged, then we’ll leave it alone. Here’s the code to do that:

Here’s a run-down of what’s happening:

  1. We’re hooking in using the wp_nav_menu_objects filter.
  2. If the user is logged out, we just return the link as it is since by default it’s a login link.
  3. If the user is logged in, we then loop through the items and search the “classes” array element for our class.
  4. If the class exists in an item object, then we alter the “title” and “url” of that link and we unset our target class from the object.
  5. Then, we simply return the new objects array.

There’s definitely some customization and abstraction you could do with this:

1. Edit only the menu for a certain theme location. You’ll notice in the hook, I have 2 arguments being sent to the callback function, but I’m only actually using the first one. That’s to show you that there are actually 2 arguments available. The second one is the $args array which will contain information about that menu… including the theme location.

You would simply run a check on that array to see if the current theme location is the one you want to edit. This is especially important if you don’t want to touch widget menus at all… since, the Custom Menu widget uses the same back-end functionality as regular menus.

In our case, we wanted to hijack every instance of a link that contained our special class… even in a widget… so, we didn’t run any such check.

2. Abstract the target class. In our function, the target class we search for is hard-coded. In this instance, it’s fine because there’s no reason to have an option to change that class. You may have a scenario where it does make sense to allow users to change that class. In this case, you’d want to abstract that out by creating an admin option. You could then use get_option() to retrieve the target class and alter your menu accordingly.

So, that’s it. It’s a pretty straight-forward way to hook in and alter navigation menus how you’d like. And, IMHO, a hell of a lot easier than dealing with wp_nav_menu_items() and futzing with parsing HTML, and so on.

16 Comments on “How to Add a Login/Logout Link to WordPress Menus

March 26, 2013 at 8:36 pm

Yet ANOTHER awesome snippet–

Thanks again!

John Morris
March 26, 2013 at 11:28 pm

Thanks Nelson! Glad you liked it.

May 14, 2013 at 7:13 pm

The first part, adding a custom metabox, works great!
This part results in a full white screen for me.
I'm stumped.

John Morris
May 14, 2013 at 7:28 pm

That is probably because I ported this from the actual plugin and didn't really test the actual code much. And, I was missing a parentheses around if ( !class_exists() ). I've updated the gist. Give it a try now.

May 14, 2013 at 7:52 pm

Thanks John!

May 14, 2013 at 7:33 pm

And here I was looking for blank spaces in the code.
It works perfectly now.
Thanks John.

June 11, 2013 at 12:00 am

But WHERE do I put this code????? Every site on the Internet has stuff liek this, but noone actually tells you what to do with the code????

John Morris
June 11, 2013 at 1:32 am

In a plugin or your theme's functions.php file.

December 8, 2013 at 9:20 pm

This rocks! Many thanks for sharing.
Works a treat and I learnt some stuff too. All good.

Towobola Oluyemisi Folake
May 29, 2014 at 2:25 am

The part how to log out did not work for me, it just view my code out without display.

June 21, 2014 at 12:39 pm

To make your plugin support custom links in navigation menus, THIS is the place to start.
Along with the first part mentioned, of course!

Really John, thanks a million!

Saskia Beeldman
August 18, 2014 at 8:00 am

I am trying to add some custom menu items with dynamic links to the menu meta box, so it is easy to add an dynamic link for non coders.
Your code (in the former blog) was what I was looking for, but if I log in with another user it is displaying my link so it is not dynamic. I hoped this blog would solve my problem but is not doing anything and I can’t figure out why.

I am pulling my hear out by now and really don’t know where to look for a solution.

Could you help me please!

John Morris
August 18, 2014 at 8:04 am

@saskiabeeldman:disqus I’d need to see your code. If you can post it in something like pastebin I can take a look.

Saskia Beeldman
September 16, 2014 at 1:12 pm

Hi John, i am pretty new to Disqus and just saw your reply. I aspected to get an email when a comment was made, but i didn’t. Sorry for the late reply and thanks you where willing to help me. I got it working but not in the way I hoped, for now the issue is solved, thanks again!

John Morris
October 6, 2014 at 11:29 am

Yeah, does the same to me sometimes. I don’t see every comment either. At least it’s working now I guess.

January 20, 2019 at 10:29 pm

Why dont you make a plugin for this. it is super awsome


Leave a Reply

This site uses Akismet to reduce spam. Learn how your comment data is processed.