• Вопрос без рабочей ссылки на проблему считается риторическим. Без ссылки и скриншота - провокацией!
  • Темы озаглавленные с маленькой буквы или капсом удаляются без предупреждения!

Фильтрация товаров по произвольным полям и категориям

Webram

Новичок
#1
Есть плагин ACF, в нем произвольные поля, в которых информация о объектах(товарах).
Некоторые из этих полей должны участвовать в фильтрации: Станция метро, Вместимость и Тип площадки, а так же карта со всеми метками.
Так же есть фильтр(написанный фрилансером, с которым нет связи), но все данные полей отображаются разом не зависимо от категории.

Как сделать так, чтобы данные из произвольных полей выводились только для текущей категории(в качестве которой будут города)?
С выводом меток на карте я разобрался...

Вот код фильтра целиком:
Код:
// Фильтр записей  -  обработчик
add_action( 'pre_get_posts', 'acf_field_filter' );
function acf_field_filter($query){
    if ( !is_admin() AND is_archive() AND $query->is_main_query()){
        
        // для таксономий
        if( isset( $_POST['categoryfilter'] )){
           $args['tax_query'] = array(
               array(
                   'taxonomy' => 'category',
                   'field' => 'id',
                   'terms' => $_POST['categoryfilter']
               )
           );
        }
        if(isset($_POST['metro_repeater']) AND $_POST['metro_repeater']!=1){
            $meta_query[] = array(
                'relation'=>'AND',
                'key'     => 'halls_metro_repeater_$_halls_metro_stations',
                'value'   => "{$_POST['metro_repeater']}",
                'compare' => '=',
            );
            $query->set(
              'meta_query',
              $meta_query
            );
        }
        if(isset($_POST['halls_repeater']) AND $_POST['halls_repeater']!=1){
            $meta_query[] = array(
                'relation'=>'AND',
                'key'     => 'halls_repeater_$_halls_bulk',
                'value'   => "{$_POST['halls_repeater']}",
                'compare' => '=',
            );
            $query->set(
              'meta_query',
              $meta_query
            );
        }
        if(isset($_POST['hall_types']) AND $_POST['hall_types']!=1){
            $meta_query[] = array(
                'relation'=>'AND',
                'key'     => 'halls_repeater_$_halls_types',
                'value'   => "{$_POST['hall_types']}",
                'compare' => '=',
            );
            $query->set(
              'meta_query',
              $meta_query
            );
        }
    }
}

function metro_where( $where ) {
 if(!is_admin() AND is_archive()){   
    $where = str_replace("meta_key = 'halls_metro_repeater_$", "meta_key LIKE 'halls_metro_repeater_%", $where);
    $where = str_replace("meta_key = 'halls_repeater_\$_halls_bulk'", "meta_key LIKE 'halls_repeater_%_halls_bulk'", $where);
    
    $where = str_replace("meta_key = 'halls_repeater_\$_halls_types'", "meta_key LIKE 'halls_repeater_%_halls_types'", $where);
    if(isset($_POST['halls_repeater']) AND $_POST['halls_repeater']!=1){
        preg_match_all("/halls_bulk\' AND (.*)\.meta_value/", $where, $bulk);
        preg_match_all("/halls_types\' AND (.*)\.meta_value/", $where, $matches);
        
        $where = str_replace("AND {$matches[1][0]}.meta_value = '{$_POST['hall_types']}' )", "AND {$matches[1][0]}.meta_value LIKE '%{$_POST['hall_types']}%' ) AND REPLACE({$bulk[1][0]}.meta_key, '_halls_bulk', '')=REPLACE({$matches[1][0]}.meta_key, '_halls_types', '') ", $where);
        
    }else{
        $where = str_replace("meta_value = '{$_POST['hall_types']}'", "meta_value LIKE '%{$_POST['hall_types']}%'", $where);
    }
    //var_dump($where);
 }   
    return $where;
}

add_filter('posts_where', 'metro_where');

// форма фильтра
function filter_widget(){
    global $wpdb;
    $products = $wpdb->get_results("SELECT * FROM `ev_posts` WHERE `post_type`='product' AND `post_status`='publish'");
    $stations = array();
    $bulks = array();
    $types = array();
    foreach($products as $product){
        $metro_repeater = get_field('halls_metro_repeater', $product->ID);
        if($metro_repeater AND is_array($metro_repeater)){
            foreach($metro_repeater as $item){
                if(!in_array($item['halls_metro_stations'], $stations)){
                    $stations[] = $item['halls_metro_stations'];
                }
            }
        }
        
    $halls_repeater = get_field('halls_repeater', $product->ID);
    if($halls_repeater AND is_array($halls_repeater)){
    foreach($halls_repeater as $halls){
        if(!in_array($halls['halls_bulk'], $bulks)){
            $bulks[] = intval($halls['halls_bulk']);
        }
        
        if(strlen($halls['halls_types'])>0){
            if(!in_array($halls['halls_types'], $types)){
                $types[] = $halls['halls_types'];
            }
        }else if(is_array($halls['halls_types']) AND count($halls['halls_types'])>0){
            foreach($halls['halls_types'] as $item){
                if(strlen($item)>0 AND !in_array($item, $types)){
                    $types[] = $item;
                }
            }
        }
    }
    }
}                                     
                                
echo '
<form class="halls-filter" method="post">
<div class="halls-filter-filter-row">
<div class="halls-filter-filter-box mw-100">
<label>Станция метро</label>
<select name="metro_repeater">
<option value="1">Любая</option>
';
$option_value = isset($_POST['metro_repeater'])?$_POST['metro_repeater']:1;
foreach($stations as $item){
    echo '<option value="'.$item.'"'.($option_value==$item?' selected="selected"':'').'>'.$item.'</option>';
}
echo '
</select>
</div>
<div class="halls-filter-filter-box mw-100">
<label>Вместимость</label>
<select name="halls_repeater">
<option value="1">Любая</option>
';
$option_value = isset($_POST['halls_repeater'])?$_POST['halls_repeater']:1;

sort($bulks);
foreach($bulks as $item){
    echo '<option value="'.$item.'"'.($option_value==$item?' selected="selected"':'').'>'.$item.'</option>';
}
echo '
</select>
</div>
<div class="halls-filter-filter-box mw-100">
<label>Тип площадки</label>
<select name="hall_types">
<option value="1">Любой</option>
';
$option_value = isset($_POST['hall_types'])?$_POST['hall_types']:1;
foreach($types as $item){
    echo '<option value="'.$item.'"'.($option_value==$item?' selected="selected"':'').'>'.$item.'</option>';
}
echo '
</select>
</div>
<div class="halls-filter-filter-box mw-100">
                                <button type="submit" class="big-button">Подобрать!</button>
                            </div>
</div></form>';
}
 
Сверху Снизу