Ändern eines hochgeladenen Bildes mit ‘wp_get_image_editor’ und ‘wp_handle_upload_prefilter’

Ich versuche, ein Bildupload abzufangen, zu skalieren und dann den Upload fortzusetzen.

Ich benutze den Filter wp_handle_upload_prefilter, der als Argument ein einzelnes File $ FILES-Array übergibt.

Ich lade den Bild-Editor mit wp_get_image_editor ($ file [‘tmp_name’]), grösse es und speichere es unter einem neuen Namen. Das alles funktioniert gut und das Bild in der Größe wird in meinem tmp-Ordner erstellt. Alles gut bis hier.

Das Ziel besteht jedoch darin, das Originalbild durch das geänderte zu ersetzen.

Also ändere ich die $ file [‘name’] und [‘tmp_name’], um auf die neue Datei zu zeigen und die $ Datei zurückzugeben. WordPress mag es jedoch nicht, da es denkt, ich führe einen Datei-Hijack aus und gibt einen Fehler aus “Angegebener Datei fehlgeschlagener Upload-Test (core file.php L297)”

Wenn ich die Variable “$ file”, die anfangs übergeben wurde, nicht ändere, erhalte ich ein Bild in der Größe meines tmp-Ordners, aber das Original-Bild mit der großen Größe wird hochgeladen, statt meiner Größe.

Unterhalb der function:

add_filter('wp_handle_upload_prefilter', array($this, 'upload_image_filter')); public function upload_image_filter($file) { $image_editor = wp_get_image_editor($file['tmp_name']); if (!is_wp_error($image_editor)) { // Resize to 400px $image_editor->resize(400); // Generate a new filename with suffix abcd $filename = $image_editor->generate_filename('abcd'); $saved = $image_editor->save($filename); // Try to alter the original $file and inject the new name and path for our new image $file['name'] = $saved['file']; $file['tmp_name'] = $saved['path']; } // Return the filtered $file variable return $file; 

Ich habe auch versucht, $ image_editor-> save ($ file [‘tmp_name’]) zu verwenden, um mein geändertes Bild über das Original zu speichern, aber ich bekomme immer noch den gleichen Fehler. Die Datei wird jedoch überschrieben.

Also habe ich versucht, tmp_name in eine neue Datei zu ändern und die Datei selbst auch ohne Glück zu überschreiben.

Die Zeilen, die den Fehler von core file.php auslösen, sind:

 // A properly uploaded file will pass this test. There should be no // reason to override this one. $test_uploaded_file = 'wp_handle_upload' === $action ? @ is_uploaded_file( $file['tmp_name'] ) : @ is_file( $file['tmp_name'] ); if ( $test_upload && ! $test_uploaded_file ) { return call_user_func( $upload_error_handler, $file, __( 'Specified file failed upload test.' ) ); } 

Ich denke, dass der Upload fehlschlägt, weil er meine neu erstellte Datei mit is_uploaded_file testet, die überprüft, ob die Datei HTTP hochgeladen wurde. Wenn es auf dem Server erstellt wurde, schlägt es fehl.

Die Dokumentation für wp handle upload prefilter ( http://codex.wordpress.org/Plugin_API/Filter_Reference/wp_handle_upload_prefilter ) sagt: “Der wp_handle_upload_prefilter bietet Ihnen die Möglichkeit, den Dateinamen zu prüfen oder zu ändern, bevor die Datei an ihren endgültigen Speicherort verschoben wird. ”

Ich habe keine Ideen mehr. Wenn jemand etwas hat, würde ich es lieben, sie zu hören! Prost.

Solutions Collecting From Web of "Ändern eines hochgeladenen Bildes mit ‘wp_get_image_editor’ und ‘wp_handle_upload_prefilter’"

Ich habe mich entschieden, es anders zu machen. Anstatt sich in ‘wp_handle_upload_prefilter’ einzuloggen und die Variable ‘$ datei’ zu manipulieren, habe ich beschlossen, die Größe zu ändern, nachdem die Datei hochgeladen wurde und nachdem ich die Anhangs-ID wie folgt erhalten habe:

 public function resize_attachment($attachment_id, $width, $height) { // Get file path $file = get_attached_file($attachment_id); // Get editor, resize and overwrite file $image_editor = wp_get_image_editor($file); $image_editor->resize(1600, 1600); $saved = $image_editor->save($file); // We need to change the metadata of the attachment to reflect the new size // Get attachment meta $image_meta = get_post_meta($attachment_id, '_wp_attachment_metadata', true); // We need to change width and height in metadata $image_meta['height'] = $saved['height']; $image_meta['width'] = $saved['width']; // Update metadata return update_post_meta($attachment_id, '_wp_attachment_metadata', $image_meta); } 

Dies erscheint übermäßig komplex, wenn WordPress eine native function zum Hinzufügen von Bildgrößen bietet. Ich weiß, dass dies eine andere Datei mit einem anderen Namen hinzufügt, aber wie wird es Ihren Anforderungen nicht gerecht?

function: add_image_size

Das Problem ist, dass Sie das hochgeladene Bild nicht gespeichert haben, nachdem Sie es manipuliert haben, bevor Sie es zurückgeben, damit WP beendet werden kann.

 function original_resize( $image_data ){ //get the orig file in WP image editor $image_editor = wp_get_image_editor( $image_data['file'] ); if ( ! is_wp_error( $image_editor ) ) { //we have image so get relevant settings if($imgRESIZE == true){ $w_RESIZE = 500; $h_RESIZE = 500; //get the dimensions of the original uploaded image $sizeORIG = $image_editor->get_size(); //check if resizing is needed if( ( isset( $sizeORIG['width'] ) && $sizeORIG['width'] > $w_RESIZE ) || ( isset( $sizeORIG['height'] ) && $sizeORIG['height'] > $max_height ) ) { //perform the resize $image_editor->resize( $w_RESIZE, h_RESIZE, false ); //apply minor compression $image_editor->set_quality(80); //save the image $image_editor->save( $image_data['file'] ); } } } //return image in same format as received return $image_data; }