WOOF [Решенный] - фильтрация (СКРЫВАЕМ ЛИШНИЕ АТРИБУТЫ)

И так, фильтр woof для woocommerce имеет несколько недоработок Фильтрация по категориям решается с помощью плагина woof for categories Но, некоторые атрибуты все равно отображаются, а так же при фильтрации в какой либо категории выдает ненужные варианты в атрибутах

К примеру, есть две категории, телефон и аксесуары, и там и там используется атрибут "БРЕНД", в таком случаях при фильтрации в обоих категориях будут отражены все бренды, даже если нет товаров таких брендов в этой категории Делюсь своим решением всех проблем при работе с woof

Для тех кто считает это костылем или говнокодом - у вас замечательный шанс оптимизировать данный скрипт, добро пожаловать. Пихаем это все дело в function.php темы и радуемся

Сохраняю для своих будущих проектов в виде этого вопроса на стаковерфлоу

    add_filter('woof_sort_terms_before_out', 'sort_category_terms_before_out', 50, 5);

 function sort_category_terms_before_out($terms) {
            $cats =  get_queried_object();

            $datas = $_GET;
            if (!empty($datas) AND is_array($datas)) {
                $tmp = array();
                foreach ($datas as $key => $value) {
                    if (!is_string($key) OR ! is_string($value)) {
                        continue;
                    }
                    if ($woof_text_urlencode) {
                        $tmp[WOOF_HELPER::escape($key)] = urlencode(WOOF_HELPER::escape($value));
                    } else {
                        $tmp[WOOF_HELPER::escape($key)] = WOOF_HELPER::escape($value);
                    }
                }
                $datas = $tmp;
            }

            $thisCat = get_term( strtok($datas["really_curr_tax"], '-'));

            if ($cats->slug != NULL){
                $query_args = array(
                    'status'    => 'publish',
                    'limit'     => -1,
                    'category'  => array( $cats->slug),
                );
                $data = array();
                foreach( wc_get_products($query_args) as $product ){
                    foreach( $product->get_attributes() as $taxonomy => $attribute ){
                            foreach ( $attribute->get_terms() as $term ){
                                $data[$taxonomy][$term->term_id] = $term->name;
                            }
                    }
                }

                if (!is_array($terms)) {
                    $terms = array();
                }

                foreach ($terms as $key_term => $one_term) {
                    if(!isset($data[$one_term["taxonomy"]][$one_term["term_id"]])){
                        unset($terms[$key_term]);
                    }
                }

                } else {
                    $query_args = array(
                        'status'    => 'publish',
                        'limit'     => -1,
                        'visibility'     => 'catalog',
                        'post_type'      => 'product',
                    );
                    if(isset($_GET['s'])){
                        $query_args['s'] = $_GET['s'];
                    }
                    if(isset($thisCat->slug)){
                        $query_args['category'] = $thisCat->slug;
                    }


                    $data = array();
                    foreach( wc_get_products($query_args) as $product ){
                        foreach( $product->get_attributes() as $taxonomy => $attribute ){
                                foreach ( $attribute->get_terms() as $term ){
                                    $data[$taxonomy][$term->term_id] = $term->name;
                                }
                        }
                    }

                    if (!is_array($terms)) {
                        $terms = array();
                    }

                    foreach ($terms as $key_term => $one_term) {
                        if(!isset($data[$one_term["taxonomy"]][$one_term["term_id"]])){
                            unset($terms[$key_term]);
                        }
                    }

                }
            return $terms;
        }

Ответы (1 шт):

Автор решения: fck_web
  add_filter('woof_sort_terms_before_out', 'sort_category_terms_before_out', 50, 5);

 function sort_category_terms_before_out($terms) {
            $cats =  get_queried_object();

            $datas = $_GET;
            if (!empty($datas) AND is_array($datas)) {
                $tmp = array();
                foreach ($datas as $key => $value) {
                    if (!is_string($key) OR ! is_string($value)) {
                        continue;
                    }
                    if ($woof_text_urlencode) {
                        $tmp[WOOF_HELPER::escape($key)] = urlencode(WOOF_HELPER::escape($value));
                    } else {
                        $tmp[WOOF_HELPER::escape($key)] = WOOF_HELPER::escape($value);
                    }
                }
                $datas = $tmp;
            }

            $thisCat = get_term( strtok($datas["really_curr_tax"], '-'));

            if ($cats->slug != NULL){
                $query_args = array(
                    'status'    => 'publish',
                    'limit'     => -1,
                    'category'  => array( $cats->slug),
                );
                $data = array();
                foreach( wc_get_products($query_args) as $product ){
                    foreach( $product->get_attributes() as $taxonomy => $attribute ){
                            foreach ( $attribute->get_terms() as $term ){
                                $data[$taxonomy][$term->term_id] = $term->name;
                            }
                    }
                }

                if (!is_array($terms)) {
                    $terms = array();
                }

                foreach ($terms as $key_term => $one_term) {
                    if(!isset($data[$one_term["taxonomy"]][$one_term["term_id"]])){
                        unset($terms[$key_term]);
                    }
                }

                } else {
                    $query_args = array(
                        'status'    => 'publish',
                        'limit'     => -1,
                        'visibility'     => 'catalog',
                        'post_type'      => 'product',
                    );
                    if(isset($_GET['s'])){
                        $query_args['s'] = $_GET['s'];
                    }
                    if(isset($thisCat->slug)){
                        $query_args['category'] = $thisCat->slug;
                    }


                    $data = array();
                    foreach( wc_get_products($query_args) as $product ){
                        foreach( $product->get_attributes() as $taxonomy => $attribute ){
                                foreach ( $attribute->get_terms() as $term ){
                                    $data[$taxonomy][$term->term_id] = $term->name;
                                }
                        }
                    }

                    if (!is_array($terms)) {
                        $terms = array();
                    }

                    foreach ($terms as $key_term => $one_term) {
                        if(!isset($data[$one_term["taxonomy"]][$one_term["term_id"]])){
                            unset($terms[$key_term]);
                        }
                    }

                }
            return $terms;
        }
→ Ссылка