TransWikia.com

How to search for categories and/or tags?

WordPress Development Asked on December 12, 2021

I have a search function on my blog. If I enter a value, say ‘fruits’ in the search box and it doesn’t match in any of the posts but it is the name of a category in the blog then I want the posts that belong to that category to be displayed.

Is it possible to amend the search functionality so it covers the searching of all categories and possibly tags in the blog too?

Many thanks.

2 Answers

Here's a function that will search for any categories (or other taxonomies) that match the given string and then returns all the posts that are included in that category.

function searchTermPosts(String $query) {
    // First get the categories / taxonomies that have a 'name like' the query
    $terms = get_terms([ "name__like" => $query ]);

    // Now convert to a taxonomy query we can use in WP_Query
    $tax_query = array_map(function ($term) {
        return [
            "taxonomy" => $term->taxonomy,
            "terms" => $term->term_taxonomy_id
        ];
    }, $terms);

    // Add an "OR" clause to find posts in all categories
    $tax_query["relation"] = "OR";

    // Now do the query
    $results = new WP_Query([
        "tax_query" => $tax_query
    ]);

    // Return both results and the terms, as well as term names
    return [
        "results" => $results,
        "terms" => $terms,
        "term_names" => array_map(fn ($t) => $t->name, $terms)
    ];
}

And then use it like this:

$query = searchTermPosts("fruits");
$count = $query['results']->found_posts;
$cats = implode(",", $query['term_names']);

echo "Found $count results in these categories: $cats";
echo "<ul>";

while ($query['results']->have_posts()) {
    $query['results']->the_post();
    echo '<li><a href="' . get_the_permalink() . '">';
    the_title();
    echo '</a></li>';
}

echo "</ul>";

Answered by Husky on December 12, 2021

// Above the loop on your search result template:
if ( is_search() ) // Are we on a search result page?
{
    global $wp_query, $query_string;
    // now modify/filter the query (result)
    query_posts( $query_string . 'cat=1&tag=apples+apples' );
}

Answered by kaiser on December 12, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP