This sliding doors CSS hack allows you to create sophisticated tabs for your navigation bar. Sadly, Wordpress core functions wp_list_pages() and wp_list_categories() don’t allow you to add the required span tag to use this technique.
We are going to see how to proceed in order to use sliding doors in our Wordpress theme.
Sliding doors, why?
There’s many articles available on the web about the sliding doors technique, so I’m not going to talk a lot about it. For people who don’t already know this famous hack, here’s a quick example.
Let’s build a typical navigation list:
<ul id="nav">
<li><a href="#">link n°1</a></li>
<li><a href="#">link n°2</a></li>
<li><a href="#">link n°3</a></li>
</ul>
If we apply, via CSS, background images to our links in order to make this menu prettier, we’ll quickly see a big problem: We must add a fixed width to the links, otherwise the image will be truncated if the link is too short, or the link will overflow the image if its width is too long.
That’s why sliding doors are very useful: We just have to add a span element inside the link, and then, in our CSS, assign a different background image to both the span element and the link.
<ul id="nav">
<li><a href="#"><span>link n°1</span></a></li>
<li><a href="#"><span>link n°2</span></a></li>
<li><a href="#"><span>link n°3</span></a></li>
</ul>
Our CSS should look like this:
#nav a, #nav a:visited {
display:block;
}
#nav a:hover, #nav a:active {
background:url(images/tab-right.jpg) no-repeat 100% 1px;
float:left;
}
#nav a span {
float:left;
display:block;
}
#nav a:hover span {
float:left;
display:block;
background: url(images/tab-left.jpg) no-repeat 0 1px;
}
Please note, as this is only an example, the CSS above isn’t complete and only shows how to apply the sliding doors hack.
You can see a live demo of a navigation menu which uses this technique on my blog here.

Using the sliding doors hack within Wordpress
I saw many blog posts where some users told you to modify Wordpress core in order to apply this technique. Personally, I never really liked this idea: First, the Wordpress core wasn’t made for being modified. And secondly, if you do, when you’ll upgrade your WP version, you’ll have to re-modify the core. Not user friendly at all!
Instead of this, let’s use a regular expression, by using the php preg_replace() function. We are going to get our pages (or categories) without displaying it, and passing it as a parameter to preg_replace(). The two remaining parameters will be, of course, our regular expression: The pattern we’re looking for, and this pattern’s replacement.
To create this menu, paste the following code instead of the wp_list_pages() (or wp_list_categories()) function in the header.php of your Wordpress theme.
To list your pages:
<ul id="nav">
<li><a href="<?php echo get_option('home'); ?>/"><span>Home</span></a></li>
<?php echo preg_replace('@\<li([^>]*)>\<a([^>]*)>(.*?)\<\/a>@i’, ‘<li$1><a$2><span>$3</span></a>’, wp_list_pages(’echo=0&orderby=name&exlude=181&title_li=&depth=1′)); ?>
</ul>
To list your categories:
<ul id="nav">
<li><a href="<?php echo get_option('home'); ?>/"><span>Home</span></a></li>
<?php echo preg_replace('@\<li([^>]*)>\<a([^>]*)>(.*?)\<\/a>@i’, ‘<li$1><a$2><span>$3</span></a>’, wp_list_categories(’echo=0&orderby=name&exlude=181&title_li=&depth=1′)); ?>
</ul>
Right now, your new menu is ready. You just have to make it sexy with CSS. Have fun! ![]()












Wednesday, July 2nd, 2008 at 2:21 am
thats it.. thanx.. been figure it out forever..
Wednesday, July 2nd, 2008 at 4:19 pm
You’re welcome
Monday, July 7th, 2008 at 12:22 am
Very nice code I’m impressed Jean-Baptiste.
Monday, July 7th, 2008 at 5:04 am
Thanks a lot, Hayes!
Thursday, July 10th, 2008 at 1:54 am
Sorry, I just get these errors with wordpress 2.5.1:
“Parse error: parse error, unexpected ‘)’, expecting ‘,’ or ‘;’”
Thursday, July 10th, 2008 at 2:03 am
I got it - just a silly thing: Your (or this blog) wrote “?” instead of “‘”. So now, everything is fine. thanks for your code.
Thursday, July 10th, 2008 at 9:15 am
@Ben: Glad you fixed your problem. Can you tell me where the “?” is? I need to correct that mistake asap so no-one will have this problem again.
Thursday, July 10th, 2008 at 1:16 pm
Sorry, it seems that the blog reformated the character. Some of the ‘ characters are italic for me - I replaced them with the original ‘ and it works for me.
best regards
ben
Thursday, July 10th, 2008 at 3:44 pm
Oh, ok. It’s a well known problem.
As Kyle said in another post, when you copy code from a blog, ALWAYS paste it on a plain text editor (Vi, emacs, Microsoft Notepad, TextEdit…) and then copy the code from the editor.
Friday, July 11th, 2008 at 1:49 am
I work with TYPO3, so I usually do that
But also in Editor they are different characters (maybe it works this time): ’ (italic) and ‘ (like it should be).
Friday, July 11th, 2008 at 1:51 am
Haha, when I cop now my entry before into the editor, the regular character is wrong also. Maybe also a problem with the font or something like that. But thanks for your help and the good code.
Thursday, July 17th, 2008 at 2:53 pm
Fantastic tutorial! I’ll make sure to blog about this later on.
Sunday, July 20th, 2008 at 9:48 am
Thanks a lot Patrick, I’m glad you liked the tutorial
Sunday, July 27th, 2008 at 9:40 am
Great trick there , thanks alot!
Sunday, July 27th, 2008 at 1:24 pm
Quick q from a newbie…we’re using Joomla for a site we’re building and want to use the sliding door technique for our front page…
Does your CSS hack work if we’re not using wordpress?
Thanks in advance.
Steve & Irv
Monday, July 28th, 2008 at 11:00 am
For sure, there’s a way to do the same thing in Joomla but I never tried. You should keep the regular expressions, and try if it works once adpted to Joomla.
I’ll be curious to know, so don’t hesitate to come back here and tell us about your experience!
Tuesday, August 12th, 2008 at 12:27 am
Hi………..
Oh! nice article. Please visit and enjoyed this article.
Thank you
CSS