Wordpress Multiple Category Search

by Niraj Chauhan   Last Updated July 11, 2019 18:08 PM

From few months I am digging into wordpress for multiple category search options, and finally came up with this.

I just found that wordpress allows multiple tags, which means that if in your URL you type this

http://yourblog.com/tag/tag1+tag2

then it will return all your posts with having tags, tag1 AND tag2

but if you type

http://yourblog.com/tag/tag1,tag2

then it will return all the posts having tag1 OR tag2

Same thing now works for categories also

http://yourblog.com/category/cat1+cat2 and http://yourblog.com/category/cat1,cat2

But this only works for category and tags, I am trying it for search option.

Till now I coded where this URL is working(which means it will search HTML only in the category id 114),

http://yourblog.com/?s=html&cat=114

In this URL, the comma separator works very well, but not the +

I mean to say

http://yourblog.com/?s=html&cat=114,115

works very well but

http://yourblog.com/?s=html&cat=114+115

doesn't works.

Can anyone help me in this? I really want this to work

Still awaiting



Answers 4


Try this: http://yourblog.com/?s=html&cat[]=114&cat[]=115

BTW, why don't you use a hook link pre_get_posts to filter your search? It would be much easier than tweaking the search URL.

Anh Tran
Anh Tran
August 31, 2011 01:31 AM

The problem is that in a url the '+' sign is equivalent to a space so that's how PHP sees it.

If you use an action on parse_request you can make this work like so:

add_action( 'parse_request', 'category_search_logic', 11 );
function category_search_logic( $query ) {

    if ( ! isset( $query->query_vars[ 'cat' ] ) )
        return $query;

    // split cat query on a space to get IDs separated by '+' in URL
    $cats = explode( ' ', $query->query_vars[ 'cat' ] );

    if ( count( $cats ) > 1 ) {
        unset( $query->query_vars[ 'cat' ] );
        $query->query_vars[ 'category__and' ] = $cats;
    }

    return $query;
}

The above will get category ids passed in with '+' in between them by splitting them on a space which is what PHP sees in the $_GET parameter.

If we have more than one item in the array it must be an 'and' style search so we can pass the array from splitting on the space into the 'category__and' query var which returns posts in all the specified categories.

sanchothefat
sanchothefat
October 31, 2011 10:54 AM

The solution suggested by @sanchothefat is OK, but leads to problems when pagination is used. For example, you have url like domain.com/?s=&cat=1+2. When you click on page 2, the URL become domain.com/?s=&cat=1+2 but redirect_canonical() defined in wp-includes/canonical.php tries to modify url to domain.com/?s&cat=12 which is not the same... I found easier to me to rewrite category_search_logic() rather investigate redirect_canonical() logic and apply additional filters to it.

This is my way to buypass the canonical logic:

function category_search_logic( $query ) {
    if ( ! isset( $_GET['categories'] ) )
        return $query;

    // split cat query on a space to get IDs separated by ',' in URL
    $cats = explode(',', $_GET['categories'] );

    if ( count( $cats ) > 1 ) {
        unset($_GET['categories']);
        $query->query_vars[ 'category__and' ] = $cats;
    }

    return $query;
}
stz184
stz184
January 21, 2014 07:31 AM

I magnify your work I have several categories and several tags Each category has a tag, but it has the categories that have two tags, the categories that have two tags is because it has the tags preference and these favorites should be shown at the top of the listing so the search should look like this: What category? + What's the tag? = The Result will show first by category, secondly show the tag who the tag prefers and then the rest of the tag without preference.

Michelle Oliveira
Michelle Oliveira
July 11, 2019 17:16 PM

Related Questions


Updated June 01, 2015 02:03 AM

Updated January 08, 2019 10:08 AM

Updated April 17, 2015 20:03 PM

Updated February 06, 2019 12:08 PM

Updated June 15, 2019 21:08 PM