web-dev-qa-db-ja.com

必要なときだけサムネイルを生成するにはどうすればいいですか?

私は1000枚の画像を持っています。どのように私は必要なときだけ親指を生成するためにワードプレスを作ることができますか。たとえば、ホームスライダーは10個の画像しか使用しません。他の1000個の画像には、そのサムネイルがスペースとリソースの無駄遣いとして生成されることは望ましくありません。

必要なときだけadd_image_sizeを起動する方法はありますか?

ありがとう

_ update _ おっしゃるとおり、add_image_sizeは実際には必要ありません。それが素晴らしいことは私が the_post_thumbnail( 'slider-thumb');を使用するときに画像サイズを変更することです。 多分これは画像の最初のビューを遅くしますが、そのビューは通常私が実際に投稿をレビューするときに私が生成しますので気にしません。

だから私の投稿、スライダー、ブログのサムネイル、ポートフォリオのサムネイルなどの間に私は1000枚の画像を持っていて、私はスライダーのためにたった10枚の画像のサイズ変更をしたい。

その明確な今、私の英語をごめんね願っています

17
chifliiiii

Ottoの Dynamic Image Resizerプラグインを見てください

このプラグインは、実際にどこかでその場で使用されている場合にのみWordPressが画像を生成するように画像の作成方法を変更します。このようにして作成された画像は、後でウェブサーバによって高速送信するために、通常のアップロードディレクトリに保存されます。その結果、スペースが節約され(イメージは必要なときにのみ作成されるため)、イメージのアップロードははるかに高速になります(アップロード時にイメージが生成されなくなるため)。

12
Chris_O

これをあなたのテーマ関数ファイルに入れてください。アップロード時にWordpressが3つのデフォルトサイズ以外のものを作成するのを防ぎます。

その後、まだ生成されていない特定のサイズで画像が要求されると、その画像は1回だけ作成されます。

        add_filter('image_downsize', 'ml_media_downsize', 10, 3);
        function ml_media_downsize($out, $id, $size) {
            // If image size exists let WP serve it like normally
            $imagedata = wp_get_attachment_metadata($id);
            if (is_array($imagedata) && isset($imagedata['sizes'][$size]))
                return false;

            // Check that the requested size exists, or abort
            global $_wp_additional_image_sizes;
            if (!isset($_wp_additional_image_sizes[$size]))
                return false;

            // Make the new thumb
            if (!$resized = image_make_intermediate_size(
                get_attached_file($id),
                $_wp_additional_image_sizes[$size]['width'],
                $_wp_additional_image_sizes[$size]['height'],
                $_wp_additional_image_sizes[$size]['crop']
            ))
                return false;

            // Save image meta, or WP can't see that the thumb exists now
            $imagedata['sizes'][$size] = $resized;
            wp_update_attachment_metadata($id, $imagedata);

            // Return the array for displaying the resized image
            $att_url = wp_get_attachment_url($id);
            return array(dirname($att_url) . '/' . $resized['file'], $resized['width'], $resized['height'], true);
        }


        add_filter('intermediate_image_sizes_advanced', 'ml_media_prevent_resize_on_upload');
        function ml_media_prevent_resize_on_upload($sizes) {
            // Removing these defaults might cause problems, so we don't
            return array(
                'thumbnail' => $sizes['thumbnail'],
                'medium' => $sizes['medium'],
                'large' => $sizes['large']
            );
        }
6
Patrick

残念ながら、@ Patrickの回答はWP 4.4で導入されたsrcset関数を壊しています。幸い、2つの機能を追加するだけでいいのです。

まず、登録されたすべてのサムネイルサイズを一時的に画像メタデータに再導入して、それらが考慮されるようにする必要があります。

function bi_wp_calculate_image_srcset_meta($image_meta, $size_array, $image_src, $attachment_id){
    //all registered sizes
    global $_wp_additional_image_sizes;

    //some source file specs we'll use a lot
    $src_path = get_attached_file($attachment_id);
    $src_info = pathinfo($src_path);
    $src_root = trailingslashit($src_info['dirname']);
    $src_ext = $src_info['extension'];
    $src_mime = wp_check_filetype($src_path);
    $src_mime = $src_mime['type'];
    $src_base = wp_basename($src_path, ".$src_ext");

    //find what's missing
    foreach($_wp_additional_image_sizes AS $k=>$v)
    {
        if(!isset($image_meta['sizes'][$k]))
        {
            //first, let's find out how things would play out dimensionally
            $new_size = image_resize_dimensions($image_meta['width'], $image_meta['height'], $v['width'], $v['height'], $v['crop']);
            if(!$new_size)
                continue;
            $new_w = (int) $new_size[4];
            $new_h = (int) $new_size[5];

            //bad values
            if(!$new_h || !$new_w)
                continue;

            //generate a filename the same way WP_Image_Editor would
            $new_f = wp_basename("{$src_root}{$src_base}-{$new_w}x{$new_h}." . strtolower($src_ext));

            //finally, add it!
            $image_meta['sizes'][$k] = array(
                'file'      => $new_f,
                'width'     => $new_w,
                'height'    => $new_h,
                'mime-type' => $src_mime
            );
        }
    }

    return $image_meta;
}
add_filter('wp_calculate_image_srcset_meta', 'bi_wp_calculate_image_srcset_meta', 10, 4);

それから私達はマッチを調べて行方不明のサムネイルを生成する必要があります:

function bi_wp_calculate_image_srcset($sources, $size_array, $image_src, $image_meta, $attachment_id){

    //get some source info
    $src_path = get_attached_file($attachment_id);
    $src_root = trailingslashit(pathinfo($src_path, PATHINFO_DIRNAME));

    //the actual image metadata (which might be altered here)
    $src_meta = wp_get_attachment_metadata($attachment_id);

    //an array of possible sizes to search through
    $sizes = $image_meta['sizes'];
    unset($sizes['thumbnail']);
    unset($sizes['medium']);
    unset($sizes['large']);

    $new = false;

    //loop through sources
    foreach($sources AS $k=>$v)
    {
        $name = wp_basename($v['url']);
        if(!file_exists("{$src_root}{$name}"))
        {
            //find the corresponding size
            foreach($sizes AS $k2=>$v2)
            {
                //we have a match!
                if($v2['file'] === $name)
                {
                    //make it
                    if(!$resized = image_make_intermediate_size(
                        $src_path,
                        $v2['width'],
                        $v2['height'],
                        $v2['crop']
                    )){
                        //remove from sources on failure
                        unset($sources[$k]);
                    }
                    else
                    {
                        //add the new thumb to the true meta
                        $new = true;
                        $src_meta['sizes'][$k2] = $resized;
                    }

                    //remove from the sizes array so we have
                    //less to search next time
                    unset($sizes[$k2]);
                    break;
                }//match
            }//each size
        }//each 404
    }//each source

    //if we generated something, update the attachment meta
    if($new)
        wp_update_attachment_metadata($attachment_id, $src_meta);

    return $sources;
}
add_filter('wp_calculate_image_srcset', 'bi_wp_calculate_image_srcset', 10, 5);
2
Josh

実際には、add_image_size()はサムネイルを生成しません、それはWordPressに利用できるようにただイメージサイズを登録します。

通常、サムネイルは画像が最初にアップロードされたときに生成されます。これは自動処理なので、後で生成する必要はありません。このように考えてください - 遅いサーバーでサムネイルを生成するのに1〜2秒かかり、要求されるまで待つ場合は、要求先に追加の1〜2秒画像あたりを待つよう強制します。コンテンツ。画像をアップロードするときには、事前に行うほうがはるかに簡単です。

同時に、もしあなたが絶対に別の時にサムネイルを処理しなければならないなら、あなたは Viper's Regenerate Thumbnails pluginを見たいかもしれません。それはあなたのイメージのサムネイルのallを再生成するためにオンデマンドのアクションを使います...しかしあなたが必要なときだけサムネイルを生成するために同様のコードを使うことができます。

1
EAMann

必要なときだけadd_image_sizeを起動する方法はありますか?

ではない正確に。しかし、サムネイルが生成される直前に登録サイズのリストをフィルタリングすることができます。 wp_generate_attachment_metadata()関数(サムネイルを生成する関数を呼び出す)には、 "intermediate_image_sizes_advanced"という名前のフィルタがあり、ファイルを生成する直前にサイズの配列を操作できます。特定の「種類」の画像を追加するときはいつでもこのフィルタを使用し、その後すぐにそれを削除することができます。

私はあなたの最大の課題は、余分なサイズが必要な画像とそうでない画像をどのように区別するかを理解することであると思います。

1
MathSmath

あなたはこのプラグインを試すことができます: https://wordpress.org/plugins/optimize-images-resizing

登録された画像サイズに基づいて画像のサイズを変更しますが、必要なときだけです。また、既存の画像サイズをクリーンアップして再生成することもできます。

1
user2128576

あなたは私の(Ottosではない)を使用することができます"動的画像サイズ変更" 1) プラグイン.

“ Dynamic Image Resize”は、TimThumbを必要とせずにWPコア関数を使用して、「オンザフライ」で画像のサイズを変更するためのショートコードとテンプレートタグを提供するWordPress(MU-)プラグインです。

プラグインにはテンプレートタグと shortcode も付いています。

1)Ottosプラグインについて知りました。命名の衝突は意図されていませんでした。

1
kaiser

WP Performance Pack pluginはOttos Dynamic Image Resizerをベースとした "画像処理の改善"を提供しますが、多くの改善が含まれます。例えば、まず第一に最新のWordPressバージョン(3.9)と互換性があります。 1)、WP_Image_Editorを使用して、サムネイルの保存をオフにすることができます(しかし、それらはキャッシュすることができ、CDNサポートはその代わりにあります)、再生サムネイル統合(既存のサムネイルを削除するため)など。

0
Björn