The free advanced custom WordPress search page generator will allow you to create advanced search filters using custom post types, custom taxonomies, and other fields.  It allows you to select your preferred form fields for filtering and will generate the code needed for your search page.  It also includes a search form in which you can opt to have dropdown menu options, text input for keywords, and checkboxes.

It will create the full code which you can use as a template for a custom page, such as recipe-search.php. It includes a embedded search form, a loop of results, and paging.

Standard arguments are automatically added; you can extend the wp_query to include complex filtering by visiting the WordPress WP Query Generator And Loop Builder.

If you use “get” parameters in your form (versus “post”), your url with query strings could look like this:
https://mydomain.com/recipe-search/?keyword=orange&cuisine=chinese&course=dinner

Include Keyword Search?
Creat a text field search box in your form
Taxonomy Select DropDown?
Create a select list dropdown using taxonomy name
Taxonomy Checkboxes?
Create a checkbox list using taxonomy name
Post Type
Create the post_type array (must add 'apostrophes' and separate using commas)
Narrow results based on the value of a custom field. Based on https://developer.wordpress.org/reference/classes/wp_query/#custom-field-post-meta-parameters

Coming Soon

Meta Key
Filter by custom field key, regardless of custom field value
Meta Value
Filter by custom field value, regardless of custom field key
Meta Compare
Uses operator for comparison=
!=
>
>=
<
<=
LIKE
NOT LIKE
IN
NOT IN
BETWEEN
NOT BETWEEN
NOT EXISTS
REGEXP
NOT REGEXP
RLIKE

Your Custom Search Page Code

<?php
// Custom Advanced Search Page Generator
// Generated by UseWordPress.com
get_header(); ?>
<?php
// Get the values found in URL querystring
$_GET = filter_input_array(INPUT_GET, FILTER_SANITIZE_STRING);
// Uncomment the line below to see what variables are being passed from the URL querystring
// var_dump($_GET);
?>
<div id="content" class="site-content" role="main">
<?php echo get_search_query() ?>
<form class="search" method="get" action="#" role="search" autocomplete="off" >
<input type="text" placeholder="keyword" name="keyword" value="<?php echo $keyword; ?>">
<?php
wp_dropdown_categories(array(
)
);
?>
<?php
$terms = get_terms(array(
'hide_empty' => false,
'hierarchical' => 1,
));
echo '<div class="checkboxlist">';
foreach( $terms as $term ){
$stat = '';
}
echo '</div>';
?>
<input type="submit" value="Search" class="form-submit">
</form>
<?php
$tax = array();
// Prepare taxonomy array for select form field
$tax[] = array(
'field' => 'name',
'terms' => array( $category_select_value ),
'operator' => 'IN',
);
} else {
//$tax[] = '';
}
// Prepare taxonomy array for checkbox form field
$tax[] = array(
'field' => 'name',
'operator' => 'IN',
);
} else {
//$tax[] = '';
}
// Protect against arbitrary paged values
$paged = ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1;
$use_wp_args = array(
'tax_query' => array(
'relation' => 'AND',
$tax
),
'date_query' => array(
array(
)
),
);
// Uncomment the line below to see what arguments are being passed via $use_wp_args
// var_dump($use_wp_args);
// The Query
$use_wp_query = new WP_Query( $use_wp_args );
echo '<div class="query-count">' . $use_wp_query->found_posts . ' Results Found</div>';
// The Loop
if ( $use_wp_query->have_posts() ) {
while ( $use_wp_query->have_posts() ) {
$use_wp_query->the_post();
// Display the results
}
// Pagination
?>
<div class="pagination">
<?php
echo paginate_links( array(
'format' => 'page/%#%',
'current' => $paged,
'total' => $use_wp_query->max_num_pages,
'mid_size' => 2,
'prev_text' => __('« Prev Page'),
'next_text' => __('Next Page »')
) );
?>
</div>
<?php
} else {
// no posts found
}
// Restore original Post Data
wp_reset_postdata();
?>
</div>
</div><!-- #content .site-content -->