Wordpress ACF: как добавить строки в поле повторителя, прикрепленное к пользователю с помощью пользовательского кода (PHP)

Я просмотрел документацию по ACF и ACF Repeater Field, но это немного сбило меня с толку.

У меня есть группа пользователей, и я (через ACF) прикрепил к каждому из них поле ретранслятора (называемое событиями), в поле ретранслятора есть подполе под названием Event ID (event_id).

Теперь у меня возникла дилемма: я хочу иметь возможность добавлять и удалять строки event_id от пользователя в зависимости от того, какие события они пытались добавить или удалить.

Я знаю функцию update_field ($ field_key, $ value, $ post_id), но не уверен, как использовать ее для добавления строк в подполя поля повторителя, прикрепленного к пользователю. Мне также нужно руководство о том, как удалять предметы.

Любая помощь приветствуется!


person PavKR    schedule 22.07.2014    source источник
comment
Какую версию ACF вы используете? Вы используете последнюю и лучшую версию ACF: v5 или все еще используете v4?   -  person Dwayne Charrington    schedule 30.07.2014


Ответы (2)


Чтобы добавить строки в подполя репитера, вы можете:

$field_key = "repeater_field";
$user_id = "user_123"; // save to user (user id = 123)

$value = get_field($field_key, $user_id);
$value[] = array("event_id " => 25);
$value[] = array("event_id " => 30);
update_field( $field_key, $value, $user_id );

Чтобы удалить элементы, я бы использовал функцию PHP, такую ​​как та, что в принятом ответе на Удалить элемент из многомерного массива на основе значения:

$value = removeElementWithValue($value, "event_id", 25);
update_field( $field_key, $value, $user_id );

Что касается куда для добавления этих кодов (т.е. ловушка действия), зависит от того, когда вы хотите добавить / удалить элементы.

person Angelie Macalansag    schedule 30.07.2014
comment
Отлично, спасибо! Я пойду, посмотрю и вернусь к вам :) - person PavKR; 30.07.2014
comment
@ ange008 Большое спасибо. Изучив всю документацию на сайте ACF, я так и не понял, как это сделать. Это так просто, но документация либо избегает проблемы, либо обходит ее стороной, ссылаясь на такие функции, как update_sub_field() (который, кстати, не определен для меня по какой-то причине). Еще раз большое вам спасибо! - person ggutenberg; 12.08.2014
comment
Также проверьте это, если у вас нет существующих данных и вам нужно добавить строки stackoverflow.com/questions/33545314/ - person Ralph Vugts; 27.11.2015
comment
Проверьте значение print_r($value), тогда вы сможете лучше понять и сравнить новый массив и старые массивы. - person devugur; 24.07.2017

Просто какое-то дополнение к ответу Анджели Макалансаг, что хорошо.

Это для wordpress версии ‹5, так как в новой версии есть функция add_row (), которая решает проблему.

Печальная часть - $ field_key - проблема. Это ключ, который вы можете найти в администрировании WordPress в списке столбцов настраиваемых полей, но вам нужно нажать на «Параметры экрана» в верхней части экрана, а затем установить флажок «Показать ключ поля». Этот ключ выглядит как «field_5c7d3d0cbcbd1», а имя нашего поля повторителя выглядит как «orders».

update_field( 'orders', $value, $user_id ); 

Будет работать нормально, только если вы добавили в администрировании вручную хотя бы одну запись в поле репитера. Если вы попытаетесь вставить с помощью php в пустое поле репитера, страница администрирования этого сообщения выйдет из строя при ошибке тайм-аута.

update_field( 'field_5c7d3d0cbcbd1', $value, $user_id ); 

Будет работать, даже если ретранслятор еще пуст.

Это создает проблемы, когда у вас есть несколько экземпляров wordpress (или версия localhost) и вы создаете таблицы в администрировании. Поскольку у каждого из них будет свой ключ.

Мне не удалось найти рабочий способ получить значение ключа в зависимости от случайного имени столбца. Единственное решение, которое я смог найти, заключалось в поиске в базе данных нового созданного ключа и переопределении его во всех местах (около 7 из них) на значение, которое я сгенерировал на localhost, чтобы один и тот же код мог работать с несколькими проектами.

Это только для ретрансляторов, для полей non Repeater acf у меня не было проблем с использованием этой функции:

function acf_updateValue($fieldname, $value, $post_id){
    $field_key = 'field_' . uniqid();
    update_post_meta($post_id, $fieldname, $value);
    update_post_meta($post_id, '_'.$fieldname, $field_key);
    update_field($field_key, $value, $post_id);
}

Используется, например, как -

acf_updateValue('orderFinished', true, $post_id)
  • но это не работает с полями повторителя.
person Jiro Matchonson    schedule 06.03.2019