Как программно добавлять фотографии в мета-поле cmb2 типа file_list из интерфейса с несколькими входными данными файлов

#php #wordpress

#php #wordpress

Вопрос:

Мой код для создания поля CMB2

 $cmb->add_field( array(
    'name' => 'Qualification List',
    'desc' => 'Candidate qualifications',
    'id'   => 'qualification_file_list',
    'type' => 'file_list',
    'preview_size' => arraay( 100, 100 ), // Default: array( 50, 50 )
    'text' => array(
        'add_upload_files_text' => 'Upload Qualifications', // default: "Add or Upload Files"
        'remove_image_text' => 'Remove Image', // default: "Remove Image"
        'file_text' => 'File', // default: "File:"
        'file_download_text' => 'Download', // default: "Download"
        'remove_text' => 'Remove', // default: "Remove"
    ),
) );
 

HTML-код

 <div class="form-group">
   <label for="avatar">Upload your certificates:</label>
   <input type="file" id="qualifications" name="qualifications[]" accept="image/png, image/jpeg" multiple><br>
    <?php wp_nonce_field( 'qualifications', 'my_image_upload_nonce' ); ?>
    <span class="qualification-error-message"></span>
</div>
 

Мой код для загрузки изображений в медиатеку и прикрепления изображений к списку файлов CMB2

 if ( ! empty( $_FILES['qualifications'] )  ) {
$files = $_FILES['qualifications'];
$new_file_img = [];
foreach ($files['name'] as $key => $value){
    if ($files['name'][$key]){
        $file = array(
        'name' => $files['name'][$key],
        'type' => $files['type'][$key],
        'tmp_name' => $files['tmp_name'][$key],
        'error' => $files['error'][$key],
        'size' => $files['size'][$key]
        );
    }
    $_FILES = array("qualifications" => $file);
    $i=1;

    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_false();

            $attachment_id = media_handle_upload($file, $acceptanceId);
            $new_file_img = wp_get_attachment_image( $attachment_id );
            
            $i  ;
    }
    echo $new_file_img;
    update_post_meta($acceptanceId, 'qualification_file_list',  $new_file_img);
}
}
 

Мне удалось загрузить файлы в медиатеку WordPress, где говорится, что файл был загружен в сообщение, но файл не привязан к типу поля.

загрузка изображений с использованием приведенного выше кода

Ответ №1:

решение таково :

Массив :

 $files[$attach_id] = $movefile["url"];
 

и обновите следующим образом :

 update_post_meta( $post_id, 'gallery', $files);
 

Я нашел решение здесь https://github.com/CMB2/CMB2/issues/1321

Ответ №2:

Итак, что вы можете сделать здесь, это в основном собрать все загруженные изображения в массив с ключом в качестве идентификатора вложения и значением в качестве URL-адреса изображения, а затем обновить post_meta. Также может быть целесообразно сгенерировать метаданные для изображения сразу после завершения загрузки изображения, поскольку я предполагаю, что wordpress не будет автоматически генерировать метаданные для изображения в этом случае.

Таким образом, ваш код может выглядеть так:

 $files = $_FILES['qualifications'];
$gallery_images = array();

if (!empty($files)) {
    $directory = wp_upload_dir();
    foreach ($files as $key => $file) {
        $new_file_mime = mime_content_type($files['tmp_name'][$key]);
        if (!in_array($new_file_mime, get_allowed_mime_types())) {
            return; //invalid file format
        } else {
            $file_path = $directory['path'] . '/' . $files['name'][$key];
        }

        require_once(ABSPATH . 'wp-admin/includes/image.php');
        require_once(ABSPATH . 'wp-admin/includes/file.php');
        require_once(ABSPATH . 'wp-admin/includes/media.php');

        if (move_uploaded_file($files['tmp_name'][$key], $file_path)) {
            $attach_id = wp_insert_attachment(
                array(
                    'guid'           => $file_path,
                    'post_mime_type' => $new_file_mime,
                    'post_title'     => preg_replace('/.[^.] $/', '', $files['name'][$key]),
                    'post_content'   => '',
                    'post_status'    => 'inherit',
                    'post_author'    => $user->ID,
                ),
                $file_path,
                0,
                true
            );

            $image_added = array(
                $attach_id => $directory['url'] . '/' . $files['name'][$key],
            );
            wp_generate_attachment_metadata($attach_id, $file_path);
            $gallery_images  = $image_added;
        }
    }
}

update_post_meta($acceptanceId, 'qualification_file_list', $gallery_images);