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 шт):
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;
}