WordPress ACF, как получить в шаблоне ID самого повторителя (repeater), а также ID каждого из его полей (row) в цикле?

Ссылка скопирована
1 ответ

Мне нужно получить в шаблоне ID самого повторителя (repeater), а также ID каждого из его полей (row) в цикле для того, чтобы манипулировать ими посредством JavaScript.

Как получить эти ID-шники?

Дополнительно:

Ответы:

Не очень понятно, что за ID повторителя, но он работает как обычный массив

$my_repeater = get_field('my_repeater_field', 'id страницы к которой он привязан');  // можно обращаться к его полям, например: echo $my_repeater['3']['название строки'];

$my_repeater = get_field('my_repeater_field', 'id страницы к которой он привязан'); // можно обращаться к его полям, например: echo $my_repeater['3']['название строки'];

  • Смотрите, можно например сделать счётчик:
    <?php if( have_rows('repeater_field_name') ): ?> 	<?php $i = 1; while ( have_rows('repeater_field_name') ) : the_row(); ?> 		<?php the_sub_field('sub_field_name'); ?>                 <p>ID <?php=$i; ?></p> 	<?php $i++; endwhile; ?> <?php else : ?> <?php endif; ?>

    <?php if( have_rows('repeater_field_name') ): ?> <?php $i = 1; while ( have_rows('repeater_field_name') ) : the_row(); ?> <?php the_sub_field('sub_field_name'); ?> <p>ID <?php=$i; ?></p> <?php $i++; endwhile; ?> <?php else : ?> <?php endif; ?>

    Но это как бы через одно место, ведь у записи (поля в репиторе) есть же в базе какой-то свой уникальный mysql_insert_id. Вот как его вытащить?

  • Счетчик через одно место), т.к. для этого есть функция:
    get_row_index();

    Может для манипуляции через js вам хватит того что я написал, а так же функции:
    update_sub_field($selector, $value, [$post_id]);

Попробуйте использовать функцию - get_field_object()

Нужно решить такую задачу?

Опишите проблему, и специалист поможет с настройкой, исправлением ошибки или доработкой сайта. Подберём понятный план работ без лишней переписки.

Заказать помощь
Лучший ответ
1
Алексей Денисов Ответ

У строк ACF Repeater нет нормального стабильного публичного ID, как у записей WordPress. Repeater хранится в postmeta как набор meta-ключей, и ориентироваться на внутренние ID/порядковые записи базы не стоит. Для JavaScript обычно нужен не “ID строки из MySQL”, а стабильный HTML-идентификатор, который Вы сами формируете при выводе.

Самый простой вариант — счётчик:

if (have_rows('repeater_field_name')) {
    $i = 0;
    while (have_rows('repeater_field_name')) {
        the_row();
        $i++;
 
        $row_id = 'repeater-row-' . get_the_ID() . '-' . $i;
        echo '<div id="' . esc_attr($row_id) . '" class="repeater-row">';
        the_sub_field('sub_field_name');
        echo '</div>';
    }
}

if (have_rows('repeater_field_name')) { $i = 0; while (have_rows('repeater_field_name')) { the_row(); $i++; $row_id = 'repeater-row-' . get_the_ID() . '-' . $i; echo '<div id="' . esc_attr($row_id) . '" class="repeater-row">'; the_sub_field('sub_field_name'); echo '</div>'; } }

Это не “через одно место”, а нормальная практика. Для фронта важна стабильность в рамках страницы. Если порядок строк меняется в админке, их HTML-ID тоже логично меняются.

Если нужен постоянный ID, который не зависит от порядка, добавьте в repeater отдельное sub field, например row_key, и заполняйте его вручную или автоматически UUID. Тогда используйте его:

$row_key = get_sub_field('row_key');
$row_id = 'row-' . sanitize_title($row_key);

$row_key = get_sub_field('row_key'); $row_id = 'row-' . sanitize_title($row_key);

Не привязывайтесь к внутренней структуре postmeta ACF. Она не предназначена для такой логики и может поменяться. Делайте собственный ключ или счётчик — это надёжнее для JS, CSS и якорей.

Другие ответы (0)

Пока нет других ответов. Будьте первым, кто поможет автору.

Ответить на вопрос

комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Вам также может быть интересно