Cargue varios archivos con media_handle_upload

16

Tengo un plugin de formulario de WordPress y lo uso media_handle_uploadpara cargar los archivos y obtener los identificadores directamente y adjunté sus identificadores a la publicación como una meta fecha, utilicé lo siguiente para hacer eso:

El HTML del campo de formulario es:

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

Y el código php fue:

$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 );
}

Y todo fue trabajo perfectamente.

Ahora estoy tratando de cargar varios archivos, mi código HTML es:

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

Pero no puedo hacer que la media_handle_uploadfunción funcione con la carga de múltiples archivos.

Cualquier ayuda será apreciada.

Ingr.MTH
fuente
Usa foreach para cargar múltiples, iam en el móvil ahora, así que publica el código completo
Shady M Rasmy
Probé muchos bucles foreach y ninguno de ellos funciona.
Ing

Respuestas:

14

aquí si usa una plantilla personalizada más allá de esto en el comienzo

<?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); 
                }
            } 
        } 
    }

}
?>

en 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;
}

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

Shady M Rasmy
fuente
Gracias por su código, lo estoy usando para un formulario para enviar publicaciones. Me preguntaba cómo puedo validar los archivos cargados. hay un camino?
sb0k
3
¿No sobrescribe esto la variable global $ _FILES?
ReLeaf
@ReLeaf Esto debería sobrescribir la variable global $ _FILES. media_handle_upload()busca$_FILES[$file_handler]
Andy Macaulay-Brook
Este fragmento funciona perfecto, EXCEPTO en Android WebView cuando se intenta cargar varios archivos (un solo archivo está bien).
Rollor
7

Si desea implementar esto sin usar el archivo de funciones, puede usar la versión simplificada que se me ocurrió. Este es el código probado que funciona al 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>

Coloque el código PHP en la página donde se realiza el envío. En mi caso, en la misma página que la acción del formulario se establece en "#"

<?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
            }
        }
    }
} ?>

Este método incluirá los archivos requeridos solo una vez cuando finalice el envío del formulario en lugar de incluirlos cada vez que se llame a la función a través del bucle foreach

Suerte
fuente
EDITAR: He quitado el código $post_thumbnail_id = wp_get_attachment_image_src($attachment_id, array(800, 600));ya que es innecesario para el ejemplo. Pero si deseas obtener la URL de la imagen, te ayudará :)
Lucky
5

Gracias @ shady-m-rasmy Usé el código que mencionaste, y parece que el segundo bucle foreach (abajo, en la parte de la plantilla personalizada) no es necesario, ya que solo se ejecuta una vez.

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

Entonces solo sale con

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

Múltiples entradas para la misma meta clave

$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
fuente
¿Puede formatear su código y agregar también agregar explicación?
Nilambar Sharma
No estoy seguro de que esto resuelva el problema aquí: la parte más difícil parece analizar los archivos enviados, no adjuntar varios archivos a la publicación.
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
fuente