How to create frontend Post filter using meta query
I have created a post filter like the image below, but I have an issue with selecting multiple values from different fields. All the fields in the filter are custom fields. The thing is, in the admin panel, one post has a select field with city Telaviv and with a select field Property Type with a value Garden Apartment. The other post has a different city and Property Type as Ground Apartment. On the front end, if I choose from the City field -> Tel Aviv, I will get one post (Apartment) as it should. If I choose from the Property Type field -> Garden and Ground Apartments without choosing city, I will get two results as it should, but if I choose this two property type apartments together with the city Tel Aviv, I should get only one apartment, but I still get the two results.
The code: You might notice, that some of the field values are called by variables, I just called those fields earlier, but I didn't add that code here.
form class="select_form advance" id = "filterformid" name="filterform" action="" method="get"
fieldset
div id="stickySearch" style="background: transparent !important;"
div class="container"
ul class="nav nav-tabs" data-tabs="tabs" id="search-tab" style="background: transparent !important;"
li id="city" class="" name="city"
h4 id="apartment_city"?php echo $filter_city; ? span class="caret"/span/h4
ul class="dropdown-list city"
?php $array_property = get_field_object($filter_city_field);
$i=0;
foreach ($array_property['choices'] as $key = $value) {
$i++;
if (in_array($key, $_GET['city'])) {
echo 'liinput type="checkbox" id="city'. $i .'" class="uniquecity" name="city[]" value="'. $key .'" checkedlabel for="city'. $i .'"'.$value.'/label/li';
} else {
echo 'liinput type="checkbox" id="city'. $i .'" class="uniquecity" name="city[]" value="'. $key .'"label for="city'. $i .'"'.$value.'/label/li';
}
}
?
/ul
/li
li id="beds" class="" name="rooms"
h4 id="bedrooms"?php echo $filter_rooms; ? span class="caret"/span/h4
ul class="dropdown-list beds"
?php $array_property = get_field_object('field_58ab19f3aef68');
$i=0;
foreach ($array_property['choices'] as $key = $value) {
$i++;
if($key == $_GET['rooms'] !empty($_GET['rooms'])){
echo 'liinput type="checkbox" id="bed'. $i .'" class="uniqueBed" name="rooms" value="'. $key .'" checkedlabel for="bed'. $i .'"'.$value.'/label/li';
} else {
echo 'liinput type="checkbox" id="bed'. $i .'" class="uniqueBed" name="rooms" value="'. $key .'"label for="bed'. $i .'"'.$value.'/label/li';
}
}
?
/ul
/li
li id="floors" class="" name="floors"
h4 href="#" id="apartment_floors"?php echo $filter_floors; ? span class="caret"/span/h4
ul class="dropdown-list floors"
?php $array_property = get_field_object('field_58ab1a34aef69');
$i=0;
foreach ($array_property['choices'] as $key = $value) {
$i++;
if($key == $_GET['floors'] !empty($_GET['floors'])){
echo 'liinput type="checkbox" id="floors'. $i .'" class="uniquefloors" name="floors" value="'. $key .'" checkedlabel for="floors'. $i .'"'.$value.'/label/li';
} else {
echo 'liinput type="checkbox" id="floors'. $i .'" class="uniquefloors" name="floors" value="'. $key .'"label for="floors'. $i .'"'.$value.'/label/li';
}
}
?
/ul
/li
li id="property_exposure" name="property"
h4 href="#" id="exposure"?php echo $filter_exposure; ? span class="caret"/span/h4
ul class="dropdown-list exposure"
?php
$array_property = get_field_object($filter_exposure_field);
$i=0;
foreach ($array_property['choices'] as $key = $value) {
$i++;
if (in_array($key, $_GET['property'])) {
echo 'liinput type="checkbox" id="exposure' . $i. '" class="uniqueexposure" name="property[]" value="'.$key.'" checkedlabel for="exposure'. $i .'"'.$value.'/label';
} else {
echo 'liinput type="checkbox" id="exposure' . $i. '" class="uniqueexposure" name="property[]" value="'.$key.'"label for="exposure'. $i .'"'.$value.'/label';
} }
?
/ul
/li
li id="price"
h4 href="#"?php echo $filter_price; ? span class="caret"/span/h4
ul class="dropdown-list price"
li
?php if($_GET['price_from'] != '0' empty($_GET['price_from'])){ ?
?php echo $filter_from; ?
input placeholder="?php echo $filter_min; ?" type="text" name="price_from" id="min-price" value=""
?php } else { ?
input placeholder="?php echo $filter_min; ?" type="text" name="price_from" id="min-price" value="?php echo $_GET['price_from']; ?"
?php } ?/li
li
?php echo $filter_to; ?
?php if(empty($_GET['price_to'])){ ?
input placeholder="?php echo $filter_max; ?" type="text" name="price_to" id="max-price" value=""
?php } else { ?
input placeholder="?php echo $filter_max; ?" type="text" name="price_to" id="max-price" value="?php echo $_GET['price_to']; ?"
?php } ?/li
/li
/ul
/li
li id="property_type" class="" name="property_type"
h4 href="#" id="apartment_floors"?php echo $filter_property_type; ? span class="caret"/span/h4
ul class="dropdown-list property_type"
?php $array_property1 = get_field_object($filter_property_field);
$i=0;
foreach ($array_property1['choices'] as $key = $value) {
$i++;
if (in_array($key, $_GET['property_type'])) {
echo 'liinput type="checkbox" id="property'. $i . '" class="uniqueproperty" name="property_type[]" value="'. $key .'" checkedlabel for="property'. $i .'"'.$value.'/label/li';
} else {
echo 'liinput type="checkbox" id="property'. $i .'" class="uniqueproperty" name="property_type[]" value="'. $key .'"label for="property'. $i .'"'.$value.'/label/li';
}
}
?
/ul
/li
?php
$array_includes = array(array(
'label' = 'Parking',
'acf_name' = 'parking'
)
);
?
li id="parking" class="" name="parking"
?php foreach ($array_includes as $value) { ?
?php if( !empty($_GET['advance']) in_array($value['acf_name'], $_GET['advance']) ) { ?
h4 href="#" id="apartment_floors"?php echo $filter_parking; ? input type="checkbox" checked id="?php echo $value['acf_name'] ?" name="advance[]" value="?php echo $value['acf_name'] ?"/h4
?php } else { ?
h4 href="#" id="apartment_floors"?php echo $filter_parking; ? input type="checkbox" id="?php echo $value['acf_name'] ?" name="advance[]" value="?php echo $value['acf_name'] ?"/span/h4
?php } ?
?php } ?
/li
li id="meters1"
h4 href="#"?php echo $filter_meters; ? span class="caret"/span/h4
ul class="dropdown-list meters"
li
?php echo $filter_from; ?
?php if($_GET['meters_from'] != '0' empty($_GET['meters_from'])){ ?
input placeholder="?php echo $filter_min; ?" type="text" name="meters_from" id="min-meters" value=""
?php } else { ?
input placeholder="?php echo $filter_min; ?" type="text" name="meters_from" id="min-meters" value="?php echo $_GET['meters_from']; ?"
?php } ?/li
li
?php echo $filter_to;?
?php if(empty($_GET['meters_to'])){ ?
input placeholder="?php echo $filter_max; ?" type="text" name="meters_to" id="max-meters" value=""
?php } else { ?
input placeholder="?php echo $filter_max; ?" type="text" name="meters_to" id="max-meters" value="?php echo $_GET['meters_to']; ?"
?php } ?/li
/li
/ul
/li
?php $queried_object_id = $wp_query-queried_object-term_id; ?
input type="hidden" name="termid" value="Residential Sale" /
input type="submit" value="?php echo $filter_search; ?"
div class="advance_block"
?php $location = $_GET['termid'];
$args = array(
'post_type' = 'home_listings',
'posts_per_page' = -1,
'tax_query' = array(
array(
'taxonomy' = 'apartment_categories',
'field' = 'term_id',
'terms' = $queried_object_id
),
),
'meta_query' = array(
'relation' = 'AND'
)
);
if(!empty($_GET['advance'])) {
foreach($_GET['advance'] as $check) {
$args['meta_query'][] = array(
'key' = $check,
'value' = '1',
'compare' = 'LIKE'
);
}
}
foreach ($_GET['city'] as $city_single){
if(!empty($_GET['city']) $_GET['city'] != 'all') {
$args['meta_query'][] = array(
'key' = 'city',
'value' = $city_single,
'compare' = 'LIKE'
);
}
}
if(!empty($_GET['neighborhood']) $_GET['neighborhood'] != 'all') {
$args['meta_query'][] = array(
'key' = 'select_neighbourhood',
'value' = $_GET['neighborhood'],
'compare' = 'LIKE'
);
}
if ( !empty($_GET['price_from']) || !empty($_GET['price_to']) ) {
if($_GET['price_from'] != 'all'){
$from = (int)$_GET['price_from'];
} else {
$from = 0;
}
if($_GET['price_to'] != 'all'){
$to = (int)$_GET['price_to'];
} else {
$to = 0;
}
$args['meta_query'][] = array(
'key' = 'price',
'value' = array($from,$to),
'type' = 'numeric',
'compare' = 'BETWEEN'
);
}
if ( !empty($_GET['meters_from']) || !empty($_GET['meters_to']) ) {
if($_GET['meters_from'] != 'all'){
$from = (int)$_GET['meters_from'];
} else {
$from = 0;
}
if($_GET['meters_to'] != 'all'){
$to = (int)$_GET['meters_to'];
} else {
$to = 0;
}
$args['meta_query'][] = array(
'key' = 'square_feet',
'value' = array($from,$to),
'type' = 'numeric',
'compare' = 'BETWEEN'
);
}
foreach ($_GET['property'] as $exposure_single){
if(!empty($_GET['property']) $_GET['property'] != 'all') {
$args['meta_query'][] = array(
'key' = 'exposure',
'value' = $exposure_single,
'compare' = 'LIKE'
);
}
}
foreach ($_GET['property_type'] as $property_single){
if(!empty($_GET['property_type']) $_GET['property_type'] != 'all') {
$args['meta_query'][] = array(
'key' = 'property_type',
'value' = $property_single,
'compare' = 'LIKE'
);
}
}
if(!empty($_GET['rooms']) $_GET['rooms'] != 'all') {
$args['meta_query'][] = array(
'key' = 'number_of_rooms',
'value' = $_GET['rooms'],
'compare' = 'LIKE'
);
}
if(!empty($_GET['floors']) $_GET['floors'] != 'all') {
$args['meta_query'][] = array(
'key' = 'floors',
'value' = $_GET['floors'],
'compare' = 'LIKE'
);
}
// Keep query string vars intact
foreach ( $_GET as $key = $value ) {
if (
'rooms' === $key ||
'floors' === $key ||
'property_type' === $key ||
'submit' === $key ||
'advance' === $key ||
'city' === $key ||
'neighborhood' === $key ||
'property' === $key ||
'price_from' === $key ||
'price_to' === $key ||
'meters_from' === $key ||
'meters_to' === $key
) {
continue;
}
if ( is_array( $val ) ) {
foreach( $val as $innerVal ) {
echo 'input type="hidden" name="' . esc_attr( $key ) . '[]" value="' . esc_attr( $innerVal ) . '" /';
}
} else {
echo 'input type="hidden" name="' . esc_attr( $key ) . '" value="' . esc_attr( $val ) . '" /';
}
}
$wp_qunew WP_Query($args);
?
Topic request-filter wp-parse-args meta-query filters posts Wordpress
Category Web