Modificando uma imagem carregada com 'wp_get_image_editor' e 'wp_handle_upload_prefilter'

3

Estou tentando interceptar um upload de imagem, redimensioná-lo e deixar o upload continuar.

Estou usando o filtro wp_handle_upload_prefilter que passa como argumento um único arquivo $ FILES array.

Eu carrego o editor de imagem com o wp_get_image_editor ($ file ['tmp_name']), redimensiono e salvo com um novo nome. Isso tudo funciona bem e a imagem redimensionada é criada na minha pasta tmp. Tudo bem até aqui.

No entanto, o objetivo é substituir a imagem original pela redimensionada.

Então eu altero o $ file ['name'] e ['tmp_name'] para apontar para o novo arquivo e retornar o arquivo $. No entanto, o Wordpress não gosta, pois acha que estou executando um seqüestro de arquivo e lança um erro "arquivo especificado falhou teste de upload (core file.php L297)"

Se eu não alterar a variável $ file passada inicialmente, recebo uma imagem redimensionada na minha pasta tmp, mas a imagem original em tamanho grande é carregada em vez da minha redimensionada.

Abaixo da função:

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;

Eu também tentei usar $ image_editor- > save ($ file ['tmp_name']) para salvar minha imagem redimensionada sobre a original, mas ainda recebo o mesmo erro. O arquivo é sobrescrito.

Então eu tentei mudar o tmp_name para um novo arquivo e sobrescrevê-lo sem sorte.

As linhas que lançam o erro do core file.php são:

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

Acho que o upload falha porque está testando o arquivo recém-criado com is_uploaded_file, que verifica se o arquivo foi enviado por HTTP. Vendo que foi criado no servidor, ele irá falhar.

Os documentos para o pré-filtro de upload do wp handle ( enlace ) dizem: "O wp_handle_upload_prefilter oferece a oportunidade de examine ou altere o nome do arquivo antes que o arquivo seja movido para o local final. "

Estou sem ideias. Se alguém tem algum eu adoraria ouvi-los! Felicidades.

    
por Fred John 11.11.2014 / 20:06

3 respostas

7

Eu decidi abordar isso de forma diferente. Em vez de ligar para 'wp_handle_upload_prefilter' e adulterar a variável $ file, decidi fazer o redimensionamento depois que o arquivo é carregado e depois de obter o ID do anexo assim:

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

}
    
por Fred John 11.11.2014 / 21:05
1

Isso parece excessivamente complexo, quando o Wordpress oferece uma função nativa para adicionar tamanhos de imagem. Eu sei que isso adiciona outro arquivo com um nome diferente, mas como NÃO atende às suas necessidades?

Função: add_image_size

    
por skim- 11.11.2014 / 20:13
0

O problema é que você não estava salvando a imagem enviada depois de manipulá-la, antes de devolvê-la para permitir que o WP termine.

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;
    }
    
por Phill Healey 20.10.2017 / 16:30