web-dev-qa-db-ja.com

'wp_get_image_editor'と 'wp_handle_upload_prefilter'を使ってアップロードされた画像を修正する

画像のアップロードを傍受し、サイズを変更してからアップロードを続行しようとしています。

私は引数として単一のファイル$ FILES配列を渡すフィルタwp_handle_upload_prefilterを使用しています。

Wp_get_image_editor($ file ['tmp_name'])でイメージエディタをロードし、サイズを変更して新しい名前で保存します。これはすべてうまくいき、リサイズされた画像 が私のtmpフォルダに作成されます 。ここまではすべて問題ありません。

ただし、目的は元の画像をサイズ変更した画像に置き換えることです。

そこで、$ file ['name']と['tmp_name']を新しいファイルを指すように変更して$ fileを返します。しかし、Wordpressはファイルハイジャックを実行していると判断し、「指定されたファイルのアップロードテストに失敗しました(core file.php L297)」というエラーをスローします。

最初に渡された$ file変数を変更しない場合は、tmpフォルダにサイズ変更された画像が表示されますが、サイズ変更された画像ではなく元の大きいサイズの画像がアップロードされます。

機能の下に:

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;

私は$ image_editor-> save($ file ['tmp_name'])を使ってリサイズした画像を元の画像の上に保存しようとしましたが、それでも同じエラーになります。ファイルは上書きされますが。

それで、私はtmp_nameを新しいファイルに変更して、そのファイル自体もうまく運ばずに上書きしようとしました。

Core file.phpからエラーをスローする行は以下のとおりです。

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

ファイルがHTTPでアップロードされたかどうかをチェックするis_uploaded_fileを使用して、新しく作成したファイルをテストしているため、アップロードは失敗すると思います。それがサーバーで作成されたのを見ると、失敗します。

Wpハンドルのアップロードプレフィルタ( http://codex.wordpress.org/Plugin_API/Filter_Reference/wp_handle_upload_prefilter )のドキュメントには、次のように記載されています。その最終的な場所」

私はアイデアがないです。誰かが何かを持っているなら、私はそれらを聞きたいです!乾杯。

3
Fred John

私は別の方法でアプローチすることにしました。 'wp_handle_upload_prefilter'にフックして$ file変数を改ざんする代わりに、ファイルがアップロードされた後、次のように添付ファイルIDを取得した後にサイズ変更を行うことにしました。

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

Wordpressが画像サイズを追加するためのネイティブ関数を提供するとき、これは非常に複雑に思えます。これは別の名前の別のファイルを追加することを知っています、しかしそれはどのようにあなたのニーズを満たさないのですか?

関数:add_image_size

1
skim-

問題は、アップロードした画像を操作した後、WPを終了できるように戻す前に保存していなかったことです。

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