nipopadyuk
@nipopadyuk

Как в WordPress сделать фильтрацию произвольных записей по нескольким произвольным полям одновременно?

Приветствую.

Есть произвольный тип записей автомобили, в которых есть 4 параметра заданных в произвольных полях через ACF (марка, модель, тип, категория).
Нужно в режиме реального времени, фильтровать показ записей по всем заполненным полям.
Вот этот код только по одному одновременно фильтрацию делает, например, если я ввожу в первое поле Toyota, во второе начинаю вводить RAV, мне сначала выходит:
Марка ТС: VOLKSWAGEN
Модель ТС: 7HC (Transporter, Caravelle, Multivan)

А если ввожу Toyota RAV4, то уже выводит правильно:
Марка ТС: TOYOTA
Модель ТС: A2 - RAV4 (ACA20L-AZMNKW, ACA20L-AZPNKW, ACA21L-AWMNKW, ACA21L-AWPNKW)


т.е. если заполнено поле Марка и модель, то он ищет только по модели. С остальными полями также.
Помогите пожалуйста разобраться с запросом.

function my_scripts() {
  wp_enqueue_script('jquery-ui-autocomplete');
}
add_action('wp_enqueue_scripts', 'my_scripts');

function my_autocomplete() {
	?>
	<script>

    var data = {
    'input_marka': '',
    'input_model': '',
    'input_tip': '',
	'input_kat': ''
  };

  jQuery(document).ready(function($) {
    jQuery('#input_marka').autocomplete({
		source: function (request, response) {
      
			var data = { 
				input_marka: request.term
			};

			if (data.input_marka === '') {
			  response([]);
			  return;
			}

			jQuery.ajax({
			  url: '<?php echo admin_url('admin-ajax.php'); ?>',
			  dataType: 'json',
			  data: {
				action: 'my_autocomplete',
				data: data
			  },
			  beforeSend: function() {
				jQuery('#results').html('<div class="loading">Идет обновление данных...</div>');
				jQuery('#results').addClass('loading');
			  },
			  success: function(data) {
				show_results(data);
			  }
			});
		}
    });

    jQuery('#input_model').autocomplete({
      source: function(request, response) {
 			var data = { 
				input_model: request.term
			};

			if (data.input_model === '') {
			  response([]);
			  return;
			}

			jQuery.ajax({
			  url: '<?php echo admin_url('admin-ajax.php'); ?>',
			  dataType: 'json',
			  data: {
				action: 'my_autocomplete',
				data: data
			  },
			  beforeSend: function() {
				jQuery('#results').html('<div class="loading">Идет обновление данных...</div>');
				jQuery('#results').addClass('loading');
			  },
			  success: function(data) {
				show_results(data);
			  }
			});
      }
    });

    jQuery('#input_tip').autocomplete({
      source: function(request, response) {
			var data = { 
				input_tip: request.term
			};

			if (data.input_tip === '') {
			  response([]);
			  return;
			}

			jQuery.ajax({
			  url: '<?php echo admin_url('admin-ajax.php'); ?>',
			  dataType: 'json',
			  data: {
				action: 'my_autocomplete',
				data: data
			  },
			  beforeSend: function() {
				jQuery('#results').html('<div class="loading">Идет обновление данных...</div>');
				jQuery('#results').addClass('loading');
			  },
			  success: function(data) {
				show_results(data);
			  }
			});
      }
    });
 

   jQuery('#input_kat').autocomplete({
      source:  function(request, response) {
			var data = { 
				input_kat: request.term
			};

			if (data.input_kat === '') {
			  response([]);
			  return;
			}

			jQuery.ajax({
			  url: '<?php echo admin_url('admin-ajax.php'); ?>',
			  dataType: 'json',
			  data: {
				action: 'my_autocomplete',
				data: data
			  },
			  beforeSend: function() {
				jQuery('#results').html('<div class="loading">Идет обновление данных...</div>');
				jQuery('#results').addClass('loading');
			  },
			  success: function(data) {
				show_results(data);
			  }
			});
      }
    });
  });

  function show_results(data) {
    jQuery('#results').removeClass('loading');

    if (data.length > 0) {
      var html = '<ul>';

      jQuery.each(data, function(index, item) {
        html += '<li><a href="' + item.url + '">' + item.label + '</a></li>';
      });

      html += '</ul>';

      jQuery('#results').html(html);
    } else {
      jQuery('#results').html('<div class="no-results">Нет результатов</div>');
    }
  }
  </script>
  <?php
}
add_action('wp_footer', 'my_autocomplete');

function my_autocomplete_callback() {
  $args = array(
    'post_type' => 'us_portfolio',
    'posts_per_page' => -1,
    'meta_query' => array('relation' => 'AND')
  );

  $data = $_GET['data'];

  if ($data['input_marka'] !== '') {
    $args['meta_query'][] = array(
      'key' => 'marka_ts',
      'value' => $data['input_marka'],
      'compare' => 'LIKE'
    );
  }

  if ($data['input_model'] !== '') {
    $args['meta_query'][] = array(
      'key' => 'model_ts',
      'value' => $data['input_model'],
      'compare' => 'LIKE'
    );
  }

  if ($data['input_tip'] !== '') {
    $args['meta_query'][] = array(
      'key' => 'tip_ts',
      'value' => $data['input_tip'],
      'compare' => 'LIKE'
    );
  }
  if ($data['input_kat'] !== '') {
    $args['meta_query'][] = array(
      'key' => 'kategoriya_ts',
      'value' => $data['input_kat'],
      'compare' => 'LIKE'
    );
  }
  $posts = get_posts($args);

  $data = array();

 

$posts = get_posts($args);

$data = array();

  

  foreach ($posts as $post) {
    $marka = get_field('marka_ts', $post->ID);
    $model = get_field('model_ts', $post->ID);
    $tip = get_field('tip_ts', $post->ID);
    $kat = get_field('kategoriya_ts', $post->ID);

    $title = $post->post_title;
    $url = get_permalink($post->ID);

    $label = $title;

    $label = $title . '<br>Марка ТС: ' . $marka . '<br>Модель ТС: ' . $model . '<br>Тип ТС: ' . $tip . '<br> Категория ТС: ' . $kat; 


    $data[] = array(
      'label' => $label,
      'value' => $title,
      'url' => $url
    );
  }

  wp_send_json($data);
}
add_action('wp_ajax_my_autocomplete', 'my_autocomplete_callback');
add_action('wp_ajax_nopriv_my_autocomplete', 'my_autocomplete_callback');
  • Вопрос задан
  • 39 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы