상현에 하루하루
All 개발자의 하루

repeater필드의 서브 필드 업데이트 (type file)

( 업데이트: )

위와 같이 첨부파일이라는 Repeater 필드가있다. PHP 코드로 커스텀한 포스트를 만들고 해당 포스트의 커스텀 필드의 값을 업데이트하려면 어떻게해야할까?

커스텀 포스트를 PHP 코드에서 생성하기

$post = array(
      'post_title'    => $_POST['title'],
      'post_content'  => $_POST['content'],
      'post_status'   => 'draft',  
      'post_type'   => 'post'
);
$new_post = wp_insert_post($post);

이렇게 임시글 상태의 포스트를 생성한다.

업로드할 파일을 미디어에 추가한다

if($_FILES) {
    if (!function_exists('wp_generate_attachment_metadata')){
        require_once(ABSPATH . "wp-admin" . '/includes/image.php');
        require_once(ABSPATH . "wp-admin" . '/includes/file.php');
        require_once(ABSPATH . "wp-admin" . '/includes/media.php');
    }

    foreach ($_FILES as $file => $array) {
        if ($_FILES[$file]['error'] !== UPLOAD_ERR_OK) {
            return "upload error : " . $_FILES[$file]['error'];
        }
        $attach_id = media_handle_upload( $file, $new_post );
    }
}

위와 같이 미디어에 업로드를하고 $new_post 포스트의 데이터를 넣어서 어떤 포스트에서 업로드된 미디어 파일로 설정하였다.
그렇다면 $new_post에 repeater 필드를 어떻게 업데이트할까?

Repeater 필드 업데이트하기

// 필드 이름 대신 필드 키를 사용하십시오.
$field_key = 'field_123456789abc';

// 사용 가능한 경우 필드 값을 먼저 가져옵니다.
$repeater_value = get_field('repeater_field_name');

// Repeater 레이아웃에 행 추가
$repeater_value[] = array('memos_upload_file' => $attach_id);

// Repeater 필드 업데이트
update_field($field_key, $repeater_value, $post_id );

위 예제를 직접적으로 적용해보자 여러개의 파일을 받는다!

if($_FILES) {
    if (!function_exists('wp_generate_attachment_metadata')){
        require_once(ABSPATH . "wp-admin" . '/includes/image.php');
        require_once(ABSPATH . "wp-admin" . '/includes/file.php');
        require_once(ABSPATH . "wp-admin" . '/includes/media.php');
    }

    foreach ($_FILES as $file => $array) {
        if ($_FILES[$file]['error'] !== UPLOAD_ERR_OK) {
            return "upload error : " . $_FILES[$file]['error'];
        }
        $attach_id = media_handle_upload( $file, $new_post );

        // Please use field key instead of field name
        $field_key = 'field_61b1a87048bc5';

        // Get the field value first if it's available
        $repeater_value = get_field('attached-files', $new_post);

        // Add the row to the repeater
        if (is_array($repeater_value)) {
          array_push($repeater_value, array('file' => $attach_id));
        } else {
          $repeater_value[] = array('file' => $attach_id);
        }

        // Update the repeater field
        update_field($field_key, $repeater_value, $new_post );
    }
}

이렇게 업로드된 미디어 파일을 설정한다.

알아야할점

Repeater의 sub field로 file유형으로 업데이트하였는데 해당 업데이트값이 sub field의 return 타입이랑 맞춰서 넣어줘야한다. 아니면 boolean 값으로 들어가서 파일 업로드가 적용되지 않는다.