Как сортировать поле Repeater в ACF

Обзор

В этой статье рассматривается, как сортировать поле 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