WordPress の -scaled 画像を無効化する方法(big_image_size_threshold)
big_image_size_threshold フィルターで 2560px の上限を引き上げるか撤廃し、ぼやけた画像を解消する。多くの人が飛ばしてしまう「再アップロード」の理由も解説します。
公開
big_image_size_threshold に false を返すフィルターを追加すれば、WordPress はアップロード時に -scaled のコピーを作らなくなります。代わりに数値を返せば、上限を撤廃せずに引き上げられます。どちらも functions.php か小さな mu-plugin に置き、効くのはフィルターが有効になった後のアップロードだけです。
// Disable the cap entirely — no -scaled copies at all.
add_filter( 'big_image_size_threshold', '__return_false' );
// Or just raise it. Longest edge, in pixels.
add_filter( 'big_image_size_threshold', function () {
return 3840;
} );
WordPress が実際にやっていること
WordPress 5.3 以降、アップロードされた画像はすべて長辺を測定されます。その長辺が big_image_size_threshold(初期値は 2560px)より大きい場合、WordPress は画像をその上限まで再エンコードし、your-photo-scaled.jpg として保存し、full サイズが縮小コピーを指すように添付ファイルのメタデータを書き換えます。
元のファイルは削除されません。元のファイル名のままディスクに残り、添付ファイルのメタデータにも記録され、PHP からは wp_get_original_image_path() で参照できます。ただしフロント側でそれを配信するものは何もありません。ブロックエディターも、srcset も、メディアライブラリのプレビューも使いません。アーカイブ用のコピーとして置かれているだけです。
そして下流のすべては、アップロードした画像ではなく縮小ファイルから生成されます。
| サイズ | 生成元 |
|---|---|
full | -scaled のコピー |
large、medium_large、medium、thumbnail | -scaled のコピー |
add_image_size によるカスタムサイズ | -scaled のコピー |
テーマやプラグインのサイズ(例:woocommerce_thumbnail) | -scaled のコピー |
srcset の候補 | -scaled のコピー |
この一点こそが、多くの人がつまずく理由です。
「鮮明なはずの画像がぼやける」原因はたいていこれ
同時に二つのことが起きていて、そのうち片方しか目に見えません。
分かりやすいのは解像度です。全幅ヒーロー用に 4000px の写真をアップロードしても、WordPress がブラウザーに渡すのは 2560px です。標準的なディスプレイで 1600px の枠を埋める分には誰も気づきません。しかし 2 倍の Retina 画面では、その枠に実ピクセルで約 3200px が必要なのに 2560px しか届かず、ブラウザーが差分を引き伸ばします。輪郭が甘くなり、ディテールが潰れ、画像内の文字がぼやけます。
分かりにくいのは再エンコードのほうです。-scaled のコピーは元ファイルを無劣化で切り出したものではありません。WordPress はアップロードされた画像をデコードし、リサイズし、独自の JPEG 品質設定で再圧縮します。元画像が Lightroom やスマートフォンから出てきた時点ですでに圧縮済みの JPEG だった場合、これは二世代目のエンコードです。圧縮ノイズの上に圧縮ノイズが重なります。細かいディテール、フィルムグレイン、なだらかなグラデーションが特に強い影響を受けます。ピクセル数が足りているように見える場合でも、この劣化は視認できます。
何かを変える前に確認してください。画像を新しいタブで開き、URL のファイル名を読みます。-scaled.jpg なら上限が働いています。-1536x1024.jpg のような寸法付きのサフィックスは別の話で、srcset が小さすぎる中間サイズを選んだということです。この場合しきい値のフィルターでは解決しません。
サーバー上ではこうです。
find wp-content/uploads -name '*-scaled.*' | wc -l
この数が大きければ、上限がライブラリ全体の見え方を左右してきたということです。
設定を決める前にscaled 画像の無効化ツールにファイルを投入すれば、その元画像がしきい値に引っかかるかどうか、縮小コピーが何ピクセルになるかを確認できます。
正直なトレードオフ
多くの記事は「上限を無効にするとディスク容量を食う」と書いています。これは逆で、正確に説明する価値があります。
画像 1 枚あたりのディスク使用量はわずかに減ります。 しきい値が有効だと、WordPress は元画像に加えて大きな縮小コピーも保存します。無効にすれば元画像だけです。2 ファイルが 1 ファイルになります。
転送量とページ重量は増えます。場合によっては大幅に。 上限を切ると full は手つかずのアップロード原本になります。フルサイズをリンクまたは表示するもの、たとえばライトボックス、ギャラリープラグイン、「原寸を表示」リンク、ヒーロー画像に full を要求するテーマなどは、900KB で済んでいたところに 6MB のファイルを配信することになります。モバイルでは Largest Contentful Paint の実害になりますし、画像 CDN も必ず救ってくれるとは限りません。一定サイズを超えると素通しする実装があるためです。
アップロード時のメモリ使用量が増えます。 6000px の画像を PHP でリサイズするには、2560px の場合よりかなり多くのメモリが必要です。PHP のメモリ上限が低い安価な共用ホスティングでは、上限を無効にした結果アップロードが失敗したり、サムネイルが途中までしか生成されなかったりする可能性が十分あります。撤廃するのではなく 3840 に引き上げるのが、同じ変更のより安全な形です。
だからこそ、多くのサイトにとって妥当な既定路線は「数値を上げる」であって「取り除く」ではありません。取り除くのが正しいのは、印刷品質のギャラリー、商品の拡大表示、建築写真など、ユーザーが原寸を細かく見ることを前提とした、本当にフル解像度が必要な画像を配信する場合です。
変更を正しく適用する
1. 消えない場所にフィルターを置く。 子テーマの functions.php でも動きます。ただし 1 ファイルの mu-plugin のほうが望ましいです。テーマを切り替えても黙って無効化されることがありません。
<?php
/**
* Plugin Name: Raise big image threshold
*/
add_filter( 'big_image_size_threshold', function () {
return 3840;
} );
2. 対象の画像をアップロードし直す。 ここを飛ばして「フィルターが効かない」と結論づける人が非常に多いです。しきい値が評価されるのはアップロード時の一度きりで、既存の添付ファイルは古いメタデータを永久に持ち続けます。添付ファイルを削除して再アップロードし、投稿内の参照を貼り直してください。
3. サムネイルの再生成に期待しない。 WP-CLI の wp media regenerate は、メタデータがフルサイズと呼んでいるファイルから中間サイズを作り直します。すでに上限が適用された画像では、それは -scaled のコピーです。失われたディテールは復元できません。再アップロード後の後片付けとしては有用ですが、単独の解決策としては無意味です。
4. 結果は推測せず確認する。 再アップロード後、フロント側で画像を開いてもう一度ファイル名を読んでください。-scaled が付いていなければフィルターは効いています。
無効化が的外れなケース
元画像がすでに 2560px 未満なのにぼやけて見えるなら、しきい値はそもそも関係していません。表示枠が使えるピクセル数より大きいことが問題であり、答えはより大きな元ファイルか、より小さなコンテナであって、このフィルターではありません。
配信されているファイル名が -scaled ではなく寸法付きのサフィックスなら、srcset が小さい候補を選んでいます。これはたいてい、テーマが宣言しているコンテンツ幅と、画像が実際に描画される枠との食い違いが原因です。上限を切っても何も変わりません。
そして、プラグインが src を最適化サービスや CDN のプロキシに書き換えている場合は、そのプロキシが何を配信しているかを確認するまでこの話は適用できません。WordPress が生成しているはずのものと、ブラウザーが実際に読み込んだものを比べてください。食い違っていたら、その間に挟まっているものを疑います。
FAQ
よくある質問
WordPress の scaled 画像を無効にするには?
big_image_size_threshold にフィルターを追加し、false を返すようにします。置き場所は functions.php か小さな mu-plugin です。false を返すと上限そのものが無効になるため、アップロードした画像は元の寸法のまま保存され、-scaled のコピーも作られません。false ではなく 3840 のような数値を返せば、上限を撤廃せずに引き上げることになります。
WordPress のファイル名に付く -scaled とは何ですか?
アップロードした画像の長辺が 2560px を超えたために WordPress が再エンコードして作ったコピーを表す印です。そのコピーがサイト全体でフルサイズとして扱われます。元のファイルは通常のファイル名のままディスク上に残りますが、フロント側からリンクされることはなく、すべてのサムネイルと srcset の候補はこの縮小コピーから生成されます。
scaled 画像を無効にするとディスク容量は増えますか?
画像 1 枚あたりで見ると、むしろわずかに減ることが多いです。WordPress が元ファイルの横にもう一つ大きなファイルを書き出さなくなるためです。本当のコストはストレージではなく転送量です。上限を切ると、フルサイズをリンクしている箇所は手つかずの元ファイルを配信するため、モバイル回線では数 MB を送ることになります。
しきい値を無効にすれば、すでにぼやけている画像は直りますか?
直りません。フィルターが効くのは新規アップロードだけです。すでにメディアライブラリにある画像は縮小コピーを指すメタデータを持ち続け、サムネイルを再生成しても同じ上限付きファイルから作り直されます。解像度を取り戻すには、フィルターを有効にしたうえで添付ファイルを削除し、アップロードし直す必要があります。
しきい値は 2560px のままでよいですか?
多くのコンテンツサイトではそれで妥当です。2560px の元画像は、ピクセル密度 2 倍の環境で 1280px の表示枠をカバーでき、これが一般的なケースです。全幅のヒーロー画像、商品の拡大表示、写真ギャラリーを扱うなら 3840 に引き上げてください。完全に無効化するのは、手を加えていない原寸を配信する必要が本当にある場合だけです。