Posted on

Adding a custom field filter in the search

Adding a custom field filter in a Relevanssi search takes a little bit of programming, because the filter needs to create a meta_query that Relevanssi understands.

Let’s assume we have some colour information in a custom field that’s called colour_field, and we want to use that to filter the search results. First, let’s add a dropdown in our search form:

<select name="colour">
    <option value="any">Any colour</option>
    <option value="red">Red</option>
    <option value="green">Green</option>
</select>

Then, we need to tell WordPress that we want to use a query variable called colour (the name here needs to match the name attribute of the select in the form):

add_filter('query_vars', 'rlv_add_qv');
function rlv_add_qv($qv) {
	$qv[] = 'colour';
	return $qv;
}

Then we need a function that reads in the query variable, formulates a meta_query and passes that to Relevanssi:

add_filter('relevanssi_modify_wp_query', 'rlv_add_meta_query');
function rlv_add_meta_query($query) {
	if (isset($query->query_vars['colour'])) {
		if (!empty($query->query_vars['colour'])) {
			$meta_query = array(
				array(
					'key' 		=> 'colour_field',
					'value'		=> $query->query_vars['colour'],
					'compare' 	=> '=',
				),
			);
			$query->set('meta_query', $meta_query);
		}
	}
	return $query;
}

If you need to have multiple meta fields in the same search, you must add them to the same meta_query – you can only have one. WP_Query documentation has a good example of what that looks like, so take a look at that if you need multiple custom fields.

29 comments Adding a custom field filter in the search

  1. Is necessary buy the premium version to do that? I try to use that code with no success with the free version. Thank you.

      1. Sorry, i think the example explains how to search by a dropdown box without using the input field. A missunderstanding.

  2. hi. i have i metadata named chkbox2 and there is a value again. i want to add this values to searching… but i cant add. how can i add ?

      1. i’m trying now. i looked my database. this plugin creating cache. very nice. but i want to ask a question again. is it recreate again cache after new posts…?

          1. very nice. i liked that. i’m trying but i cant activate custom post meta field. post_meta chkbox2 not indexing and again i want to fix it. because your addon is perfect.

          2. That’s the “Extra user field” option, for user fields. User fields are for user profiles, not for post meta. The “Custom fields to index” option is empty, you should have the custom field name there.

          3. rebuilding now. slow because db is big.and worked fine now. i’m realy idiot ๐Ÿ™‚ because i’m trying for 3 hours ๐Ÿ™‚

            thanks a lots.

  3. Is there a way to filter custom field results based on _GET parameters? Here’s what I’m trying to achieve:
    mysite.com/?s=keyword&mycustomfield=customvalue

    This should return posts that match the search keyword AND that have the custom field “mycustomfield” set to the value “customvalue”.

      1. I have something very similar to this running however it appears that the second (custom field) is only displaying results if a term in the search box also gives a result.

        I.E.
        If I have “/?s=&mycustomfield=customvalue” nothing will display.

        But if I have “/?s=keyword&mycustomfield=” I get appropriate results.

        I also get appropriate results with “/?s=keyword&mycustomfield=customvalue”

        Can you explain why this would be. My code matches what you have above + the swapout of $query->query_vars to $_GET

  4. Hi,
    I followed this steps but still the search results doesn’t match anything. Plus, the search template used is actually the “content.php” one. How can I tell the system to show results with a particular template?

  5. Love your Search plugin!!!

    So If I had 3x search filters for example:

    Any colour
    Red
    Green

    Any age
    infant
    Child

    Any Gender
    Boy
    Gril

    Then in functions.php
    Would the add_filters be separate?
    add_filter(‘query_vars’, ‘rlv_add_qv’);
    function rlv_add_qv($qv) {
    $qv[] = ‘colour’;
    return $qv;
    }
    add_filter(‘query_vars’, ‘rlv_add_qv’);
    function rlv_add_qv($qv) {
    $qv[] = ‘gender’;
    return $qv;
    }
    add_filter(‘query_vars’, ‘rlv_add_qv’);
    function rlv_add_qv($qv) {
    $qv[] = ‘age’;
    return $qv;
    }

    Would the function be separate or all in one (bit unsure on this bit if (isset($query->query_vars[‘colour’])) {
    if (!empty($query->query_vars[‘colour’])) { ? as it has the [colour] part.)

    add_filter(‘relevanssi_modify_wp_query’, ‘rlv_add_meta_query’);
    function rlv_add_meta_query($query) {
    if (isset($query->query_vars[‘colour’])) {
    if (!empty($query->query_vars[‘colour’])) {
    $meta_query = array(
    array(
    ‘key’ => ‘colour_field’,
    ‘value’ => $query->query_vars[‘colour’],
    ‘compare’ => ‘=’,
    ),
    array(
    ‘key’ => ‘gender_field’,
    ‘value’ => $query->query_vars[‘gender’],
    ‘compare’ => ‘=’,
    ),
    array(
    ‘key’ => ‘age_field’,
    ‘value’ => $query->query_vars[‘age’],
    ‘compare’ => ‘=’,
    ),
    );
    $query->set(‘meta_query’, $meta_query);
    }
    }
    return $query;
    }

    1. Making three meta query filters gets complicated. You have to add only those that are in the query, but no others. Create a meta_query array, then check for each query variable and if it exists in the $query->query_vars, add it to the meta_query, then add the meta_query only once to the $query.

  6. Hello.
    Thanks for the plugin.
    I have an “apart_room” field. I specify it in ‘key’, right? (‘key’ => ‘apart_room’,)
    If I select 3 in the search, in the address bar http://2u/?Color=3 and the search does not work (all posts are displayed).
    If Iโ€™m changing to http://2u/?S=3, then everything works and a post is displayed with which the “apart_room” field = 3
    I just started learning php. I do not understand something. Could you explain.
    Thank.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.