В приведенном ниже цикле он выводит только данные года из datepicker в настраиваемом поле репитера. В одном году может быть несколько объектов. Я хотел бы объединить любую группу повторяющихся лет в одну, чтобы позже настроить фильтр по годам.
<?php
if (have_rows('list_link_items')) :
echo '<select>';
while (have_rows('list_link_items')) : the_row();
$date = get_sub_field('date', false, false);
if ($date) :
$date = new DateTime($date);
$date = $date->format('Y');
endif;
echo '<option>', $date, '</option>';
endwhile;
echo '</select>';
endif;
?>
В настоящее время он выводит:
<select>
<option>2017</option>
<option>2017</option>
<option>2016</option>
<option>2014</option>
<option>2012</option>
<option>2012</option>
<option>2011</option>
<option>2011</option>
<option>2011</option>
<option>2010</option>
<option>2010</option>
<option>2010</option>
<option>2010</option>
<option>2010</option>
<option>2010</option>
<option>2009</option>
<option>2009</option>
<option>2009</option>
<option>2009</option>
<option>2009</option>
<option>2009</option>
<option>2009</option>
<option>2009</option>
<option>2009</option>
<option>2009</option>
<option>2009</option>
<option>2009</option>
<option>2009</option>
<option>2009</option>
</select>
Что хочу (без дублирования лет):
<select>
<option>2017</option>
<option>2016</option>
...
<option>2009</option>
</select>






Наверное, это не самый эффективный способ, но я бы так и поступил. Также учитывается тот факт, что даты не обязательно должны быть в хронологическом порядке при вводе. Обратите внимание, что порядок вывода по-прежнему зависит от порядка ввода, но, поскольку это не вопрос, я не учел его.
<?php
if (have_rows('list_link_items')) :
echo '<select>';
$dateList = []; // List to keep track of dates
while (have_rows('list_link_items')) : the_row();
$date = get_sub_field('date', false, false);
if ($date) :
$date = new DateTime($date);
$date = $date->format('Y');
if (!in_array($date, $dateList)) : // If date isn't in list
echo '<option>', $date, '</option>'; // echo it
$dateList[] = $date; // and save the date to the list
endif;
endif;
endwhile;
echo '</select>';
endif;
?>
Боковое примечание об очень незначительных улучшениях производительности
Если вы на 100% уверены, что список ввода всегда упорядочен, вы даже можете заменить массив строкой и проверять только предыдущую дату.
Что-то вроде этого должно работать.
По сути, просто используйте массив для отслеживания дат, которые уже использовались, добавив ключ со значением даты. Затем проверьте, существует ли этот ключ перед echoing. Если ключ существует, вы знаете, что использовали его раньше, если нет, то продолжайте и эхо.
<?php
if (have_rows('list_link_items')) :
echo '<select>';
// keep track of dates we've used
$datesUsed = [];
while (have_rows('list_link_items')) : the_row();
$date = get_sub_field('date', false, false);
if ($date) :
$date = new DateTime($date);
$date = $date->format('Y');
endif;
// only echo if the value hasn't been used yet
if (is_null($dateUsed[$date])) echo '<option>', $date, '</option>';
// add this date to the list so we don't use it next time
$datesUsed[$date] = 1;
endwhile;
echo '</select>';
endif;
?>
Я бы сохранял годы в массиве, затем удалял дубликаты и выводил список опций.