web-dev-qa-db-fra.com

Modification d'une image téléchargée avec 'wp_get_image_editor' et 'wp_handle_upload_prefilter'

J'essaie d'intercepter un téléchargement d'image, de le redimensionner, puis de laisser le téléchargement se poursuivre.

J'utilise le filtre wp_handle_upload_prefilter qui passe en argument un tableau $ FileES à fichier unique.

Je charge l'éditeur d'images avec wp_get_image_editor ($ file ['tmp_name']), le redimensionne et le sauvegarde sous un nouveau nom. Tout cela fonctionne bien et l'image redimensionnée est créée sur mon dossier tmp. Tout va bien jusqu'à ici.

Cependant, l'objectif est de remplacer l'image d'origine par celle redimensionnée.

Je modifie donc le $ fichier ['name'] et le '' tmp_name '] pour qu'il pointe vers le nouveau fichier et renvoie le fichier $. Cependant, Wordpress ne l'aime pas car il pense que je suis en train d'effectuer un piratage de fichier et génère une erreur "Le test de téléchargement du fichier spécifié a échoué (core file.php L297)"

Si je ne modifie pas la variable $ file transmise initialement, je reçois une image redimensionnée sur mon dossier tmp, mais l'image d'origine de grande taille est téléchargée à la place de celle redimensionnée.

En dessous de la fonction:

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;

J'ai également essayé d'utiliser $ image_editor-> save ($ fichier ['tmp_name']) pour enregistrer mon image redimensionnée par rapport à celle d'origine, mais j'obtiens toujours la même erreur. Le fichier est cependant écrasé.

J'ai donc essayé de remplacer tmp_name par un nouveau fichier et de l'écraser lui-même sans succès.

Les lignes qui génèrent l'erreur de core file.php sont:

// 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.' ) );
}

Je pense que le téléchargement échoue car il teste mon fichier nouvellement créé avec is_uploaded_file qui vérifie si le fichier a été transféré via HTTP. En le voyant créé sur le serveur, il échouera.

Les documents pour wp manipulent le préfiltre de téléchargement ( http://codex.wordpress.org/Plugin_API/Filter_Reference/wp_handle_upload_prefilter ) disent: "Le wp_handle_upload_prefilter vous offre la possibilité d’examiner ou de modifier le nom de fichier avant que le fichier ne soit déplacé. son emplacement final. "

Je suis à court d'idées. Si quelqu'un en a, j'aimerais les entendre! À votre santé.

3
Fred John

J'ai décidé de l'aborder différemment. Au lieu d'accroche dans 'wp_handle_upload_prefilter' et de falsification de la variable $ file, j'ai décidé de redimensionner le fichier une fois que le fichier a été chargé et que j'obtiens l'identifiant de la pièce jointe comme suit:

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

}
8
Fred John

Cela semble excessivement complexe lorsque Wordpress propose une fonction native permettant d’ajouter des tailles d’image. Je sais que cela ajoute un autre fichier avec un nom différent, mais comment ne répond-il PAS à vos besoins?

Fonction: add_image_size

1
skim-

Le problème est que vous n'avez pas enregistré l'image téléchargée après l'avoir manipulée, avant de la renvoyer pour permettre à WP de se terminer.

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;
    }
0
Phill Healey