Вопрос или проблема
У меня есть фронтенд-форма для создания пользовательских записей, которая принимает данные для всех ACF, связанных с этим типом записи. При отправке формы я успешно создаю новую запись, а также добавляю значения обычных полей ACF.
Проблема заключается в поле ACF ‘Группа’, называемом ‘Рабочие часы’, которое дополнительно содержит 7 групп внутри, каждая из которых названа в честь каждого дня недели: ‘Понедельник’, ‘Вторник’ и так далее. Каждая группа дня содержит 2 текстовых поля: am, pm, и третью галочку под названием ‘закрыто‘, которую участник выберет, если это выходной. То есть так:
#Рабочие часы (Группа)#
——-##Понедельник (Группа)##
———— ###am (текст)###
———— ###pm (текст)###
———— ###закрыто (галочка)###
У меня возникает ошибка undefined index: sub_fields...
А вот мой код, который я пытаюсь использовать для обновления полей:
// Получение поля группы Рабочие часы
$hours = get_field( 'field_61f453c010074', $post_id );
foreach ( $hours['sub_fields'] as $key => $value ) { // ошибка в sub_fields в этой строке
foreach ( $value['sub_fields'] as $timing ) {
$timing[0] = $_POST['field_61f4573589282'];// am
$timing[1] = $_POST['field_61f4574589283'];// pm
$timing[2] = $_POST['field_61f7a28ffbcef'];// галочка 'Закрыто'
}
}
update_field( 'field_61f453c010074', $value, $post_id ); // ошибка здесь тоже, значение не определено
Вот как поле Группа Рабочих часов выводится. Здесь я привел данные, возвращенные для родительской группы, а также взял только первого ребенка для образца, т.е. Понедельник:
Array
(
[ID] => 48
[key] => field_61f453c010074
[label] => Часы
[name] => hours
[prefix] => acf
[type] => group
[value] =>
[menu_order] => 9
[instructions] =>
[required] => 0
[id] =>
[class] =>
[conditional_logic] => 0
[parent] => 36
[wrapper] => Array
(
[width] =>
[class] =>
[id] =>
)
[layout] => block
[sub_fields] => Array
(
[0] => Array
(
[ID] => 49
[key] => field_61f4570e89281
[label] => Понедельник
[name] => monday
[prefix] => acf
[type] => group
[value] =>
[menu_order] => 0
[instructions] =>
[required] => 0
[id] =>
[class] =>
[conditional_logic] => 0
[parent] => 48
[wrapper] => Array
(
[width] =>
[class] => day
[id] =>
)
[layout] => block
[sub_fields] => Array
(
[0] => Array
(
[ID] => 50
[key] => field_61f4573589282
[label] => am
[name] => am
[prefix] => acf
[type] => number
[value] =>
[menu_order] => 0
[instructions] => Введите только числа
[required] => 0
[id] =>
[class] =>
[conditional_logic] => 0
[parent] => 49
[wrapper] => Array
(
[width] =>
[class] => am
[id] =>
)
[default_value] =>
[placeholder] =>
[prepend] =>
[append] =>
[min] =>
[max] =>
[step] =>
[_name] => am
[_valid] => 1
)
[1] => Array
(
[ID] => 51
[key] => field_61f4574589283
[label] => pm
[name] => pm
[prefix] => acf
[type] => number
[value] =>
[menu_order] => 1
[instructions] => Введите только числа
[required] => 0
[id] =>
[class] =>
[conditional_logic] => 0
[parent] => 49
[wrapper] => Array
(
[width] =>
[class] => pm
[id] =>
)
[default_value] =>
[placeholder] =>
[prepend] =>
[append] =>
[min] =>
[max] =>
[step] =>
[_name] => pm
[_valid] => 1
)
[2] => Array
(
[ID] => 52
[key] => field_61f7a28ffbcef
[label] => закрыто
[name] => closed
[prefix] => acf
[type] => checkbox
[value] =>
[menu_order] => 2
[instructions] =>
[required] => 0
[id] =>
[class] =>
[conditional_logic] => 0
[parent] => 49
[wrapper] => Array
(
[width] =>
[class] => closed
[id] =>
)
[choices] => Array
(
[Yes] => Yes
)
[allow_custom] => 0
[default_value] => Array
(
)
[layout] => vertical
[toggle] => 0
[return_format] => value
[save_custom] => 0
[_name] => closed
[_valid] => 1
)
)
[_name] => monday
[_valid] => 1
)
Я пришел сюда в поисках ответа на ту же ошибку.
Я решил проблему, завернув свою функциональность в функцию и добавив ее к действию init
.
Вот пример, основанный на приведенном выше коде, где get_field()
не выдает ошибку undefined index: sub_fields...
.
add_action( 'init', 'wpse_402110', 10 );
function wpse_402110(){
// Получение поля группы Рабочие часы
$hours = get_field( 'field_61f453c010074', $post_id );
foreach ( $hours['sub_fields'] as $key => $value ) { // ошибка в sub_fields в этой строке
foreach ( $value['sub_fields'] as $timing ) {
$timing[0] = $_POST['field_61f4573589282'];// am
$timing[1] = $_POST['field_61f4574589283'];// pm
$timing[2] = $_POST['field_61f7a28ffbcef'];// галочка 'Закрыто'
}
}
update_field( 'field_61f453c010074', $value, $post_id ); // ошибка здесь тоже, значение не определено
}
Ответ или решение
Проблемы с обновлением вложенных групп ACF-полей
В процессе работы с Advanced Custom Fields (ACF) может возникнуть множество проблем, особенно когда дело доходит до работы с вложенными полями. В этом обсуждении мы решим проблему, связанную с обновлением группы полей "Рабочие часы", которая состоит из групп для каждого дня недели, и о том, как избежать ошибки undefined index: sub_fields...
.
Контекст
У вас есть фронтенд-форма для создания пользовательских постов, которая принимает данные для всех ACF, связанных с этим типом поста. Вы успешно создаете новый пост и добавляете значения обычных ACF полей. Однако при попытке работать с вложенной группой полей возникает ошибка.
Структура поля "Рабочие часы" выглядит следующим образом:
# Рабочие часы (Группа)
## Понедельник (Группа)
---- ### am (текст)
---- ### pm (текст)
---- ### закрыто (чекбокс)
Причина проблемы
Ошибка undefined index: sub_fields...
возникает, когда вы пытаетесь получить доступ к подполям без наличия полностью сформированной структуры данных. В вашем коде, например, вы используете метод get_field()
для получения группы полей, но в итоге переменная $hours
не содержит ожидаемую структуру.
Решение
-
Обработка данных корректно: Убедитесь, что данные, отправляемые с формы, обрабатываются корректно. Это включает в себя проверку существования полей в массиве перед их использованием.
-
Обновление структуры: Вам нужно будет создать массив с данными, которые нужно обновить, и затем применить
update_field()
. Вместо использования существующего массива$value
, создайте новый массив для обновления.
Вот пример исправленного кода:
add_action( 'init', 'update_working_hours', 10 );
function update_working_hours( $post_id ) {
// Проверка, установлен ли пост ID
if ( empty( $post_id ) ) {
return;
}
// Получение поля "Рабочие часы"
$hours = get_field( 'field_61f453c010074', $post_id );
// Проверка, содержит ли поле подгруппы
if ( ! isset( $hours['sub_fields'] ) || ! is_array( $hours['sub_fields'] ) ) {
return;
}
$updated_hours = []; // Массив для обновленных значений
foreach ( $hours['sub_fields'] as $key => $group ) {
$group_data = [
'am' => $_POST["field_61f4573589282"], // am
'pm' => $_POST["field_61f4574589283"], // pm
'closed' => isset($_POST["field_61f7a28ffbcef"]) ? $_POST["field_61f7a28ffbcef"] : '', // 'Closed' checkbox
];
$updated_hours[] = $group_data;
}
// Обновление поля "Рабочие часы"
update_field( 'field_61f453c010074', $updated_hours, $post_id );
}
Примечания
- Убедитесь, что переменные POST существуют, чтобы избежать дополнительных ошибок.
- Важно правильно обрабатывать ID поста, чтобы не вызвать какие-либо ошибки.
- Подумайте о безопасности данных, особенно о проверке поступающих данных перед их использованием.
Включение вышеописанных изменений поможет избежать ошибки undefined index: sub_fields...
и успешно обновить ваши вложенные группы полей ACF.