
Есть плагин 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>';
}