web-dev-qa-db-ja.com

ファイルのアップグレード時にすべての画像をPNGに変換する

私のサイトには、ユーザーが複数の画像をアップロードするためのフロントエンドフォームがあります。

if (!empty($_FILES['vidPix']['tmp_name'][0])) {
                    $i = 1;
                    $files = $_FILES['vidPix'];
                    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("sight" . $i => $file);
add_filter( 'upload_dir', 'wpse_141088_upload_dir' );
add_filter('intermediate_image_sizes_advanced', 'no_image_resizing');

                        $mfile =  wp_handle_upload($files, $upload_overrides );                          
                            $newvidPix = sight("sight" . $i, $v_Id);
remove_filter( 'upload_dir', 'wpse_141088_upload_dir' );
remove_filter('intermediate_image_sizes_advanced', 'no_image_resizing');

                            if ($i == 1) {
                                update_post_meta($v_Id, '_thumbnail_id', $newvidPix);
                            }
                                add_post_meta($v_Id, 'vid_pix', $newvidPix, false);
                        }
                        $i++;
                    }
                }

これはうまくいきますが、今度はファイルをPNGに変換してからフォルダに保存し、古いファイルを削除するようにします。私はこれを見つけました 質問 それは次のコードを示唆しています -

imagepng(imagecreatefromstring(file_get_contents($file)), "output.png");

私のアップロードでどのように動くのかわからないけど。これについてはどうしたらいいでしょうか。

更新 - 単一ファイルのアップロード用

if(isset($_POST["ebc_submit"])) {

    $uploadedfile2 = $_FILES ['ebc_upload'];
    if (! empty ( $uploadedfile2 ['name'] )) {
        $upload_overrides = array (
            'test_form' => false 
        );

add_filter( 'upload_dir', 'wpse_141088_upload_dir' );
add_filter('intermediate_image_sizes_advanced', 'no_image_resizing');

                        $endpic = wp_handle_upload($uploadedfile2, $upload_overrides );

remove_filter( 'upload_dir', 'wpse_141088_upload_dir' );
remove_filter('intermediate_image_sizes_advanced', 'no_image_resizing');

    $im = imagecreatefromstring( file_get_contents( $endpic['file'] ) );
    if ( false !== $im ) {
        $filename = pathinfo( $endpic['file'], PATHINFO_FILENAME );
        $to = dirname( $endpic['file'] ) . '/' . $filename . '.png';

        // Creates the image and saves it in `$to`.
        imagepng( $im, $to );

        // Frees the image from memory.
        imagedestroy( $im );

        // Deletes the original file.
        unlink( $endpic['file'] );

}
// Convert the image to PNG and delete the old image.
attachment_to_png( $uploadedfile2 );

}
}
1
Rich

(更新された答え)

sight()関数は画像をアップロードするだけでなく、添付ファイル(すなわちattachment型の投稿)も作成します。そのため、コードを更新しました。現在はattachment_to_pngという名前のfunctionにあり、その添付ファイルに添付された画像ファイルを取得するためにget_attached_file()を使用し、ファイルパスを更新するためにupdate_attached_file()を使用します。

したがって、次の手順に従ってください。

  1. これをテーマのfunctions.phpファイルに追加してください。

    function attachment_to_png( $att_id ) {
        $file = get_attached_file( $att_id );
        if ( ! $file ) {
            return false;
        }
    
        // Check MIME and make sure it's not already a PNG image.
        $mime = strtolower( mime_content_type( $file ) );
        if ( ! preg_match( '#^image/([a-z]{3,})$#', $mime, $m ) ||
            'png' === $m[1]
        ) {
            return false;
        }
    
        $im = imagecreatefromstring( file_get_contents( $file ) );
        if ( false !== $im ) {
            $filename = pathinfo( $file, PATHINFO_FILENAME );
            $to = dirname( $file ) . '/' . $filename . '.png';
    
            // Creates the image and saves it in `$to`.
            imagepng( $im, $to );
    
            // Frees the image from memory.
            imagedestroy( $im );
    
            // Deletes the original file.
            unlink( $file );
    
            // Update the attached file.
            update_attached_file( $att_id, $to );
        }
    }
    
  2. remove_filter('intermediate_image_sizes_advanced', 'no_image_resizing');の後にこれを追加します。

    // Convert the image to PNG and delete the old image.
    attachment_to_png( $newvidPix );
    

追加のメモ

これは必要ではないと思います。

$mfile =  wp_handle_upload($files, $upload_overrides );

UPDATED Dec 03 2018 UTC

(単一ファイルアップロード用に更新)

  1. $imのものを使うべきではなく、単にattachment_to_png()関数を使うべきです。そして、そのように関数を呼び出します。attachment_to_png( 123 )ここで123は添付IDです。

  2. media_handle_upload()ではなく、アップロードされた画像の添付ファイル投稿を作成するwp_handle_upload()を使用してください。

だからこれを試してみてください。

if ( isset( $_POST["ebc_submit"] ) ) {
    $uploadedfile2 = $_FILES['ebc_upload'];
    if ( ! empty( $uploadedfile2['name'] ) ) {
        $upload_overrides = array(
            'test_form' => false
        );

        add_filter( 'upload_dir', 'wpse_141088_upload_dir' );
        add_filter( 'intermediate_image_sizes_advanced', 'no_image_resizing' );

        // Load media_handle_upload() and other media/image/file functions.
        require_once ABSPATH . 'wp-admin/includes/media.php';
        require_once ABSPATH . 'wp-admin/includes/image.php';
        require_once ABSPATH . 'wp-admin/includes/file.php';

        // $v_Id is the ID of the post where the image should be attached to.
        $endpic = media_handle_upload( 'ebc_upload', $v_Id, array(), $upload_overrides );

        remove_filter( 'upload_dir', 'wpse_141088_upload_dir' );
        remove_filter( 'intermediate_image_sizes_advanced', 'no_image_resizing' );

        // Convert the image to PNG and delete the old image.
        if ( $endpic && ! is_wp_error( $endpic ) ) {
            attachment_to_png( $endpic );
            //echo 'Success!';
        }
    }
}

更新日12月05日2018 UTC

もしあなたが100%確実であればではないということで一意のファイル名を使うことになるでしょう。つまり、以前にアップロードした画像と同じ名前の画像をアップロードすると、wp_unique_filename()で使用されるコールバック関数を作成できます。この場合、元の(ただしサニタイズされた)ファイル名を返します。

// Add this to the theme's functions.php
function no_unique_filename( $dir, $name, $ext ) {
    return $name;
}

そして、$upload_overrides(前の更新を参照)に、次のようにunique_filename_callbackを追加します。

$upload_overrides = array(
    'test_form'                => false,
    'unique_filename_callback' => 'no_unique_filename',
);
1
Sally CJ