Проблемы с обновлением вложенных групп полей ACF

Вопрос или проблема

У меня есть фронтенд-форма для создания пользовательских записей, которая принимает данные для всех 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 не содержит ожидаемую структуру.

Решение

  1. Обработка данных корректно: Убедитесь, что данные, отправляемые с формы, обрабатываются корректно. Это включает в себя проверку существования полей в массиве перед их использованием.

  2. Обновление структуры: Вам нужно будет создать массив с данными, которые нужно обновить, и затем применить 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.

Оцените материал
Добавить комментарий

Капча загружается...