Я работаю над формой поиска WordPress, чтобы уточнить текущий поиск, и то, что я пытаюсь сделать, – это страница результатов поиска с поиском и значения, установленные на основе запроса.
До сих пор я был успешным в этом с помощью отдельных выпадающих списков и отдельных флажков, например,
<!-- SINGLE SELECT --> <select name="baths" class="form-control"> <?php if (isset($_GET['baths'])) { $bths = $_GET['baths']; ?> <option value="<?php echo $bths; ?>"><?php echo $bths; ?></option> <?php } else { ?> <option value="Any">Any</option> <?php } ?> <option value="Any">Any</option> <option value="1">1+</option> <option value="2">2+</option> <option value="3">3+</option> <option value="4">4+</option> <option value="5">5+</option> <option value="6">6+</option> <option value="7">7+</option> <option value="8">8+</option> <option value="9">9+</option> <option value="10">10+</option> </select> <!-- SINGLE CHECKBOX --> <input type="checkbox" name="dogs" class="styled" value ="yes" <?php if (isset($_GET['dogs'])) { ?>checked<?php } ?>>
Это работает, но для нескольких значений это не так. Это моя функция для создания набора флажков для выбора удобств –
<?php $amenity_array = array(); $id = get_query_var('site'); if (!empty($id)) { $property_amenities = get_post_meta($id, 'imic_property_amenities', true); global $imic_options; foreach ($property_amenities as $properties_amenities_temp) { if ($properties_amenities_temp != 'Not Selected') { array_push($amenity_array, $properties_amenities_temp); } } } global $imic_options; if (isset($imic_options['properties_amenities']) && count($imic_options['properties_amenities']) > 1) { foreach ($imic_options['properties_amenities'] as $properties_amenities) { $am_name = strtolower(str_replace(' ', '', $properties_amenities)); $check = ''; if (in_array($properties_amenities, $amenity_array)) { $check = 'checked="checked"'; } <!-- HERE I TRY TO FIND THE SELECTED CHECKBOXES AND CHECK THEM OFF --> if (isset($_GET['p_am'])) { $ams = $_GET['p_am']; echo '<div class="checkbox"><input type="checkbox" name="p_am" ' . $check . ' class="styled" value ="' . $properties_amenities . '"><label for="' . $am_name . '">' . $properties_amenities . '</label></div>'; } else { echo '<div class="checkbox"><input type="checkbox" name="p_am" ' . $check . ' class="styled" value ="' . $properties_amenities . '"><label for="' . $am_name . '">' . $properties_amenities . '</label></div>'; } <!-- END ISSET --> } } else { _e('There is no Properties Amenities', 'framework'); } ?>
Для выпадающего списка multi select я использую мультизагрузку bootstrap, поэтому на моем шаблоне код выглядит следующим образом:
<select name="property_type[]" id="pt-multi" class="form-control multi-select2" multiple="multiple"> <?php $terms = get_terms( "property-type", array( 'hide_empty' => 0 ) ); $count = count($terms); if ( $count > 0 ){ echo "<option value='Any'>All</option>"; foreach ( $terms as $term ) { echo "<option value='" . $term->slug . "'>" . $term->name . "</option>"; } } ?> </select>
На странице это отображается как —
<select name="property_type[]" id="pt-multi" class="form-control multi-select2 iOSselect" multiple="multiple" style="display: none;"> <option value="Any">All</option> <option value="co-op">Co-Op</option> <option value="condo">Condo</option> </select> <div class="btn-group" style="width: 100%;"> <button type="button" class="multiselect dropdown-toggle btn btn-default form-control multi-select2" data-toggle="dropdown" title="Property Type" style="width: 100%; overflow: hidden; text-overflow: ellipsis;"> <span class="multiselect-selected-text">Property Type</span> <b class="caret"></b></button> <ul class="multiselect-container dropdown-menu pull-right"> <li class="multiselect-item multiselect-all"> <a tabindex="0" class="multiselect-all"> <label class="checkbox"><input type="checkbox" value="multiselect-all"> Select all</label> </a> </li> <li> <a tabindex="0"><label class="checkbox"> <input type="checkbox" value="Any"> All</label> </a> </li> <li> <a tabindex="0"><label class="checkbox"><input type="checkbox" value="co-op"> Co-Op</label> </a> </li> <li> <a tabindex="0"><label class="checkbox"><input type="checkbox" value="condo"> Condo</label> </a> </li> </ul> </div>
Есть идеи?
ОБНОВИТЬ
Используя мой код сверху, мои удобства флажок отображается на странице, так вот —
<div> <label>amenities</label> <div class="checkbox"> <input type="checkbox" name="p_am" class="styled" value="Doorman (Full Time)"> <label for="doorman(fulltime)">Doorman (Full Time)</label> </div> <div class="checkbox"> <input type="checkbox" name="p_am" class="styled" value="Doorman (Part Time)"><label for="doorman(parttime)">Doorman (Part Time)</label> </div> <div class="checkbox"> <input type="checkbox" name="p_am" class="styled" value="Laundry (In-Unit)"><label for="laundry(in-unit)">Laundry (In-Unit)</label> </div> <div class="checkbox"> <input type="checkbox" name="p_am" class="styled" value="Fitness Center"><label for="fitnesscenter">Fitness Center</label> </div> </div>
Это работает с моей функцией поиска, позволяющей пользователям проверять, какие удобства включать в строку запроса –
p_am=Doorman+%28Full+Time%29&p_am=Indoor+Pool
Моя функция поиска обширна, но, насколько это касается соответствующих частей,
$amenities = isset($_GET['p_am'])?$_GET['p_am']:''; $amenities = ($amenities == __('Any', 'framework')) ? '' : $amenities; // ..... if (!empty($amenities)) { array_push($meta_query,array( 'key' => 'imic_property_amenities', 'value' => $amenities, 'compare'=>'LIKE' )); }
ОБНОВИТЬ
Что касается установки параметров выпадающего списка для многозадачности бутстрапа, я пытаюсь установить параметры, используя следующий код:
<?php $taxonomyName = "city-type"; $parent_terms = get_terms( $taxonomyName, array( 'parent' => 0, 'orderby' => 'slug', 'hide_empty' => false ) ); echo "<select name='property_nhb[]' class='form-control multi-select' id='p-nhb' multiple>"; foreach ( $parent_terms as $pterm ) { // echo "<option data-val='" . $pterm->slug . "' value='Any' " . $selected . ">Any</option>"; //Get the Child terms $terms = get_terms( $taxonomyName, array( 'parent' => $pterm->term_id, 'orderby' => 'slug', 'hide_empty' => false ) ); foreach ( $terms as $term ) { if(isset($_GET['property_nhb[]'])) { $pnhb = $_GET['property_nhb']; $selected = 'selected'; } echo "<option data-val='" . $pterm->slug . "' value='" . $term->slug . "' " . $selected . " >" . $term->name . "</option>"; } } echo "</select>"; ?>
Мой текущий код функции поиска
Это немного похоже на создание формы поиска – похоже, вы создаете форму для каждого отдельного результата? Аннотированный код и комментарии ниже. В своем ответе я старался придерживаться стиля кодирования.
$amenity_array = array(); $id = get_query_var('site'); // this first section gets the selected meta properties for the queried property (if available) // [skipping for brevity ] global $imic_options; if (isset($imic_options['properties_amenities']) && count($imic_options['properties_amenities']) > 1) { // this loops over all of the globally defined properties foreach ($imic_options['properties_amenities'] as $properties_amenities) { // gets the name of the property $am_name = strtolower(str_replace(' ', '', $properties_amenities)); // and sets up to check the box if the property has the defined amenity // if this is for a search form, why check boxes based on a result? $check = ''; if (in_array($properties_amenities, $amenity_array)) { // note: this only really needs to be 'checked' $check = 'checked="checked"'; }
Тем не менее, здесь все идет немного по-другому.
if (isset($_GET['p_am'])) { $ams = $_GET['p_am']; echo '<div class="checkbox"><input type="checkbox" name="p_am" ' . $check . ' class="styled" value ="' . $properties_amenities . '"><label for="' . $am_name . '">' . $properties_amenities . '</label></div>'; } else { echo '<div class="checkbox"><input type="checkbox" name="p_am" ' . $check . ' class="styled" value ="' . $properties_amenities . '"><label for="' . $am_name . '">' . $properties_amenities . '</label></div>'; }
Это говорит о том, что все флажки имеют одно и то же имя ( "p_am"
) вместо использования имени цикла для удобства ( $am_name
) или какой-либо комбинации форм, если вы хотите, чтобы все удобства "p_am[$am_name]"
в одном и том же массиве входных данных поиска (например, "p_am[$am_name]"
).
Каждый флажок также изменил бы значение $check
если он был $_GET
массив $_GET
.
$ams = $_GET['p_am']; if (isset($ams[$am_name])) { $check = 'checked'; }
Каждый флажок имел бы name="p_am['.$am_name.']"
Как имя.
echo '<div class="checkbox"><input type="checkbox" name="p_am[' . $am_name . ']" ' . $check . ' class="styled" value ="' . $properties_amenities . '"><label for="' . $am_name . '">' . $properties_amenities . '</label></div>';
Если вы хотите, чтобы у каждого из удобств были уникальные имена (смотря на исходный флажок, который вообще не называется p_am
), а не в массиве в PHP, вы просто используете имя цикла для удобства ( $am_name
) , вот так:
if (isset($_GET[$am_name])) { $check = 'checked'; }
Каждый флажок имел бы name="'.$am_name.'"
Как имя.
UPDATE: после обновления OP, похоже, что каждый флажок должен иметь одно и то же имя, но не быть введенным ключом. Для этой ситуации ваши флажки должны быть вызваны p_am[]
(на обеих страницах поиска исходная страница), и вам нужно использовать что-то вроде in_array()
вместо isset()
для проверки результата, например:
if (in_array($properties_amenities, $_GET['p_am'])) { $check = 'checked'; }
Дополнительное примечание: вы также используете $am_name
для метки, не устанавливая при этом соответствующий атрибут id
, а также не $am_name
символы (например, круглые скобки), поэтому ассоциация ярлыков не будет работать ,
echo '<div class="checkbox"><input type="checkbox" name="' . $am_name . '" ' . $check . ' class="styled" value ="' . $properties_amenities . '"><label for="' . $am_name . '">' . $properties_amenities . '</label></div>';
Для выбора начальной загрузки вы просто не проверяете, какие параметры выбраны:
<select name="property_type[]" id="pt-multi" class="form-control multi-select2" multiple="multiple"> <?php $terms = get_terms( "property-type", array( 'hide_empty' => 0 ) ); $count = count($terms); if ( $count > 0 ){ echo "<option value='Any'>All</option>"; foreach ( $terms as $term ) { // if the option is 'checked', you need to add the 'selected' atttibute here echo "<option value='" . $term->slug . "'>" . $term->name . "</option>"; } } ?> </select>
Таким образом, внутри цикла будет выглядеть примерно так:
// for efficiency's sake should live outside the loop as a one-off, but here for illustrative purposes $types = $_GET['property_type']; $selected = isset($types[$term->slug]) ? 'selected' : ''; echo "<option value='" . $term->slug . "'" . $selected . ">" . $term->name . "</option>";
Если вы используете более старую версию начальной загрузки, вам может потребоваться выбрать выбранную строку 'selected="selected"
или 'selected="selected"
data-selected="true"
, в зависимости от используемой вами версии. Для текущей версии указанная выше строка должна быть в порядке.
Если <select>
не является массивом параметров (то есть не кратным), тогда []
следует удалить из имени и работать аналогично коду флажка:
<select name="property_type" id="pt-multi" class="form-control multi-select2"> <?php $terms = get_terms( "property-type", array( 'hide_empty' => 0 ) ); $count = count($terms); if ( $count > 0 ){ echo "<option value='Any'>All</option>"; foreach ( $terms as $term ) { $type = $_GET['property_type']; $selected = isset($type) && $type == $term-slug ? 'selected' : ''; echo "<option value='" . $term->slug . "'" . $selected . ">" . $term->name . "</option>"; } } ?> </select>
Исходный HTML для <select>
фактически не работает так же – все, что он делает, это добавить дубликат <option>
в начало списка опций, и поскольку ничего не выбрано, форма будет обрабатывать дубликат, созданный вверху как 'selected' для <select>
.
ОБНОВЛЕНИЕ 2: причина, по которой функция поиска ломается с массивом входных данных флажка, заключается в том, что вы используете сравнение LIKE
для вашего мета-запроса. Из документации по Meta Query WordPress :
Это может быть массив только при сравнении: «IN», «NOT IN», «BETWEEN» или «NOT BETWEEN».
В документации также приведены примеры того, как объединить их. Поскольку вы не указали, как вы на самом деле делаете поисковый запрос, это немного угадывает, но похоже, что для массива флажков ваш код должен быть чем-то похожим на:
if (!empty($amenities)) { foreach ($amenities as $amenity) { array_push($meta_query, array( 'key' => 'imic_property_amenities', 'value' => $amenity, 'compare' => 'LIKE' )); } }
Как и в примерах в документации, вам нужно убедиться, что существует relation => 'OR'
или relation => 'AND'
чтобы определить, как вы хотите, чтобы ваш поиск работал.
то, что имел в виду Фред в комментарии, выглядит примерно так:
<input type="checkbox" value="condo" name="var_name[]">
[]
в конце атрибута name должен сказать PHP, что он должен обрабатывать переменную как массив.
а затем в скрипте PHP вы можете просто проверить длину массива, используя somthing like:
$arr = $_POST['var_name']; echo count($arr);
основанный на комментарии leith, если он сгенерирован автоматически, то вам не следует беспокоиться о том, чтобы проверить флажки вручную.
вместо этого просто выберите выбранные параметры, например:
<?php $selections = $_GET['property_type']; // or something similar ?> <select name="property_type[]" id="pt-multi" class="form-control multi-select2" multiple="multiple"> <?php $terms = get_terms( "property-type", array( 'hide_empty' => 0 ) ); $count = count($terms); if ( $count > 0 ){ echo "<option value='Any'>All</option>"; foreach ( $terms as $term ) { $selected = in_array($term->slug, $selections); echo "<option value='" . $term->slug . "' " . ($selected?' selected':'') . ">" . $term->name . "</option>"; } } ?> </select>
см. этот скрипт https://jsfiddle.net/u1w158tp/
в нем вы только что selected
option
s, и она автоматически проверит checkbox
es
У ваших флажков одинаковое имя. Попробуйте добавить другое имя или использовать «p_am []», чтобы рассматривать их как массив.