web-dev-qa-db-ja.com

レスポンシブ画像 - Theme Customizerコントロールのアップロードから複数の画像を生成する

そのため、コード内を見回した後、フィルタimage_make_intermediate_sizeは、さまざまなWP_Customize_Control()クラスによってWP_Customize_Image_Control()またはその親のWP_Customize_Upload_Control()のどちらからも呼び出されないように見えます。

レスポンシブ画像を提供するために、さまざまなサイズの画像を自動生成することを検討しています。拡張カスタムコントロールに固有のカスタムサイズを指定してimage_make_intermediate_size()関数を実行する必要があります。アップロードされた画像が確実にこの関数を呼び出すようにする方法がわからないのは、主に、関数が通常実行されるデフォルトのアップロード動作からWP_Customize_Control()のアップロード機能がどこでどのように「アンフック」されるのかを突き止められなかったためです。

動作方法は明らかに最善の選択です、テーマカスタマイザを通してアップロードされたすべての画像がすべてのデフォルト画像サイズを自動生成したくないことに注意してください、しかし私のユースケースのために、私はネイティブ機能を使うことを好みますimage_make_intermediate_size()のサイズパラメータ.

2
Brian

誰かがもっと良い解決策を持っているなら、私はそれに寛容ですが、私が思いついたことはうまくいくようです。

基本的には、次のコードは画像がアップロードされてadd_attachmentアクションにフックされるのを待つだけです。最初のものが追加されたら、add_attachmentアクションによって私たちに渡される唯一のデータであるpost ID(画像添付用)を介して新しい画像をフックして生成します。

まず、IDで投稿を呼び出してイメージを取得してから、正規表現を使ってさまざまなファイルパス、ファイル名、その他のデータビットを保存します。異なるサイズの3つの画像を再帰的に追加しているので、1つまたは複数の異なるサイズの画像を作成するだけの場合は、変更してください。また、私は私のテーマを$_POSTデータの前提条件として、さまざまな画像アップロードアクションでこのデータを見ることから、テーマカスタマイザ内にあるための条件を設定する最も具体的な方法のようです。他には余りありませんが、イメージエディタを利用するその他の分野には$_POST['post_data']['theme']はありません。そのため、テーマ名に置き換えるか、すべてのテーマに適用したい場合はproperty_existsを使用します。

add_filter('add_attachment','generate_responsive_sizes');

function generate_responsive_sizes( $attachment_id ) {

    $image_data = get_post( $attachment_id );

    // quit if the post_type is not attachment and mime_type is not jpeg/jpg/gif
    if ( $image_data->post_type != 'attachment' || $image_data->post_mime_type != ( 'image/jpeg' || 'image/png' || 'image/gif' ) )
        return false;

    // quit if the theme is not pure - only PURE gets responsive images, add new themes with responsive images  here
    if ( $_POST['post_data']['theme'] != 'pure' )
        return false;

    $file = substr( strrchr( $image_data->guid, '/' ), 1 );
    $filepath = str_replace( $file, '', $image_data->guid );
    $file_arr = preg_split( '/\./', $file );
    $filename = $file_arr[0];
    $file_ext = $file_arr[1];
    $upload_dir = wp_upload_dir();

    $sizes = array(
            '1024' => array(
                    'width' => 1024,
                    'height' => 768,
                    'crop' => true,
                ),
            '1680' => array(
                    'width' => 1680,
                    'height' => 1050,
                    'crop' => true,
                ),
            '2560' => array(
                    'width' => 2560,
                    'height' => 1440,
                    'crop' => true,
                ),
        );

    if ( ! is_wp_error( $image ) ) {
        foreach ($sizes as $key => $value) {
            $image = wp_get_image_editor( $image_data->guid );
            $dimensions = $image->get_size();
            if ( $dimensions['width'] < $value['width'] && $dimensions['height'] < $value['height'] ) {
                continue;
            }
            $image->resize( $value['width'], $value['height'], $value['crop'] );
            if ( $dimensions['width'] < $value['width'] ) {
                $value['width'] = $dimensions['width'];
            }
            $image->save( $upload_dir['path'] . '/' . $filename . '-' . $value['width'] . 'x' . $value['height'] . '.' . $file_ext );
        }
    }

}
2
Brian