Форма расширенного поиска с фильтрами для пользовательских таксономий и пользовательских полей

30

Я хотел бы создать форму расширенного поиска для определенного настраиваемого типа записей, с фильтрами для настраиваемых полей настраиваемых типов записей, настраиваемых таксономий и для отдельных свойств настраиваемых типов записей (полей и таксономий), которые будут ссылками на первый Тип публикации с использованием настраиваемого поля отношения.

Недавно я начал с пользовательских типов записей WP, полей и таксономий, мне это до сих пор нравится, но, чтобы извлечь максимальную выгоду из этого, я бы хотел иметь возможность искать его правильно. Нужно ли делать это вручную? Если так, то как?

PS. Если это имеет значение, я использую плагины: Advanced Custom Fields и Custom Post Type UI .

Ниже я привел пример того, как будет выглядеть фильтрация и как она может относиться к типам записей выше.

настраиваемая форма поиска wordpress, отфильтрованная по настраиваемым полям и пользовательским таксономия

чел
источник
Если у кого-то возникают трудности с реализацией решения Брэди, описанного выше (как я это сделал), вот подсказка: похоже, у Wordpress есть некоторые проблемы с передачей данных сеанса, поэтому вам, вероятно, придется сделать что-то дополнительное, чтобы заставить его работать должным образом. Вопросы обсуждаются здесь: frank-verhoeven.com/using-session-in-wordpress Для меня установка плагина Питера Вустера «Simple Session Support» сделала свое дело. В разделе комментариев поста есть ссылка на плагин.
SteveR

Ответы:

16

Я думаю, что-то вроде этого тебе лучше всего написать самому.

Взгляните на: http://www.catalysthomes.co.uk/homes-for-sale/

Свойства загружаются в CPT, и у меня есть собственный поиск в боковой панели. Из этого поиска он ищет ряд вещей, таких как таксономии, настраиваемые поля и упорядочение по дате и т. Д.

Так как мне этого добиться? Я отправляю форму в шаблон страницы и оттуда имею дело с данными публикации и создаю новый запрос WP_query на основе критериев поиска. Я использую сеансы для хранения переменных поиска, чтобы я мог разбивать на страницы результаты.

WP_Query очень мощный. Посмотрите: http://codex.wordpress.org/Class_Reference/WP_Query

Там вы можете использовать meta_queryдля запроса нескольких пользовательских полей и использовать tax_queryдля запроса ваших таксономий, плюс еще многое другое. Ниже показано, как мой построен, чтобы дать вам идею.

Файл шаблона:

  <?php
  $temp = $wp_query;
  $wp_query = NULL;
  $args = array();
  ?>

  <?php include("functions/Homes-for-sale/propertyrawresults.php"); ?>
  <?php include("functions/Homes-for-sale/propertysearchresults.php"); ?>

  <?php
  $args['post_type'] = "homes-for-sale";
  $args['showposts'] = 10;
  $args['paged'] = $paged;
  $wp_query = new WP_Query($args);
  ?>

  <?php include("functions/Homes-for-sale/propertylistlayout.php"); ?>

Сырые результаты

<?php
if($_POST['sortby']) {
    $_SESSION['prop_selectedsortby'] = $_POST['sortby'];
}

switch($_SESSION['prop_selectedsortby']) {
    case "name-asc": $args['order'] = "ASC"; $args['orderby'] = "title"; break;
    case "name-desc": $args['orderby'] = "title"; break;
    case "price-asc": $args['order'] = "ASC"; $args['orderby'] = "meta_value_num"; $args['meta_key'] = "chb_homes_for_sale_specifics_fmv"; break;
    case "price-desc": $args['orderby'] = "meta_value_num"; $args['meta_key'] = "chb_homes_for_sale_specifics_fmv"; break;
    case "date-asc": $args['order'] = "ASC"; break;
    default: /* No need to set arguments here as wp query defaults */ break;
}

$selectedsortby[$_SESSION['prop_selectedsortby']] = " selected=\"selected\"";
?>

результаты поиска

<?php
if( ! empty( $_SESSION['s_property_ptype'] ) ) {
    $args['meta_query'][] = array(
        'key' => 'chb_homes_for_sale_types_nbrs',
        'value' => $_SESSION['s_property_ptype']
    );
}

if( ! empty( $_SESSION['s_property_development'] ) ) {
    $args['meta_query'][] = array(
        'key' => 'chb_homes_for_sale_ofdevelopment',
        'value' => $_SESSION['s_property_development']
    );
}

if( isset( $_SESSION['s_property_area'] ) && 0 != $_SESSION['s_property_area'] ) {
    $args['tax_query'][] = array(
        'taxonomy' => 'areas',
        'field' => 'id',
        'terms' => array( (int) $_SESSION['s_property_area'] ),
    );
}

$args['meta_query'][] = array(
    'key' => 'chb_homes_for_sale_specifics_bedrooms',
    'value' => $_SESSION['s_property_bedrooms_min'],
    'compare' => '>=',
    'type' => 'SIGNED'
);

$args['meta_query'][] = array(
    'key' => 'chb_homes_for_sale_specifics_bedrooms',
    'value' => $_SESSION['s_property_bedrooms_max'],
    'compare' => '<=',
    'type' => 'SIGNED'
);

$args['meta_query'][] = array(
    'key' => 'chb_homes_for_sale_specifics_bathrooms',
    'value' => $_SESSION['s_property_bathrooms_min'],
    'compare' => '>=',
    'type' => 'SIGNED'
);

$args['meta_query'][] = array(
    'key' => 'chb_homes_for_sale_specifics_bathrooms',
    'value' => $_SESSION['s_property_bathrooms_max'],
    'compare' => '<=',
    'type' => 'SIGNED'
);

$args['meta_query'][] = array(
    'key' => 'chb_homes_for_sale_specifics_fmv',
    'value' => $_SESSION['s_property_min_price'],
    'compare' => '>=',
    'type' => 'SIGNED'
);

$args['meta_query'][] = array(
    'key' => 'chb_homes_for_sale_specifics_fmv',
    'value' => $_SESSION['s_property_max_price'],
    'compare' => '<=',
    'type' => 'SIGNED'
);
?>

Макет списка Просто стандартный цикл WP, чтобы показать выдержки из поста и информацию.

Brady
источник
Привет, Брейди, спасибо за этот пример. Могу ли я попросить вас, если возможно, поделиться формой? На каком URL вы его отправляете?
Салоцин
@salocin - Эту информацию можно получить, посмотрев на источник страницы по указанному URL-адресу в ответ
Брейди,
спасибо Брэди, так URL шаблона страницы?
salocin
Форма находится на Catalhome.co.uk. Вы можете просмотреть исходный код и посмотреть, как работает форма
Брэди,
Вы проверяете, есть ли в пользовательских таксономиях сообщения с ними в качестве настраиваемого поля? Как именно вы заполняете форму поиска? @Brady спасибо
Фил Хадсон
2

Попробуйте плагин Taxonomy Picker вместе с Relevanssi. Убийственная комбинация.

http://www.squidoo.com/taxonomy-picker-wordpress-plugin http://wordpress.org/extend/plugins/relevanssi/

шестиугольник
источник
это не принимает во внимание почтовые отношения, что является трудной частью моей проблемы. Проще фильтровать посты по таксономии, мне нужно отфильтровать их, чтобы купить таксономию (или пользовательское поле) соответствующего поста.
Pax
0

Взгляните на плагин Relevanssi, он может сделать то, что вы ищете: http://wordpress.org/extend/plugins/relevanssi/

Йенс Ведин
источник
Он не подходит подходу, который мне нужен (с определенными фильтрами), но это очень интересный плагин, он выглядит как отличная замена функции поиска по умолчанию, большое спасибо за указание на это.
чел
0

Если у кого-то возникают проблемы с реализацией решения Брэди, описанного выше (как я это сделал), вот подсказка: похоже, у WordPress есть некоторые проблемы с передачей данных сеанса, поэтому вам, вероятно, придется сделать что-то дополнительное, чтобы заставить его работать должным образом. Вопросы обсуждаются здесь

В functions.php:

function init_sessions() {
  if (!session_id()) {
  session_start();
 }
}
add_action('init', 'init_sessions');

В вашем шаблоне:

/**
* Enable sessions
*/
if (!session_id())
session_start();

Для меня установка плагина Питера Вустера " Simple Session Support " сделала свое дело.

Stever
источник
1
Привет Стив Спасибо за размещение вашего первого ответа здесь. Рад, что вы в WPSE. Для дальнейшего использования ответы не должны полностью поворачиваться на внешней ссылке. Если ссылка отключена, ваш ответ становится доброкачественным. Не могли бы вы обновить свой ответ парой примеров соответствующих фрагментов кода?
Брайан Фегтер