Unggah Banyak File Dengan media_handle_upload

16

Saya memiliki plugin bentuk WordPress dan saya gunakan media_handle_uploaduntuk mengunggah file dan langsung ke sana id dan melampirkan id ke posting sebagai tanggal meta, saya menggunakan yang berikut untuk melakukan itu:

HTML bidang isian adalah:

<input type="file" name="my_file_upload" id="my_file_upload">

Dan kode phpnya adalah:

$attach_id = media_handle_upload( 'my_file_upload', $post_id );
if ( is_numeric( $attach_id ) ) {
    update_post_meta( $post_id, '_my_file_upload', $attach_id );
}

Dan semuanya bekerja dengan sempurna.

Sekarang saya mencoba mengunggah banyak file kode HTML saya adalah:

<input type="file" name="my_file_upload[]" id="my_file_upload[]" multiple="multiple">

Tapi saya tidak bisa membuat media_handle_uploadfungsinya berfungsi dengan mengunggah banyak file.

Bantuan apa pun akan dihargai.

Masuk
sumber
Gunakan foreach untuk mengunggah banyak, iam di ponsel sekarang jadi
silakan kirimkan
Saya mencoba banyak loop foreach dan tidak ada yang bekerja.
Engr .TH

Jawaban:

14

di sini jika Anda menggunakan templat khusus melewati ini di awal

<?php
 if( 'POST' == $_SERVER['REQUEST_METHOD']  ) {
if ( $_FILES ) { 
    $files = $_FILES["my_file_upload"];  
    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 ("my_file_upload" => $file); 
                foreach ($_FILES as $file => $array) {              
                    $newupload = my_handle_attachment($file,$pid); 
                }
            } 
        } 
    }

}
?>

di function.php

function my_handle_attachment($file_handler,$post_id,$set_thu=false) {
  // check to make sure its a successful upload
  if ($_FILES[$file_handler]['error'] !== UPLOAD_ERR_OK) __return_false();

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

  $attach_id = media_handle_upload( $file_handler, $post_id );
  if ( is_numeric( $attach_id ) ) {
    update_post_meta( $post_id, '_my_file_upload', $attach_id );
  }
  return $attach_id;
}

sumber http://www.kvcodes.com/2013/12/create-front-end-multiple-file-upload-wordpress/

Shady M Rasmy
sumber
Terima kasih atas kode Anda, saya menggunakannya untuk formulir mengirim posting. Saya bertanya-tanya bagaimana saya bisa memvalidasi file yang diunggah. ada jalan?
sb0k
3
Bukankah ini menimpa variabel $ _FILES global?
ReLeaf
@ReLeaf Ini harus menimpa variabel $ _FILES global. media_handle_upload()mencari$_FILES[$file_handler]
Andy Macaulay-Brook
Cuplikan ini berfungsi dengan sempurna, KECUALI di Android WebView saat mencoba mengunggah banyak file (satu file tidak masalah).
Rollor
7

Jika Anda ingin menerapkan ini tanpa menggunakan file fungsi, Anda dapat menggunakan versi streamline yang saya buat. Ini adalah kode yang diuji bekerja 100%

<form id="file_upload" method="post" action="#" enctype="multipart/form-data">
     <input type="file" name="my_file_upload[]" multiple="multiple">
     <input name="my_file_upload" type="submit" value="Upload" />
</form>

Tempatkan kode PHP pada halaman di mana pengiriman terjadi. Dalam kasus saya di halaman yang sama dengan action form diatur ke "#"

<?php if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    require_once( ABSPATH . 'wp-admin/includes/image.php' );
    require_once( ABSPATH . 'wp-admin/includes/file.php' );
    require_once( ABSPATH . 'wp-admin/includes/media.php' );

    $files = $_FILES["my_file_upload"];
    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("upload_file" => $file);
            $attachment_id = media_handle_upload("upload_file", 0);

            if (is_wp_error($attachment_id)) {
                // There was an error uploading the image.
                echo "Error adding file";
            } else {
                // The image was uploaded successfully!
                echo "File added successfully with ID: " . $attachment_id . "<br>";
                echo wp_get_attachment_image($attachment_id, array(800, 600)) . "<br>"; //Display the uploaded image with a size you wish. In this case it is 800x600
            }
        }
    }
} ?>

Metode ini akan menyertakan file yang diperlukan hanya sekali ketika formulir mengirimkan dilakukan alih-alih termasuk mereka setiap kali fungsi dipanggil melalui foreach loop

Beruntung
sumber
EDIT: Saya telah melepas kode $post_thumbnail_id = wp_get_attachment_image_src($attachment_id, array(800, 600));karena tidak perlu untuk contoh. Tetapi jika Anda ingin mendapatkan URL gambar, itu akan membantu Anda :)
Lucky
5

Terima kasih @ shady-m-rasmy Saya menggunakan kode yang Anda sebutkan, dan tampaknya loop foreach kedua (di bawah - di bagian templat kustom) tidak diperlukan karena hanya dieksekusi sekali.

foreach ($_FILES as $file => $array) {              
   $newupload = my_handle_attachment($file,$pid);
} 

Jadi hanya pergi dengan

$newupload = my_handle_attachment( "my_file_upload", $pid);
Sandrine
sumber
0

Banyak entri untuk kunci meta yang sama

$values = [ 'red', 'yellow', 'blue', 'pink' ];
foreach( $values as $value ) {
    // This method uses `add_post_meta()` instead of `update_post_meta()`
    add_post_meta( $item_id, 'color', $value );
}
Mbeche Esikanda
sumber
Bisakah Anda memformat kode Anda dan menambahkan juga menambahkan penjelasan?
Nilambar Sharma
Saya tidak yakin ini menyelesaikan masalah di sini: bagian tersulit tampaknya mem-parsing file yang dikirimkan, tidak melampirkan banyak file ke posting.
Rup
0

HTML

<input type="file" id="id_termine_attachment" multiple="multiple" name="id_termine_attachment[]" value="" size="25" />

PHP

function upload_file($_FILES) {

    if (!empty($_FILES['id_termine_attachment'])) {
        $supported_types = array(
            'application/pdf',
            'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
            'application/msword',
            'image/gif',
            'image/jpeg',
            'image/png',
            'application/zip'
         );

        $file_arr = reArrayFiles($_FILES['id_termine_attachment']);
        $file_urls = [];

        foreach ($file_arr as $file) {
            $arr_file_type = wp_check_filetype(basename($file['name']));
            $uploaded_type = $arr_file_type['type'];
            if (in_array($uploaded_type, $supported_types)) {
                $upload = wp_upload_bits($file['name'], null, file_get_contents($file['tmp_name']));
                if (isset($upload['error']) && $upload['error'] != 0) {
                    wp_die('There was an error uploading your file. The error is: ' . $upload['error']);
                } else {
                    array_push($file_urls, $upload['url']);

                } // end if/else
            } else {
                wp_die("This filetyp is not available!");
            }
        }
        update_post_meta($post_id, 'id_termine_attachment', $file_urls);
    }
}



function reArrayFiles(&$file_post) {
    $file_ary = array();
    $file_count = count($file_post['name']);
    $file_keys = array_keys($file_post);

    for ($i=0; $i<$file_count; $i++) {
        foreach ($file_keys as $key) {
            $file_ary[$i][$key] = $file_post[$key][$i];
        }
    }

    return $file_ary;
}
Maximilian Meyer
sumber