Advanced WordPress Search Form with Keyword and Taxonomy Filtering

Create custom WordPress search form with keyword input and taxonomy filtering using shortcode and pre_get_posts hook. Build powerful search functionality with custom taxonomy dropdowns, modify search queries dynamically with tax_query, filter results by categories or custom taxonomies, implement get_terms for taxonomy options, and provide users with precise search results through combined keyword and category filtering for better content discovery.

Advanced WordPress Search with Taxonomy Filtering

Code Snippets Coding Blog Custom Code Snippets PHP Tech Tutorials Tutorials Wordpress WordPress Development WordPress Hacks WordPress Tips WP Best Practices

Advanced WordPress Search with Taxonomy Filtering Tutorial/Guide

Create a WordPress Search Form with Keyword & Taxonomy Support

Want more relevant search results on your WordPress site? Here’s how to add a powerful custom search form using a shortcode, allowing users to enter a keyword and filter by custom taxonomy — all with help from pre_get_posts.  

1. Shortcode to Display the Search Form

Use the following function in your theme/plugin to create a reusable shortcode:

function custom_search_form_shortcode() {
    ob_start();
    ?>
    <form role="search" method="get" class="search-form" action="<?php echo esc_url(home_url('/')); ?>">
        <div class="search-form-row">
            <label for="search-keyword">Search Keyword:</label>
            <input type="text" id="search-keyword" name="s" placeholder="Enter your keyword..." value="<?php echo get_search_query(); ?>" />
        </div>

        <div class="search-form-row">
            <label for="search-taxonomy">Filter by Custom Taxonomy:</label>
            <?php
            $taxonomy = 'your_custom_taxonomy'; // Change this to your taxonomy
            $terms = get_terms($taxonomy, array('hide_empty' => false));
            ?>
            <select name="custom_taxonomy" id="search-taxonomy">
                <option value="">All <?php echo $taxonomy; ?></option>
                <?php foreach ($terms as $term) : ?>
                    <option value="<?php echo esc_attr($term->slug); ?>" <?php selected($term->slug, get_query_var('custom_taxonomy')); ?>>
                        <?php echo esc_html($term->name); ?>
                    </option>
                <?php endforeach; ?>
            </select>
        </div>

        <div class="search-form-row">
            <button type="submit" class="search-submit">Search</button>
        </div>
    </form>
    <?php
    return ob_get_clean();
}
add_shortcode('custom_search_form', 'custom_search_form_shortcode');

2. Filter the Query with pre_get_posts

Update your query dynamically when someone uses the form:

function custom_search_pre_get_posts($query) {
    if (is_admin() || !$query->is_main_query()) return;

    if ($query->is_search()) {
        if (!empty($_GET['s'])) {
            $query->set('s', sanitize_text_field($_GET['s']));
        }

        if (!empty($_GET['custom_taxonomy'])) {
            $query->set('tax_query', array(
                array(
                    'taxonomy' => 'your_custom_taxonomy',
                    'field' => 'slug',
                    'terms' => sanitize_text_field($_GET['custom_taxonomy']),
                ),
            ));
        }
    }
}
add_action('pre_get_posts', 'custom_search_pre_get_posts');

3. Apply Styling (Optional)

.search-form {
    display: flex;
    flex-wrap: wrap;
    margin-top: 20px;
}
.search-form-row {
    margin-bottom: 12px;
}
.search-form label {
    font-weight: bold;
    display: block;
    margin-bottom: 5px;
}
.search-form input[type="text"],
.search-form select {
    padding: 8px;
    width: 250px;
}
.search-form .search-submit {
    padding: 8px 20px;
    background-color: #0073aa;
    color: #fff;
    border: none;
    cursor: pointer;
}
.search-form .search-submit:hover {
    background-color: #005a88;
}

4. Add the Shortcode to Pages

Simply insert:

[custom_search_form]

Useful Developer Links

   

๐Ÿ’ก Have a Coding Problem?

Search our archives or reach out to our team for solutions and expert advice.