WordPressでメディアライブラリに画像一覧が表示されない対処

かなりハマったのでメモ。まぁちゃんと確認すればすぐ終わるような内容なんだが。

WordPressは3.8.1

以下の様な状態であればこれ疑ってみるといいかも。

  • 管理画面のメニュー>「メディア」>「ライブラリ」のページには画像が表示される。

貼り付けた画像 2014 03 28 11 21

  • 但し「投稿」や「固定ページ」の作成/編集時に「メディアを追加」を押して表示されるウィンドウには一覧が表示されない。

貼り付けた画像 2014 03 28 11 23

スクリーンショット 2014 03 28 11 24 29

  • 別サーバに移行した時に発生した(環境変わった)。

原因

メディアライブラリの選択ウィンドウの一覧はAjaxで一覧データのJSONを取得しているが、どうも環境によってはこのレスポンスヘッダのContent-Typeが「text/html」になってしまうことが原因。

正しく動作するにはこれが「application/json」である必要がある。

対策

functions.phpとかでフックしてContent-Typeを書き換えようかとしたがどうもうまく書き換えられないので、
本当はやりたくないが、Wordpress内のプログラムを書き換える。

wp-admin/admin-ajax.php

@header( 'Content-Type: text/html; charset=' . get_option( 'blog_charset' ) );

if(in_array($_POST['action'], array('query-attachments', 'send-attachment-to-editor'))){
     @header('Content-Type: application/json; charset=' . get_option('blog_charset'));
}else{
     @header( 'Content-Type: text/html; charset=' . get_option( 'blog_charset' ) );
}

に書き換えて保存。

4 comments on “WordPressでメディアライブラリに画像一覧が表示されない対処

  1. ありがとうございます。Debianでサーバを作り、WordPress 3.9.1jをインストールしたら全く同じ症状になりました。(en版も同じ)

    「環境によってはこのレスポンスヘッダのContent-Typeが「text/html」になってしまうことが原因。正しく動作するにはこれが「application/json」である必要がある」
    とのことですが、

    原因は、apache2かphp5、いずれかのセッティングで解消する問題なのでしょうか?

    • 同じソースコードで、サーバによってレスポンスヘッダに違いが出るので
      おっしゃるようにApacheかPHPあたりの違いによるものだとは思いますが、
      原因を特定できてはいません。

      ちなみに環境は以下のようになっています。

      ・Content-Typeがtext/htmlになるサーバ
      Apache2.2.22
      PHP5.4.24
      CentOS 5.8

      ・何もしなくてもContent-Typeがapplication/jsonで吐き出されるサーバ
      Apache2.2.3
      PHP5.4.24
      CentOS 5.9

      phpinfoでjsonの項を確認するとどちらも
      json support enabled
      json version 1.2.1
      となっていますが後者のサーバでは
      設定ファイルとして「json.ini」を読み込んでおり、こちらには以下

      ; Enable json extension module
      extension=json.so

      が記述されています。

      試していませんのでアドバイスできず申し訳ないですが、
      もしかするとこのあたりになんらかの影響があるかもしれません。

      ちなみにどちらのサーバもApacheのconfに
      AddType application/json .json
      といったjsonをaddする記述は行っていません。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です