Обзор
В этой статье рассматривается, как сортировать поле Repeater по значениям его подполей с помощью функции array_multisort().
Начало работы
В следующих примерах предполагается, что существует поле Repeater, содержащее 2 подполя: ID (числовое поле) и Name (текстовое поле). Это поле Repeater показано ниже. Для целей этих примеров мы будем сортировать строки повторителя по ID, однако тот же код можно использовать и в более «реальной» ситуации, например для сортировки по имени, возрасту и т. д.
В обоих примерах значение $value до и после будет выглядеть одинаково.
Примеры
Базовый
В этом примере используется функция get_field, чтобы просто загрузить массив данных поля Repeater, после чего он сортируется и обрабатывается в цикле. Обратите внимание, что функции get_sub_field и the_sub_field в этом цикле работать не будут.
<?php
// получаем данные поля Repeater
$repeater = get_field('repeater');
// переменные
$order = array();
// заполняем порядок
foreach( $repeater as $i => $row ) {
$order[ $i ] = $row['id'];
}
/*
$order должен выглядеть так:
Array (
[0] => 3
[1] => 2
[2] => 4
[3] => 1
)
*/
// многократная сортировка
array_multisort( $order, SORT_DESC, $repeater );
// проходим по повторителю
if( $repeater ): ?>
<ul>
<?php foreach( $repeater as $i => $row ): ?>
<li><?php echo $row['id']; ?>. <?php echo $row['name']; ?></li>
<?php endforeach; ?>
</ul>
<?php endif; ?>Продвинутый
В этом примере используется фильтр acf/load_value, чтобы переупорядочить поле Repeater при загрузке из базы данных. Это позволяет изменять значение как на фронтенде, так и в админке, а также позволяет функциям get_sub_field и the_sub_field работать.
Обратите внимание, что во время работы этого фильтра значение поля Repeater $value не содержит удобных имён полей, а вместо этого использует ключ подполей. Это видно при заполнении переменной $row.
functions.php
function my_acf_load_value( $value, $post_id, $field ) {
// переменные
$order = array();
// прерываем выполнение, если значения нет
if( empty($value) ) {
return $value;
}
// заполняем порядок
foreach( $value as $i => $row ) {
$order[ $i ] = $row['field_55121d86dd2f6'];
}
// многократная сортировка
array_multisort( $order, SORT_DESC, $value );
// возвращаем значение
return $value;
}
add_filter('acf/load_value/name=scores', 'my_acf_load_value', 10, 3);<?php if( have_rows('repeater') ): ?>
<ul>
<?php while( have_rows('repeater') ): the_row(); ?>
<li><?php the_sub_field('id'); ?>. <?php the_sub_field('name'); ?></li>
<?php endwhile; ?>
</ul>
<?php endif; ?>Как это работает
Функция array_multisort использует массив-снимок ($row в примерах выше), чтобы сравнивать и переупорядочивать массив $value. Эта функция не ограничивается одним массивом-снимком. На самом деле для сортировки данных можно использовать несколько переменных $column.
Поэтому можно сортировать сначала по одному подполю, а затем по другому (ID и Name).
Есть несколько вариантов направления сортировки, а именно: SORT_ASC, SORT_DESC, SORT_REGULAR, SORT_NUMERIC, SORT_STRING.
Подробнее об этой функции читайте здесь: http://php.net/manual/en/function.array-multisort.php
Обновлено: 01.06.2026

