WordPress から WordPress にインポート後にアップロードした画像が表示されない

2007-8-18 07:00
このエントリーをはてなブックマークに追加

WordPress からエクスポートし、別の WordPress のブログにインポートしたところ、アップロードした画像がすべて表示されなくなりました。もちろん画像もサーバ上にコピーしてあります。管理画面の「アップロード」を見てもタイトルだけが表示され、サムネイルが表示されていません。

WordPress にインポートした画像が表示されない

それぞれの内容を確認すると、URL が http://example.org/?attachment_id=1116 のようなおかしな状態になっています。

アップロードファイルの内容を確認

この URL を修正すれば良さそうですが、管理画面からは URL は変更できません。もしかしたらプラグインで編集できるものもあるかもしれませんが、今回は MySQL のコンソールから作業しました。もちろん phpMyAdmin からでも修正可能だと思いますが、私は試していません。

そもそもアップロードした画像の情報がどこに格納されているかというと、それぞれの記事やページと同じように wp_posts (wp_ の接頭辞は環境により異なっている場合があります) テーブルに格納されています。ここが WordPress の特徴です。このテーブルの guid というカラムに、先ほどの URL が格納されています。ためしに正常に表示される画像と比べてみると、

mysql> select guid, post_mime_type from wp_posts where id=1116 or id=1024;
+------------------------------------------------------------+----------------+
| guid                                                       | post_mime_type |
+------------------------------------------------------------+----------------+
| http://example.org/wp-content/uploads/2007/08/sapari.jpg | image/jpeg     |
| http://example.org/?attachment_id=1116                   |                |
+------------------------------------------------------------+----------------+

post_mime_type の値が空になっているのでこれを修正する必要がありそうです。また guid の URL の形式がまるで異なるのがわかります。この URL を修正すればよいのですが、画像の内部バスが wp_postmeta テーブルに格納されているのでそれを利用します。

mysql> select meta_value from wp_postmeta where post_id=1116 and meta_key='_wp_attached_file';
+------------------------------------------------------------+
| meta_value                                                 |
+------------------------------------------------------------+
| /old/site/path/wp-content/uploads/2007/07/search-regex.png |
+------------------------------------------------------------+

しかし、wp_postmeta テーブルには、インポート前のサーバ上の内部パスが格納されていました。まずこれを修正します。

mysql> update wp_postmeta set meta_value=replace(meta_value, '/old/site/path/', '/new/hoge/path') where meta_key='_wp_attached_file' and meta_value like '/old/site/path/%';

次にこのデータを利用して、wp_posts を更新しますが、こちらは SQL 一発というわけにはいきません。個別に ID と mime_type を確認・指定しながら SQL を実行します。一気にやる方法は MySQL にはカーソルをループで回して……のようなことをやる術がないので、おそらくできないと思います。あれば教えてください。こういうときに Oracle や PostgreSQL と MySQL の差が出てしまいますね。

mysql> update wp_posts set
    -> guid = (select replace(meta_value, '/new/hoge/path/', 'http://example.org/')
    ->  from wp_postmeta where post_id=1116 and meta_key='_wp_attached_file'),
    ->  post_mime_type='image/png' , where id = 1116;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0

もちろん post_mime_type には画像が JPEG のときは image/jpeg を、PNG のときは image/png を指定します。これで、アップロードしたファイルを確認してみると、

修正されてサムネイルが表示されたところ

これを繰り返していき、すべての画像が復旧できました。

すべてのアップロードファイルを修復したところ

この画像が表示されなくなる現象は再現性があるので、WordPress のインポートプログラムのバグだと思います。将来的には改善されると思いますが、同じことでハマって悩んでいる人の助けになれば幸いです。

1件のコメント

  1. はじめまして。

    私もこのアップロードした画像の URL を変更したくて悩んでおりとても参考になりました。
    ちょっと気になったのですが、DB 内の wp-postmeta テーブルの meta_value にも同様の URL とファイル名が記述されている部分があるのですが、ここは編集する必要はないのでしょうか?
    アップロードのサムネイル画面やエントリ表示には影響はないようですが。。

    管理画面のアップロードからタイトルや概要だけではなく URL も変更できるようにしてほしいところです。

    コメント by tattsun2007-10-8 01:55

Sorry, the comment form is closed at this time.

35 queries. HTML convert time: 0.082 sec. Powered by WordPress. Valid XHTML
Copyright © 2003-2017 @ futuremix.org ログイン