d2321
5/15/2020 - 3:45 PM

Rest Filters

//require_once('lib/rest_trainings.php');

<?php


class d_rest_trainings
{
    public function __construct()
    {
        register_rest_route('wp/v2', '/d-trainings', array(
            'methods' => 'GET',
            'callback' => array($this, 'get_all_terms'),
         
        ));
    }

    public function get_all_terms($object)
    {
        $curLang = 'pl';

        $return = array();
        $return['d_params'] = $_GET;

        $posts_per_page = 9;

        // POSTS_START
        $args = array(
            'post_type' => 'szkolenia',
            // 'showposts' => -1,
            'posts_per_page' => -1,
        );
        if($_GET['term_id'] != 0) {
            $args['tax_query'] = array(
                array(
                    'taxonomy' => 'szkolenia_kategorie',
                    'field' => 'term_id', 
                    'terms' => (int)$_GET['term_id'],
                )
            );
        }   
        // if($_GET['type_select'] == 'lvl-sort' && $_GET['sort_type']) {
        if($_GET['sort_type']) {
            $args['orderby'] = 'meta_value_num';
            switch($_GET['sort_type']) {
                case 'sort-price-asc':
                    $args['meta_key'] = 'price';            
                    $args['order'] ='ASC';
                break;
                case 'sort-price-desc':
                    $args['meta_key'] = 'price';            
                    $args['order'] ='DESC';
                break;
                case 'sort-duration-asc':
                    $args['meta_key'] = 'duration';            
                    $args['order'] ='ASC';
                break;
                case 'sort-duration-desc':
                    $args['meta_key'] = 'duration';            
                    $args['order'] ='DESC';
                break;
            }
        }
        
        if($_GET['s'] != 'false') { //search
            $args['s'] = $_GET['s'];
        }
           
        //
        function genPag($total_posts, $current_page, $ppp) {
            $numpages = ceil($total_posts / $ppp); // e.g. ceil(33/10) = ceil(3.3) = 4

            if($numpages == 1) return null;

            //$current_page = '3';
            $loop = '';
            $prev = $current_page != 1 ? '<a class="prev page-numbers" href="#" data-page="'.($current_page - 1).'">«</a>' : null;
            $next = $current_page != $numpages ? '<a class="next page-numbers" href="#" data-page="'.($current_page + 1).'">»</a>' : null;

            for($i=1; $i <= $numpages; $i++) {
                if($i != $current_page) {
                    $loop .= '<a class="page-numbers" href="#" data-page="'.$i.'">'.$i.'</a>';
                }
                else $loop .= '<span aria-current="page" class="page-numbers current">'.$i.'</span>';
            }

            // <div> Total Posts '.$total_posts.'</div>
            // <div> Pages '.$numpages.'</div>

            return '
            <div class="col-md-12">

                <nav class="navigation pagination d_nav" role="navigation">
                <div class="nav-links">
                        '.$prev.'
                        '.$loop.'
                        '.$next.'
                </div>
                </nav>

            </div>
            ';
        }

        $prods = get_posts($args);
            
        if($prods) {
            include (locate_template( 'parts/catalog/card-data-for-item-global.php' )); //before loop    
            $prods_rendered = '';   
  
            $render_pag .= genPag(count($prods), $_GET['page'], $posts_per_page);
            //adding pagination 
            $args['offset'] = ($_GET['page'] - 1) * $posts_per_page;
            $args['posts_per_page'] = $posts_per_page;
            $prods = get_posts($args);

            foreach($prods as $prod) {
                $card_id = $prod->ID;
                $prods_rendered .= '<div class="col-md-4 col-card-prod">';
                    include (locate_template( 'parts/catalog/card-data-for-item.php' )); //in loop       
                    include (locate_template( 'parts/catalog/card-item.php' )); //outputs $render_card_item   
                $prods_rendered .= $render_card_item;
                $prods_rendered .= '</div>';
            }
            // $prods_rendered .= '<div style="width:100%;height:20px;background:red;"></div>'; 
            
            $return['posts'] = $prods;

            $prods_rendered .= $render_pag;
            $return['prods_rendered'] = $prods_rendered;
        } 
        else {
            $return['prods_rendered'] = '<div class="col-md-12 text-center animated fadeInUp"><div class="heading-3 heading-line-span"><span>Brak wyników</span></div></div>';
        }   
        // POSTS_END
      
        // RENDER TERMS START
        if($_GET['type'] === 'd_select' && $_GET['type_select'] != 'lvl-sort') {
            $o = get_terms(array('taxonomy' => 'szkolenia_kategorie', 'hide_empty' => false));
            $return['terms_all'] = $o;

            if($_GET['term_id'] != 0) {
                $parent_id = (int)$_GET['term_id'];
            } else $parent_id = 0;

            $selected_terms = array_filter($o, function ($elem) use ($parent_id){ 
                return $elem->parent === $parent_id;
            });
            $return['terms'] = $selected_terms;
            
            $selected_terms_rendered = '';
            foreach($selected_terms as $term) {
                $data_link = $term->term_id;
                $data_title = $term->name;
                include (locate_template( 'parts/catalog/filter-choose-elem.php' ));
                $selected_terms_rendered .= $loop_choose_elem;
            }
            $return['terms_rendered'] = $selected_terms_rendered;         
        }
        // RENDER TERMS END           

        return new WP_REST_Response($return, 200);
    }
}

add_action('rest_api_init', function () {
    $all_terms = new d_rest_trainings;
});

?>
jQuery(function ($) {
  // $(".d_disabled .mydropdown-header").click(function (e) {
  //   e.stopPropagation();
  //   alert("Najpierw wybierz filtr poprzedni");
  // });

  var d_endpoint = myVariables.my_url_site + "/wp-json/wp/v2/d-trainings/";

  function d_spinner() {
    $("#results_row_catalog").html("<div class='d_loader'>Loading...</div>");
  }
  function d_render_posts(posts) {
    $("#results_row_catalog").html(posts);
  }
  function d_show_results_row_catalog() {
    $("#results_row_catalog").css({ visibility: "visible" });
  }

  function d_enable(d_class) {
    $(".cat-select." + d_class).removeClass("d_disabled");
    d_clear(d_class);
  }
  function d_disable(d_class) {
    $(".cat-select." + d_class).addClass("d_disabled");
    d_clear(d_class);
  }
  function d_clear(d_class) {
    var elem = $(".cat-select." + d_class).find(".mydropdown-header span");
    elem.text(elem.attr("data-initial-badge"));
  }

  function d_load_select(d_class, terms) {
    $(".cat-select." + d_class + " .dropdown-menu").html(terms);
  }
  function d_renameChosenSelect(selectElem, textSelect) {
    selectElem.find(".mydropdown-header span").text(textSelect);
  }

  function d_init(term_id) {
    d_show_results_row_catalog();

    myVariables.szkol_term_id = term_id;
    myVariables.szkol_search = false;
    myVariables.szkol_page = 1;

    var data = {
      type: "d_init",
      term_id: myVariables.szkol_term_id,
      s: myVariables.szkol_search,
      page: myVariables.szkol_page,
    };

    d_spinner();
    jQuery.get(d_endpoint, data, function (response) {
      // console.log(response);
      d_render_posts(response.prods_rendered);
    });
  }

  $(document).on("click", ".cat-select .choose", function () {
    var selectLevel = $(this).parents(".cat-select").attr("data-class"); //lvl-1, lvl-2, lvl-3, lvl-sort

    var selectElem = $(this).parents(".cat-select");
    var textSelect = $(this).find("a").text();

    if (selectLevel !== "lvl-sort") {
      myVariables.szkol_term_id = $(this).attr("data-link");
      myVariables.szkol_search = false;
    }

    myVariables.szkol_page = 1;

    var data = {
      type: "d_select",
      type_select: selectLevel,
      term_id: myVariables.szkol_term_id,
      s: myVariables.szkol_search,
      page: myVariables.szkol_page,
    };

    if (selectLevel == "lvl-sort") {
      myVariables.sort_type = $(this).attr("data-link"); // sort:price-asc sort:price-desc sort:duration-asc sort:duration-desc
      data.sort_type = myVariables.sort_type;
    }

    d_spinner();
    jQuery.get(d_endpoint, data, function (response) {
      switch (selectLevel) {
        case "lvl-1":
          d_enable("lvl-2");
          d_load_select("lvl-2", response.terms_rendered);
          d_disable("lvl-3");
          d_renameChosenSelect(selectElem, textSelect);
          break;
        case "lvl-2":
          d_enable("lvl-3");
          d_load_select("lvl-3", response.terms_rendered);
          d_renameChosenSelect(selectElem, textSelect);
          break;
        case "lvl-3":
          d_renameChosenSelect(selectElem, textSelect);
          break;
        case "lvl-sort":
          // console.log(myVariables.szkol_term_id);
          break;
        default:
      }

      // console.log(response);
      d_render_posts(response.prods_rendered);
    });
  });

  if ($("#results_row_catalog").length) {
    d_init(myVariables.szkol_term_id);
  }

  //

  $('a[href="#collapse_search"]').click(function () {
    setTimeout(function () {
      $("#catalog_search_input").focus();
    }, 0);
  });
  //
  $("#catalog_search_form").submit(function (e) {
    e.preventDefault();

    myVariables.szkol_search = $("#catalog_search_input").val();
    myVariables.szkol_page = 1;

    var data = {
      // type: "d_search",
      term_id: 0,
      s: myVariables.szkol_search,
      page: myVariables.szkol_page,
    };

    d_spinner();
    jQuery.get(d_endpoint, data, function (response) {
      // console.log(response);
      d_render_posts(response.prods_rendered);
    });
  });

  $(document).on("click", ".d_nav.pagination a.page-numbers", function (e) {
    $("html, body").animate(
      { scrollTop: $(".data-cosm-filters-wr").offset().top - 110 },
      1200
    );
    e.preventDefault();

    myVariables.szkol_page = $(this).attr("data-page");
    var data = {
      // type: "d_search",
      term_id: myVariables.szkol_term_id,
      s: myVariables.szkol_search,
      page: myVariables.szkol_page,
      sort_type: myVariables.sort_type,
    };

    d_spinner();
    jQuery.get(d_endpoint, data, function (response) {
      // console.log(response);
      d_render_posts(response.prods_rendered);
    });
  });
});
<?php get_header(); ?>

<div class="container relative">

    <img class="el-moon-common" src="<?php echo $img_folder; ?>/el-moon-blue.svg" alt="">
    <img class="tr-elem-common" src="<?php echo $img_folder; ?>/tr-elem.png" alt="">

    <?php include (locate_template( 'parts/catalog/card-data-for-item-global.php' )); //before loop ?>
    
    <?php include (locate_template( 'parts/catalog/filters.php' )); ?>
    <div class="mb-7"></div>

    <div class="row" id="results_row_catalog">

        <?php if(have_posts()) { ?>
            
                <?php while(have_posts()) { the_post(); ?>
                    <?php $card_id = get_the_ID(); ?>
                    <div class="col-md-4 col-card-prod">                    
                        <?php include (locate_template( 'parts/catalog/card-data-for-item.php' )); //in loop ?>       
                        <?php include (locate_template( 'parts/catalog/card-item.php' )); //outputs $render_card_item ?>   
                        <?php echo $render_card_item; ?>    
                    </div>
                <?php } ?>
            
            <?php // _themename_the_posts_pagination(); ?>
        <?php } else { ?>
            <?php /*
                <div class="col-md-12"><p><?php echo esc_html__('Brak wyników', '_themename'); ?></p></div>
            */ ?>
        <?php } ?>

    </div><?php //row-results ?>
</div>
<?php get_footer(); ?>
.col-card-prod {
  margin-bottom: 30px;
}
.sub-card-prod {
  box-shadow: 0 0 6rem rgba(0, 0, 0, 0.1);
  border-radius: 0.5rem;
  background-image: linear-gradient(
    180deg,
    rgba(255, 255, 255, 0) 0%,
    #ffffff 100%
  );
  padding: 3rem 4rem 3rem 4rem;
  height: 100%;
  display: flex;
  flex-direction: column;

  .data-wr {
    border-top: 1px solid #e7e7e7;
    margin-top: 2rem;
    padding-top: 2rem;

    .data-info {
      display: flex;
      padding-bottom: 1rem;
      margin: 0 -15px;
      align-items: center;

      &.dur .label-wr {
        background-image: url(../images/ic-time.svg);
      }
      &.cer .label-wr {
        background-image: url(../images/ic-star.svg);
      }
      &.tim .label-wr {
        background-image: url(../images/ic-cal.svg);
      }
      .label-wr {
        background: no-repeat left center / 2rem;
        padding: 1rem 0 1rem 3rem;
      }

      .cl,
      .cr {
        padding: 0 15px;
      }
      .cl {
        width: 60%;
      }
      .cr {
        width: 40%;
      }

      .cl {
        color: $themecolor;
        font-size: 1.4rem;
      }
      .cr {
        color: $themecolor;
        font-size: 1.8rem;
        font-weight: 700;
      }
    }
  }
}

.data-price-wr {
  display: flex;
  justify-content: center;
  margin-top: 2rem;
  margin-bottom: 2rem;
}

//
.sub-cta {
  position: relative;
  border-radius: 0.5rem;
  border: 0.1rem solid $themecolor;
  background-color: #f9fbfe;
  padding: 6rem 5rem 5rem 5rem;

  .ic-wr {
    width: 5rem;
    height: 5rem;
    background-color: $themecolor;
    border-radius: 50%;
    position: absolute;
    left: 50%;
    top: 0;
    transform: translate(-50%, -50%);
    display: flex;
    justify-content: center;
    align-items: center;

    img {
      // border: 1px solid red;
      width: 2rem;
    }
  }
}
.data-cosm-filters-wr {
  display: flex;
  flex-wrap: wrap;
  align-items: center;

  > .cl {
    width: calc(100% - 10rem);
    padding-right: 2rem;
  }
  > .cr {
    width: 10rem;

    > a {
      color: $themecolor;
      display: inline-block;
      // border: 1px solid;
      background: url(../images/ic-search.svg) no-repeat right center / 2rem;
      padding: 1rem 3rem 1rem 0;
      font-weight: 700;
      font-size: 1.6rem;
      &:hover {
        color: $thirdcolor;
      }
    }
  }
}

#results_row_catalog {
  visibility: hidden;
}

.cat-select {
  &:before {
    content: "";
    width: 1.5rem;
    height: 1rem;
    position: absolute;
    background: url(../images/select.svg) no-repeat center / 100% 100%;
    right: 2rem;
    top: 50%;
    transform: translateY(-50%);
    pointer-events: none;
    transition: all 0.5s;
  }
  &:after {
    content: "";
    display: none;
    width: 100%;
    height: 100%;
    position: absolute;
    top: 0;
    left: 0;
    // background: rgba(red, 0.2);
  }

  border: 0.1rem solid #d9d9e2;
  border-radius: 0.3rem;

  &.show {
    border-color: $secondarycolor;
    &:before {
      transform: translateY(-50%) rotate(180deg);
    }
    .mydropdown-header {
      color: $themecolor;
    }
  }
  &.d_disabled {
    opacity: 0.5;
    .mydropdown-header {
      cursor: no-drop;
    }
    &:after {
      display: block;
    }
  }
  .mydropdown-header {
    cursor: pointer;
    color: #8282a1;
    font-size: 1.6rem;
    padding: 2rem;

    padding-right: 4rem;
    white-space: nowrap;
    overflow: hidden;
    text-overflow: ellipsis;

    // &:hover {
    //   color: $themecolor;
    // }
    span {
      // padding-bottom: 1rem;
      // border-bottom: 1px solid $themecolor;
    }
  }
  .dropdown-menu {
    max-height: 30rem;
    overflow: auto;

    margin-top: calc(0.5rem);
    border: 0;
    //display: block !important;
    font-size: 1.6rem;
    min-width: 100%;
    width: 100%;
    // min-width: 15rem;
    padding: 0;
    box-shadow: 0 1.4rem 2rem rgba(6, 6, 68, 0.07);
    border-radius: 0.4rem;
    border: 0.1rem solid #6961f9;
    background-color: #060644;

    .choose {
      a {
        //white-space: nowrap;
        display: block;
        transition: none;

        &:hover {
          background-color: rgba(105, 97, 249, 0.17);
        }

        padding: 2rem;

        color: #ffffff;
        font-size: 1.6rem;
        // font-weight: 600;
      }
      &:not(:last-child) {
        a {
          border-bottom: 0.1rem solid $secondarycolor;
        }
      }
    }
  }
}

#catalog_search_form {
  position: relative;
  input[type="image"] {
    position: absolute;
    right: 3rem;
    top: 50%;
    transform: translateY(-50%);
    width: 3rem;
  }

  margin-top: 30px;
  #catalog_search_input {
    transition: all 0.3s;
    width: 100%;
    border: 0.1rem solid #d9d9e2;
    border-radius: 0.3rem;
    color: #8282a1;
    font-size: 1.6rem;
    padding: 2rem;
    padding-right: 8rem;
    outline: none;

    &:focus {
      border-color: $secondarycolor;
    }
  }

  ::-webkit-input-placeholder {
    opacity: 1;
    color: #8282a1;
  }
  ::-moz-placeholder {
    opacity: 1;
    color: #8282a1;
  }
  :-ms-input-placeholder {
    opacity: 1;
    color: #8282a1;
  }
  :-moz-placeholder {
    opacity: 1;
    color: #8282a1;
  }
}
<?php global $img_folder; ?>

<div class="data-cosm-filters-wr">
    <div class="cl">
            <div class="row row-filters-cosm">
            <div class="col-6 col-md-3 col-filter-cosm">
                <?php 
                    $parent_terms = get_terms(array('parent' => 0, 'taxonomy' => 'szkolenia_kategorie', 'hide_empty' => false)); 
                    $data_choose = array();

                    if($parent_terms) {
                        for($i = 0;$i < count($parent_terms); $i++) {
                            $data_choose[$i]['data-link'] = $parent_terms[$i]->term_id;
                            $data_choose[$i]['title'] = $parent_terms[$i]->name;
                        }
                    }
                ?>
                <?php 
                    $string_wybierz = 'Wybierz kategorie';
                    echo d_render_dropdown($string_wybierz, $data_choose, 'lvl-1', null);
                ?>
            </div>
            <div class="col-6 col-md-3 col-filter-cosm">
                <?php 
                    $string_wybierz = 'Wybierz podkategorie';
                    $data_choose = array();
                    echo d_render_dropdown($string_wybierz, $data_choose, 'lvl-2', 'd_disabled');
                ?>
            </div>
            <div class="col-6 col-md-3 col-filter-cosm">
                <?php 
                    $string_wybierz = 'Wybierz temat';
                    $data_choose = array();
                    echo d_render_dropdown($string_wybierz, $data_choose, 'lvl-3', 'd_disabled');
                ?>
            </div>
            <div class="col-6 col-md-3 col-filter-cosm">
                <?php 
                    $string_wybierz = 'Sortowanie';
                    $data_choose = array(
                        array('data-link' => 'sort-price-asc', 'title' => 'Cena: od najniższej'),
                        array('data-link' => 'sort-price-desc', 'title' => 'Cena: od najwyższej'),
                        array('data-link' => 'sort-duration-asc', 'title' => 'Czas trwania: najkrótszy'),
                        array('data-link' => 'sort-duration-desc', 'title' => 'Czas trwania: najdłuższy'),
                    );
                    echo d_render_dropdown($string_wybierz, $data_choose, 'lvl-sort', '');
                ?>
            </div> 
        </div>
    </div>
    <div class="cr text-right">
        <a data-toggle="collapse" href="#collapse_search">Szukaj</a>
    </div>
</div>
        
<div id="collapse_search" class="collapse">
    <form id="catalog_search_form" action="">
        <input id="catalog_search_input" type="text" value="" placeholder="Wyszukaj szkolenie i naciśnij Enter">
        <input type="image" src="<?php echo $img_folder; ?>/ic-search-gray.svg" alt=""> 
    </form>
</div>
            
<?php $loop_choose_elem = '<div class="choose" data-link='.$data_link.'><a href="#/">'.$data_title.'</a></div>'; ?>