WordPress

Jak stworzyć frontendowy filtr postów za pomocą metazapytania

  • 25 marca, 2017
  • 10 min read
Jak stworzyć frontendowy filtr postów za pomocą metazapytania


Stworzyłem filtr postów, taki jak na poniższym obrazku, ale mam problem z wybieraniem wielu wartości z różnych pól. Wszystkie pola w filtrze są polami niestandardowymi. Chodzi o to, że w panelu administracyjnym jeden post ma pole wyboru z miastem Telawiw i pole wyboru Typ nieruchomości z wartością Apartament z ogrodem. Drugi post ma inne miasto i typ nieruchomości jako mieszkanie na parterze. Na froncie, jeśli wybiorę z pola Miasto -> Tel Awiw, otrzymam jeden post (Mieszkanie), tak jak powinien. Jeśli wybiorę z pola Typ nieruchomości -> Mieszkania ogrodowo-naziemne bez wybierania miasta, otrzymam dwa wyniki tak jak powinienem, ale jeśli wybiorę te dwa apartamenty typu nieruchomości razem z miastem Tel Awiw, powinienem otrzymać tylko jedno mieszkanie, ale nadal otrzymuję dwa wyniki.

wprowadź tutaj opis obrazu

Kod: Możesz zauważyć, że niektóre wartości pól są wywoływane przez zmienne, po prostu wcześniej nazywałem te pola, ale nie dodałem tego kodu tutaj.

<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 '<li><input type="checkbox" id="city'. $i .'" class="uniquecity" name="city[]" value="'. $key .'" checked><label for="city'. $i .'">'.$value.'</label></li>';
        } else {
        echo '<li><input 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 '<li><input type="checkbox" id="bed'. $i .'" class="uniqueBed" name="rooms" value="'. $key .'" checked><label for="bed'. $i .'">'.$value.'</label></li>';
        } else {
        echo '<li><input 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 '<li><input type="checkbox" id="floors'. $i .'" class="uniquefloors" name="floors" value="'. $key .'" checked><label for="floors'. $i .'">'.$value.'</label></li>';
        } else {
        echo '<li><input 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 '<li><input type="checkbox" id="exposure' . $i. '" class="uniqueexposure" name="property[]" value="'.$key.'" checked><label for="exposure'. $i .'">'.$value.'</label>';
    } else {
    echo '<li><input 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 '<li><input type="checkbox" id="property'. $i . '" class="uniqueproperty" name="property_type[]" value="'. $key .'" checked><label for="property'. $i .'">'.$value.'</label></li>';
        } else {
        echo '<li><input 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);
                                ?>


Źródło

Warto przeczytać!  php — Wyświetla powrót punktu końcowego do pliku (file_put_contents())