WordPressで画像が表示されない時の対処法(アップロードは成功している)

実測 に検証

メディアライブラリには画像が並んでいる。でも記事に貼ると表示されない。 管理画面のサムネイルも壊れたアイコンになっている。

アップロードは成功しているのに表示されない場合、 「ファイルが無い」か「URL が違う」か「読めない」のどれかです。 実測して切り分け方をまとめました。

実測: 画像が無いと 404 で 20KB の HTML が返る

存在しない画像の URL を直接叩いた結果です。

HTTP/1.1 404 Not Found
Content-Type: text/html
20,737 bytes

画像を頼んだのに、20KB の HTML(WordPress の 404 ページ)が返ります。

.htaccess(nginx なら try_files)が、存在しないファイルへのリクエストを index.php に流すためです。

ここから 2 つのことが言えます。

  • 開発者ツールで「20KB 転送された」と見えても中身は画像ではありません。 サイズだけ見て「読めている」と判断すると外します
  • 欠けている画像 1 枚ごとに WordPress のフルページ生成が走ります。 画像が 50 枚欠けたページを開くと、1 回の表示で 50 回 WordPress が起動します。 表示の問題であると同時に、サーバー負荷の問題です

なお、WordPress 側の添付データは残ります。実測では実ファイルを消しても 添付の投稿ステータスは inherit のままでした。 メディアライブラリに並んでいることは、ファイルが存在する証拠になりません。

画像が壊れたアイコンになっている

記事は正常に表示され、画像の位置に alt 文字列だけが残る

原因 1: ファイルを移行していない(最多)

サーバー移行でデータベースだけ移して wp-content/uploads を忘れる、 あるいは容量が大きいので後回しにして忘れる、というパターンです。

症状の特徴は 全部の画像が一律に表示されないことです。

# 記事中の画像 URL を 1 つ取って直接叩く
curl -s -o /dev/null -w '%{http_code}\n' \
  "https://example.com/wp-content/uploads/2026/09/sample.png"

404 なら、サーバー上の実ファイルを探します。

ls -la wp-content/uploads/2026/09/

ディレクトリごと無いなら移行漏れです。

原因 2: URL が違う(移行・SSL 化の直後)

ファイルはあるのに URL が別のドメインやスキームを指している場合です。 開発者ツールでリクエスト先のドメインを見ると分かります。

WordPress が画像 URL を組み立てる元になる値を確認します。

wp eval '$d = wp_upload_dir(); echo "basedir=", $d["basedir"], "\nbaseurl=", $d["baseurl"], "\n";'

実測環境の値です。

basedir=/var/www/html/wp-content/uploads
baseurl=http://localhost:8080/wp-content/uploads

baseurl が実際のアクセス先と違っていたら、そこが原因です。

baseurl はサイト URL から作られます。そしてサイト URL は wp-config.php の定数がデータベースより優先されます。

define( 'WP_HOME', 'http://old-domain.example' );   // これが残っていると DB を直しても変わらない
define( 'WP_SITEURL', 'http://old-domain.example' );

実測でも、DB を 127.0.0.1 に書き換えても実効値は定数の localhost のままでした。 「phpMyAdmin で URL を直したのに画像が古いドメインを向いている」の正体です。

記事本文に埋め込まれた URL も置換が必要です。

wp search-replace 'http://old-domain.example' 'https://new-domain.example' \
  --all-tables --skip-columns=guid

→ 詳細は SSL 化したら画像・CSS が読み込めない

原因 3: 読めない(パーミッション)

ファイルはあり URL も正しいが、Web サーバーが読めない場合です。 403 が返ります(404 ではありません)。

ディレクトリ  755
ファイル      644

移行時に tar や FTP で権限が変わると起きます。 403 が返っていたらパーミッション、404 ならファイルが無い、 と覚えると速いです。

原因 4: サムネイルだけ無い

元画像は表示されるが、一覧やアイキャッチだけ壊れている場合です。

WordPress はアップロード時に複数のサイズを生成し、 sample-150x150.png のような別ファイルとして保存します。 移行でこれらが欠けると、サムネイルだけ 404 になります。

元画像があるなら再生成できます。

wp media regenerate --yes

サムネイルが一度も生成されていない場合は、 画像処理の拡張(GD / Imagick)が無いか、リサイズ中にメモリ不足で 失敗しています。→ 画像をアップロードできない

原因 5: 混在コンテンツ

https のページから http の画像を読むと、ブラウザがブロックします。 ステータスは 200 なのに表示されません。

コンソールに Mixed Content: ... was blocked が出ます。 → SSL 化したら画像・CSS が読み込めない

切り分けの順番

ステータスコードだけで 3 つに割れます。

curl -s -o /dev/null -w '%{http_code}\n' "https://example.com/wp-content/uploads/2026/09/sample.png"
結果原因
404ファイルが無い(移行漏れ、削除、サムネイル未生成)
403パーミッション
200 なのに表示されない混在コンテンツ、または中身が壊れている
別のドメインにリクエストが飛んでいるURL の設定(定数・DB・本文)

ページの中でどの画像が欠けているかは、ブラウザの開発者ツールで一覧できます。 「ネットワーク」タブを開いてページを再読み込みし、種類を「画像(Img)」に絞って、 ステータスが 404 や 403 の行を探します。

再現手順

# 画像を置いて、消して、レスポンスを比べる
python3 -c "
import base64, pathlib
pathlib.Path('src/wp-content/uploads/2026/09/t.png').write_bytes(
  base64.b64decode('iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8z8DwHwAFAAH/q842iQAAAABJRU5ErkJggg=='))"

curl -s -o /dev/null -w '%{http_code}\n' http://localhost:8080/wp-content/uploads/2026/09/t.png   # 200
rm src/wp-content/uploads/2026/09/t.png
curl -s -o /dev/null -D - http://localhost:8080/wp-content/uploads/2026/09/t.png | head -3
# → 404 / Content-Type: text/html / 20KB