Multiple Search Results Pages within One WordPress Site

On a client site I’m currently developing in WordPress, I’m having to add the client’s existing articles to the new site, as well as his old blog. I wanted them to both exist as Posts, but to be separated within the site. Most of that was straightforward – by assigning articles and blog posts to their own Post Categories, I was able to only include, say, Posts from ‘Category #1′ on the Articles page, and Posts from ‘Category #2′ on the blog page.

Where I came a little unstuck was the Search feature in WordPress. No matter which page I searched from, I would be given the relevant results from all Posts, not just the Category in question. So here’s how I went about fixing that…

Firstly, I added the following Search form to my sidebar:

<form method="get" id="searchform" action="<?php bloginfo('home'); ?>/">
<input type="text" name="s" id="s" value="Search" size="18" maxlength="96" onblur="if(this.value=='') this.value='Search';" onfocus="if(this.value=='Search') this.value='';" />
<input type="hidden" name="site_section" value="blog" />
<input type="submit" value="Search" class="hidden" id="searchsubmit" />
</form>

Note the third line, with the hidden input (that’s the third line if you paste that into a code editor, not what shows up here). On the sidebar for the blog, I gave that input field a value of ‘blog’; for the sidebar on the articles page, I gave it a value of — yeah, you guessed it — ‘articles’.

Then, create a file named ’search.php’, and paste the following into it:

<?php
/* Template Name: Search Results */
$search_refer = $_GET["site_section"];
if ($search_refer == 'blog') { load_template(TEMPLATEPATH . '/blog-index.php'); }
elseif ($search_refer == 'articles') { load_template(TEMPLATEPATH . '/articles-index.php'); }; ?>

The important part here is, again, the third line. This looks up the value of the hidden input on the search form, and assigns it to the variable, ‘$search_refer’.

After that, the if statement decides, depending on the value of ‘$search_refer’, which template to load. The load_template function will ensure that the referenced page is shown, displaying the results from the search term.

One last thing you’ll need to do is edit the Post index. In this example, I’ll show you what was added to ‘blog-index.php’. This goes directly before The Loop.

<?php if( is_search() ) :
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
query_posts("s=$s&paged=$paged&cat=4");
endif; ?>

For now, I’m going to admit ignorance about the second line (and if you can explain it, then please, go ahead!). I don’t fully understand what purpose it serves — I pieced this solution together from a few places — but the third line (what’s with that?!) has the important bit you need to pay attention to.

On this client’s site, the ‘Blog’ Category has an ID number of ‘4′; that’s why the ‘query_posts’ function has ‘cat=4′ at the end — this only includes Posts from that Category in the output.

On the ‘articles-index.php’ template page, ‘query_posts’ has ‘cat=3′, to only show ‘Articles’ Posts. Fairly straightforward, right?

In this particular example (and I thought it best to show it as closely to my working version as is clear), I’ve sent the different results to different template pages because those templates differ to a large degree. However, if your search results templates for the different sections are identical (or nearly), then you could skip out the ’search.php’ file, and this to your index file:

<?php $search_refer = $_GET["site_section"];
if( is_search() ) :
$paged = (get_query_var('paged')) ? get_query_var('paged') : 1;
if ($search_refer == 'blog') { query_posts("s=$s&paged=$paged&cat=4"); }
elseif ($search_refer == 'articles') { query_posts("s=$s&paged=$paged&cat=3"); };
endif; ?>

That should do the whole lot after the search form in one step! If you’ve come up with a more elegant solution to this, or know a more efficient way to implement this solution, then please leave a comment — we all benefit from sharing tips like these!

Comments on Multiple Search Results Pages within One WordPress Site

Rob MacKay

Great post dude! :)

Bookmarked – coz I know this is gonna come up!

Posted by Rob MacKay (1 comments) on 14th May, 2009 at 10:35 am.

xinfo

nice stuff i am looking for search result to index in search engine

Posted by xinfo (1 comments) on 5th June, 2009 at 3:57 pm.

Rob Barrett

Cheers guys, I hope it comes in handy for you both.

Posted by Rob Barrett (45 comments) on 5th June, 2009 at 5:11 pm.

Glowtouch Technologies

Rob, this is awesome. Great piece of knowledge. Keep up the good work dude. I liked the way you explained this…

Thanks!

Posted by Glowtouch Technologies (1 comments) on 19th June, 2009 at 6:59 am.

Rob Barrett

Thanks for getting in touch, I’m glad you found it easy to understand!

Posted by Rob Barrett (45 comments) on 7th July, 2009 at 2:03 pm.

Mehdi

Great article, very clear. I’ve been looking for this all over…
Keep up the good work !

Posted by Mehdi (1 comments) on 10th August, 2009 at 8:11 pm.

Maor B.

Seems like a great solution. Bookmarked, since like Rob, I also know it’s gonna come soon…
Thanks

Posted by Maor B. (1 comments) on 1st September, 2009 at 1:58 am.

Jasa Pembuatan web

Wow…that’s great tips! i will try it,thanks rob!

Posted by Jasa Pembuatan web (1 comments) on 8th November, 2009 at 3:57 pm.

Hazel

Nice tips, really helpful. thanks a lot!

Posted by Hazel (1 comments) on 18th January, 2010 at 7:45 am.

Trackbacks for Multiple Search Results Pages within One WordPress Site

Leave a Comment





Rob Barrett Introduction