Téléchargez plusieurs fichiers avec media_handle_upload

16

J'ai un plugin de formulaire WordPress et j'utilise media_handle_uploadpour télécharger les fichiers et y obtenir des identifiants directement et joindre ses identifiants à la publication en tant que méta-date, j'ai utilisé ce qui suit pour le faire:

Le HTML du champ du formulaire est:

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

Et le code php était:

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

Et tout fonctionnait parfaitement.

Maintenant, j'essaie de télécharger plusieurs fichiers, mon code HTML est:

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

Mais je ne peux pas faire media_handle_uploadfonctionner la fonction avec plusieurs fichiers téléchargés.

Toute aide serait appréciée.

Ing.MTH
la source
Utilisez foreach pour télécharger plusieurs, iam sur mobile maintenant, donc icant postez le code complet
Shady M Rasmy
J'ai essayé de nombreuses boucles foreach et aucune d'entre elles ne fonctionne.
Engr.MTH

Réponses:

14

ici si vous utilisez un modèle personnalisé passé au début

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

}
?>

dans 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
la source
Merci pour votre code, je l'utilise pour un formulaire de soumission de messages. Je me demandais comment je pouvais valider les fichiers téléchargés. il y a un moyen?
sb0k
3
Cela n'écrase-t-il pas la variable globale $ _FILES?
ReLeaf
@ReLeaf Cela devrait remplacer la variable globale $ _FILES. media_handle_upload()cherche$_FILES[$file_handler]
Andy Macaulay-Brook
Cet extrait fonctionne parfaitement, SAUF sur Android WebView lorsque vous essayez de télécharger plusieurs fichiers (un seul fichier est correct).
Rollor
7

Si vous souhaitez l'implémenter sans utiliser le fichier de fonctions, vous pouvez utiliser la version simplifiée que j'ai proposée. Ceci est le code testé fonctionne à 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>

Placez le code PHP sur la page où la soumission a lieu. Dans mon cas, sur la même page que l'action de formulaire est définie sur "#"

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

Cette méthode n'inclura les fichiers requis qu'une seule fois lorsque le formulaire est soumis au lieu de les inclure chaque fois que la fonction est appelée via foreach loop

Chanceux
la source
EDIT: J'ai enlevé le code $post_thumbnail_id = wp_get_attachment_image_src($attachment_id, array(800, 600));car il n'est pas nécessaire pour l'exemple. Mais si vous souhaitez obtenir l'URL de l'image, cela vous aidera :)
Lucky
5

Merci @ shady-m-rasmy J'ai utilisé le code que vous avez mentionné, et il semble que la deuxième boucle foreach (ci-dessous - dans la partie du modèle personnalisé) n'est pas nécessaire car elle n'est exécutée qu'une seule fois.

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

Il ne reste donc qu'avec

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

Entrées multiples pour la même méta-clé

$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
la source
Pouvez-vous s'il vous plaît formater votre code et ajouter également ajouter une explication?
Nilambar Sharma
Je ne suis pas sûr que cela résout le problème ici: la partie la plus difficile semble être d'analyser les fichiers soumis, pas de joindre plusieurs fichiers à la publication.
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
la source