Как написать фильтр записей Wordpress по custom fields?

На сайте сейчас используется фильтр из 4рех пунктов: тип квартиры, район, к-во комнат, к-во мест.
Нужно усовершенствовать фильтр, что б: при выбранном в фильтре к-ве мест выводились значения которые выше указанного на 2.
Т.е если человек выбрал 2 места, то чтоб выводились квартиры в диапазоне 2-4 мест.
То же касается поля с выбором к-ва комнат.

Так же нужно узнать к-во выводимых записей.
Пожалуйста, подскажите что делать, либо в каком направлении искать.

СПАСИБО!

Сейчас используется такой фильтр:
function go_filter() { // наша функция
	$args = array(); // подготовим массив 
	$args['meta_query'] = array('relation' => 'AND'); // отношение между условиями, у нас это "И то И это", можно ИЛИ(OR)
	global $wp_query; // нужно заглобалить текущую выборку постов

	if ($_POST['type_kv'] != '') { // если передана фильтрация по разделу
		$args['meta_query'][] = array( // пешем условия в meta_query
			'key' => 'type_kv', // название произвольного поля
			'value' => (int)$_POST['type_kv'], // переданное значение произвольного поля
			'type' => 'numeric' // тип поля, нужно указывать чтобы быстрее работало, у нас здесь число
			);
	}
	// Район
	if ($_POST['district'] != '') { // если передана фильтрация по разделу
		$args['meta_query'][] = array( // пешем условия в meta_query
			'key' => 'district', // название произвольного поля
			'value' => (int)$_POST['district'], // переданное значение произвольного поля
			'type' => 'numeric' // тип поля, нужно указывать чтобы быстрее работало, у нас здесь число
			);
	}
	// Комнаты
	if ($_POST['rooms'] != '') { // если передана фильтрация по разделу
		$args['meta_query'][] = array( // пешем условия в meta_query
			'key' => 'rooms', // название произвольного поля
			'value' => (int)$_POST['rooms'], // переданное значение произвольного поля
			'type' => 'numeric' // тип поля, нужно указывать чтобы быстрее работало, у нас здесь число
			);
	}
	// К-во мест
	if ($_POST['seats'] != '') { // если передана фильтрация по разделу
		$args['meta_query'][] = array( // пешем условия в meta_query
			'key' => 'seats', // название произвольного поля
			'value' => (int)$_POST['seats'], // переданное значение произвольного поля
			'type' => 'numeric' // тип поля, нужно указывать чтобы быстрее работало, у нас здесь число
			);
	}
			
	query_posts(array_merge($args,array()/*$wp_query->query*/)); // сшиваем текущие условия выборки стандартного цикла wp с новым массивом переданным из формы и фильтруем
}
  • Вопрос задан
  • 1371 просмотр
Решения вопроса 1
HeadOnFire
@HeadOnFire
PHP, Laravel & WordPress Evangelist
1. Вместо query_posts делайте все то же самое, только через хук pre_get_posts. И вообще забудьте про существование функции query_posts. В первую очередь она ломает количество найденных записей, и, как следствие, постраничную навигацию. Ну и много других гадостей.
2. Используйте оператор BETWEEN в meta_query
// Комнаты
  if ($_POST['rooms'] != '') { // если передана фильтрация по разделу
    $args['meta_query'][] = array( // пешем условия в meta_query
      'key' => 'rooms', // название произвольного поля
      'value' => array( (int)$_POST['rooms'], (int)$_POST['rooms'] + 2 ), // переданное значение произвольного поля
      'type' => 'numeric', // тип поля, нужно указывать чтобы быстрее работало, у нас здесь число
      'compare' => 'BETWEEN'
      );
  }
  // К-во мест
  if ($_POST['seats'] != '') { // если передана фильтрация по разделу
    $args['meta_query'][] = array( // пешем условия в meta_query
      'key' => 'seats', // название произвольного поля
      'value' => array( (int)$_POST['seats'], (int)$_POST['seats'] + 2 ), // переданное значение произвольного поля
      'type' => 'numeric', // тип поля, нужно указывать чтобы быстрее работало, у нас здесь число
      'compare' => 'BETWEEN' 
      );
  }
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы