Editing Magento’s Top Links (The Better Way)

You might need to read the post about using a local.xml file before this post makes much sense.

We offer all our clients a completely customized design from scratch, which means changing anything – including those annoying defaulted top links.  This post will show you how to edit your top links (without editing core layout files which may change when you update Magento) by utilizing a local.xml file. You can even add your own custom links without touching any template files! [NOTE: This specific example assumes you are using the blank theme. Layout handles may differ from theme to theme.]

ADDITION: Check out the blog post about editing Magento’s footer links

In local.xml:

If you absolutely cannot find a way to customize your top links using these methods, you can edit the /template/page/template/links.phtml

Recent Posts
Showing 71 comments
  • bluescrubbie
    Reply

    thanks! BTW, there’s a missing close bracket on

  • bluescrubbie
    Reply

    Sadly, this code chokes on wishlist for me under 1.4.0.0. Any ideas?
    a:5:{i:0;s:278:”Warning: call_user_func_array() [function.call-user-func-array]: First argument is expected to be a valid callback, ‘Mage_Wishlist_Helper_Data::’ was given in \app\code\core\Mage\Core\Model\Layout.php on line 326″;i:1;s:1934:”#0 \app\code\core\Mage\Core\Model\Layout.php(326): mageCoreErrorHandler(2, ‘call_user_func_…’, ‘C:\web\root\…’, 326, Array)

  • kkirchner
    Reply

    Thanks bluescrubbie,

    It looks like in 1.4 they changed the wishlist.xml – just replace:

    with:

    Because of the “remove” global effect, if you want to re-add the wishlist link somewhere else, you need to create a custom block. I just copy it from wishlist.xml, change the name attribute of the block, and place it in my local.xml file.

  • Postie
    Reply

    Thank you, this is extremely helpfull

  • Russ
    Reply

    Thanks for the info on removing links; I’m trying to add a link to a cms page and to the homepage using the method above, but the links generated are not parsed in any way eg. home just passes “home” as the complete anchor href element href=”home” which is incorrect.

    The same is true for my CMS page, which breaks these links from pages where the base url is wrong, like the customer account page; the links suddenly become href=”customer/account/home” and “customer/account/customer-service” for example.

    Any thoughts on how to make Magento parse the page names and insert fully qualified URI’s as it does for ‘helper’ links like the customer login & basket links?

  • kkirchner
    Reply

    @Russ – thanks for that question.

    I dug into the app/code/core/Mage/Page/Block/Template/Links.php file. You can use the full url in your ‘url’ tag or add a param to the addLink method. The latter is shown here – in your local.xml:

  • mRko
    Reply

    Wow both this is awesome! I have been fighting magento for going on a year. hopefully with help from this we will be able to streamline our magento development

  • Vincenzo
    Reply

    I am trying to do the same thing, however I cant seem to get it to work atall without crashing. I want to add 2 links to the top link of the site that direct to a CMS page. What files do I modify?

    thanks in advance :)

  • ReginaldBull
    Reply

    Thanks for the great manual!
    My problem is with multilanguage shops.
    Can you say me how to translate, for example, About us to “&Uml;ber uns”.

  • Vier
    Reply

    Thanks for this, very helpful!

  • Jerry Crick
    Reply

    Hi

    Using 1.4, the customer logged on/out code doesn’t work.

    Ay ideas gratefully received.

    Thanks

    Jerry

  • Russ
    Reply

    Thanks kkirchner,

    I didn’t want to hard-code links as we run about a dozen sites, But I did a little digging myself and came up with this code for local.xml which uses a url helper to generate the correct URL for the homepage of the current site.

  • kkirchner
    Reply

    Wow, Russ! That looks great. I’m definitely going to check this out – that could be super helpful!

  • kkirchner
    Reply

    @Jerry – I tested the logged in and logged out on 1.4 with the blank theme and it worked for me… double check and make sure they’re after the </default> tag.

  • James Wyson
    Reply

    Also, kindly change the local.xml posted above to remove the log out url when the customer is logged out and to remove the log in url when the customer is logged in.

  • James Wyson
    Reply

    There is an error in the local.xml posted. The beforeText tag was not properly closed.

    Kindly change to:

  • ehansen
    Reply

    @James Wyson – Can you wrap your code examples in pre tags? See the example code above the comment box for details.

  • kkirchner
    Reply

    @James Wyson – Thank you for catching that error. I’ve properly closed the beforeText tag.

    Also, the log in link only shows when the user is logged out. And conversely, the log out link only shows when the user is logged in. So you have to wrap the remove login link in the customer_logged_out tag and the remove logout link in the customer_logged_in tag. The code shown above for local.xml is correct.

  • Gary
    Reply

    Very much apprecaited – very helpful!

  • Vier
    Reply

    Sorry for the amount of spam, the code and pre tags didn’t work for me :(

    Hi, I’m trying to edit the customer_account_navigation block to remove the My Tags and My Product Reviews links but I can’t make it. This is what I’ve tried so far in local.xml:

    <customer_account>
    <reference name="customer_account_navigation">
    <remove name="tags"/>
    </reference>
    </customer_account>

    Also,

    <action method="removeItem"><name>tags</name><path>tag/customer/</path><label>My Tags</label></action>
    <action method="unsetChild"><name>tags</name></action>
    <action method="removeLinkByUrl" module="tag"><url>http://www.localhost.com/magento/index.php/tag/customer/</url></action&gt;
    <action method="removeLinkByPath" module="tag"><name>tags</name><path>tag/customer/</path></action>

    Do you have any ideas? Thanks for the help!

  • kkirchner
    Reply

    @Vier,

    Both Tags and Reviews are Magento core modules which you can disable in the admin. Once you disable them, the links will no longer show up on your customer account list of links.

    Under System > Configuration > Advanced (bottom of left sidebar) > Disable Module Output. Select Disabled for Mage_Review and Mage_Tag.

  • kkirchner
    Reply

    Another option – you can copy the removeLinkByUrl method in app/code/core/Mage/Page/Block/Template/Links.php and paste it in a custom module that extends the Mage_Customer_Block_Account_Navigation class in app/code/core/Mage/Customer/Block/Account/Navigation.php. If you’re going to go that far, you might as well add a custom helper to get the tag and review path with your baseUrl. Check out this comment.

  • Vier
    Reply

    @kkirchner,

    I knew abou the easy way, but I was just wondering if it could be done the other way round 😛 Thanks for your time!

  • Brandon
    Reply

    New to Magento development here. Is there an easy way to edit the text of My WishList and My Account this way? I want to edit My Wishlist to simply say “Wishlist”. I would like to edit My Account to say “Sign In” (only when a user isn’t currently signed in).

  • ehansen
    Reply

    @Brandon – The simplest solution for making changes like that is to use the Translate Inline tool. You can turn on this tool on the System > Configuration > Developer page.

  • Brandon
    Reply

    @ehansen,
    Thanks for the tip. I’ll give that a shot and see how it goes.

  • yasmine
    Reply

    I wanna know where i should place the code showing above …Thanks for help

  • kkirchner
    Reply

    @Yasmine – The code goes in a local.xml file. To learn about where to put the local.xml file, take a look at our blog post here.

    Thanks!

  • Alessandro Ronchi
    Reply

    Hi,
    pay attention when you specify a “false” value: leave the tag empty (ie: <prepare/>) or use 0 as false (ie: <prepare>0</prepare>) otherwise you won’t get what you expect.

    Thank you for your help.
    Sincerely, Alessandro

  • Alessandro Ronchi
    Reply

    Hi,
    pay attention when you specify a “false” value: leave the tag empty (ie: ) or use 0 as false (ie: 0) otherwise you won’t get what you expect.

    Thank you for your help.
    Sincerely, Alessandro

  • Deko Web
    Reply

    Was an expression of thanks really useful.

  • Lego
    Reply

    Thanks, couldn’t quite get those darn links removed with the other solutions. This one finally seemed to work.

  • vishal lakhani
    Reply

    HI I WANT TO remove totally menu and add new html as topnew.phtml i have done like this in local.xml

    its removing top.phtml but i cant add topnew.pthml Please help me…

    Waiting for reply

  • vishal lakhani
    Reply

    HI I WANT TO remove totally menu and add new html as topnew.phtml i have done like this in local.xml

    its removing top.phtml but i cant add topnew.pthml Please help me…Can anyone??

    Waiting for reply

  • Mark
    Reply

    Bravo! The top links were doing my head in… it’s nice to have them in one place! Thanks for the info.

  • Support Your Sound
    Reply

    Thanks, I’ve been struggling with this for a while! Top menu links now edited!

  • Jef Gunion
    Reply

    Thanks for these great alternatives!!

    I have a new question for you. I’m using a custom theme and a one column format throughout the entire site. My problem is that when users wish to click on “Add to Compare” for several products, the corresponding link to “Compare Products” is not available anywhere. I wanted that link to automatically be available in the top links discussed above. In the 2 or 3 column format, the “Compare Products” list and link is in the sidebar for immediate access.
    Any thoughts on this dilemma???

    Thanks again!!
    Jef

  • kkirchner
    Reply

    @Jef – Very interesting question. I dug in to catalog.xml and catalog/product/compare/sidebar.phtml to see what I could find.

    The button that opens the comparing pop-up box uses a php method to dynamically create the pop-up box. So you can probably use your own phtml file for it.

    In local.xml:

    Now create the comparelink.phtml file and modify the code from catalog/product/compare/sidebar.phtml:

    I’ve not tested this but it should work in theory… good luck!

  • Jef Gunion
    Reply

    Whoa! Very deep! I’ll give this implementation a try and let you know how it goes. Thank you very much for the response and idea!
    Jef

  • Jay
    Reply

    Such a good system is the old Magento, but for the fact that there is no decent way to manage those frickin menus! menu items should be pulled from the database as proper menu items, that are linked to “menus” which are also stored in the database, then, only once that is working OK should they add in the ability to override (via XML) full menus, ir single menu items. I think that is a good balance between “developer” friendly, and “commercial self preservation”. I.e. only savvy developers can work it out, apart from the people that make money at Magento – I believe this is their business model in the big picture, I dont blame them either :)

  • oserk
    Reply

    Great reading!

    Makes magento to customize way simpler! I’m trying to add front page to my navigation, but it just dont work. I did managed to add it to top.links. Here is my code, magento 1.4.2.0

    <PRE>

    Home
    /
    Home
    true

    0

    class=”top-link-about-us”

    </PRE>

  • oserk
    Reply

    Home
    /
    Home
    true

    0

    class=”top-link-about-us”

  • alaba
    Reply

    great , it help me ,too. TKS. ( in ver.1.4 )

  • Mizpah
    Reply

    Heya kkircher,

    (firstly, apologies for the miss-post above, please delete!)

    Is there any additional magic to making this work with the category links instead of top.links ?

    I am trying the below in catalog.xml to start with prior to trying to moving it into local once its working (local I assume has an unset issue as it causes an exception!) ?

    <reference name=”top.menu”>
    <block type=”catalog/navigation” name=”catalog.topnav” template=”catalog/navigation/top.phtml”>
    <action method=”addLink” translate=”label title”>
    <label>Home Page</label>
    <url helper=”core/url/getHomeUrl”/>
    <title>Home Page</title>
    <prepare/>
    <urlParams/>
    <position>1</position>
    </block>
    </action>
    </block>
    </reference>

    I assumed the above would work (1.5.0.1, blank theme), but in effect nothing gets output. Suggestions welcome!

  • andy
    Reply

    running 1.4.2.0 and the wish code still breaks the site. any ideas? what am i doing wrong?

    Also trying to hard code adding a navigation link at top.phml. when I edited the code the main-container area is broke. Any help you can give is greatly appreciated.

    Thanks

  • Jameson Proctor
    Reply

    This an excellent tutorial. Thank you. I am trying to use this to add a link to the top.links that points to another domain. So far I have had no luck. No matter what I do, Magento just appends the link to the end of my base url.

    Any help would be greatly appreciated.

  • Jameson Proctor
    Reply

    @Jameson Proctor

    I figured it out <prepare>true</prepare> needs to be set to <prepare /> not <prepare>false</prepare>. For some reason, prepare to false is no different than setting it to true.

  • mau
    Reply

    Wishlist removal code does not work anymore with 1.5, I just deactivate it in control panel ´cause I won´t need it.

  • Calvin
    Reply

    Andy, I’m running 1.4.2.0 as well and this method (that I found another forum) for knocking out the wishlist worked for me:

    Comment out the following from frontend/default/yourtheme/layout/wishlist.xml. Just make sure your cache is disabled and such.

    <!–

    –>

    Really wish there was a less-complicated way to do all this…

  • Calvin
    Reply

    Er, the code didn’t show up, how do I post code 😛

Leave a Comment