Laden Sie mehrere Dateien mit media_handle_upload hoch

16

Ich habe ein WordPress-Formular-Plugin und benutze es media_handle_upload, um die Dateien hochzuladen und die IDs direkt abzurufen, und habe die IDs als Metadatum an den Post angehängt. Dazu habe ich Folgendes verwendet:

Der HTML-Code des Formularfelds lautet:

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

Und der PHP-Code war:

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

Und alles hat perfekt funktioniert.

Jetzt versuche ich, mehrere Dateien hochzuladen. Mein HTML-Code lautet:

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

Ich kann die media_handle_uploadFunktion jedoch nicht für das Hochladen mehrerer Dateien verwenden.

Jede Hilfe wird geschätzt.

Engr.MTH
quelle
Verwende foreach, um mehrere hochzuladen. Ich bin jetzt auf dem Handy. Posten Sie den vollständigen Code
Shady M Rasmy
Ich habe viele foreach-Schleifen ausprobiert und keiner von ihnen funktioniert.
Engr.MTH

Antworten:

14

Hier, wenn Sie eine benutzerdefinierte Vorlage verwenden, die am Anfang darüber liegt

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

}
?>

in 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
quelle
Vielen Dank für Ihren Code. Ich verwende ihn für ein Formular zum Senden von Beiträgen. Ich habe mich gefragt, wie ich hochgeladene Dateien validieren kann. es gibt einen weg?
sb0k
3
Überschreibt dies nicht die globale Variable $ _FILES?
ReLeaf
@ReLeaf Dies sollte die globale Variable $ _FILES überschreiben. media_handle_upload()sucht nach$_FILES[$file_handler]
Andy Macaulay-Brook
Dieses Snippet funktioniert einwandfrei, AUSSER bei Android WebView, wenn Sie versuchen, mehrere Dateien hochzuladen (eine einzelne Datei ist in Ordnung).
Rollor
7

Wenn Sie dies implementieren möchten, ohne die Funktionsdatei zu verwenden, können Sie die optimierte Version verwenden, die ich mir ausgedacht habe. Dies ist der getestete Code funktioniert 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>

Platzieren Sie den PHP-Code auf der Seite, auf der die Übermittlung erfolgt. In meinem Fall auf der gleichen Seite wie die Formularaktion ist auf "#" gesetzt

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

Diese Methode schließt die erforderlichen Dateien nur einmal ein, wenn das Senden des Formulars abgeschlossen ist, anstatt sie jedes Mal einzuschließen, wenn die Funktion über die foreach-Schleife aufgerufen wird

Glücklich
quelle
EDIT: Ich habe den Code entfernt, $post_thumbnail_id = wp_get_attachment_image_src($attachment_id, array(800, 600));da er für das Beispiel unnötig ist. Aber wenn Sie die URL des Bildes erhalten möchten, wird es Ihnen helfen :)
Lucky
5

Danke @ shady-m-rasmy Ich habe den Code verwendet, den Sie erwähnt haben, und es scheint, dass die zweite foreach-Schleife (unten - im benutzerdefinierten Vorlagenteil) nicht erforderlich ist, da sie nur einmal ausgeführt wird.

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

Also geht es nur mit

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

Mehrere Einträge für denselben Metaschlüssel

$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
quelle
Können Sie bitte Ihren Code formatieren und auch eine Erklärung hinzufügen?
Nilambar Sharma
Ich bin nicht sicher, ob dies das Problem hier löst: Der schwierigste Teil scheint darin zu bestehen, die übermittelten Dateien zu analysieren und nicht mehrere Dateien an den Beitrag anzuhängen.
Rup