画像のアップロード先変更について
-
お世話になります。
今まで「wp-content/uploads/年/月」フォルダに画像がアップロードされていましたが設定→メディア→「アップロードしたファイルを年月ベースのフォルダに整理」のチェックをはずして「wp-content/uploads」フォルダにアップされるように変更しました。
それまでに変更した画像が2000枚近くあるのですが、それは手動で異動させ、投稿や固定ページのURL「wp-content/uploads/年/月」も一括置換で「wp-content/uploads/」に変更し、問題なく表示されています。
ところが、メディア→ライブラリで過去の画像を確認しようとするとファイルのURLが「wp-content/uploads/年/月」になっているために、全部「×」表示されて画像が表示されません(年/月フォルダの画像は削除済み)。
どこかに「wp-content/uploads/年/月」の情報がまだ残っているんだと思いますが、どうすればメディア→ライブラリで過去にアップロードした写真がきちんと表示されるようになるでしょうか?
2000枚近くあるので1枚1枚ではなく、一括で変更できる方法があったら教えていただけないでしょうか?どうぞよろしくお願いします。
-
画像を移動したら記事中の画像URLが元のままになってしまった、とのことですね。
WordPressでは記事本文に画像のリンク (例: img src=”wp-content/uploads/1999/01/01″) が入っていたりします。こちらが過去のままになっていると見受けます。
この問題を解決するためには2つの方法を提案します。
1. 記事全文に置換を掛ける
http://wordpress.org/support/topic/how-to-change-image-urls-after-wp-move?replies=7
本家のフォーラムにもURLが変わってしまったのでナントカしたい、というケースがありました。
こちらはphpMyAdminにて本文をダンプし、置換を掛けた後に戻す、ということを勧めたようです。2. .htaccessとmod_rewriteを使ってリダイレクトをかける
http://stackoverflow.com/questions/12682302/mod-rewrite-rules-for-wordpress-upload-path
こちらに同じような例が載っていましたので掲載します。こちらのほうがお手軽ですが恒久的にリダイレクトが必要で、.htaccessのmod_rewriteは少し難しいです。お返事ありがとうございました!
> 画像を移動したら記事中の画像URLが元のままになってしまった、とのことですね。
はい、そうなんですが、それは既に記事に一括で変換をかけたので、サイト上は画像が問題なく表示されています。
ただ、ワードプラス→メディア→ライブラリで過去の画像を確認しようとするとファイルのURLが「wp-content/uploads/年/月」になっているために、全部「×」表示されて画像が表示されません。
過去にアップロードした画像のファイルのURLが「wp-content/uploads/年/月」のままになっているんですが、これを変えるにはどうしたらいいかを教えていただければうれしいです。
画像が2000枚近くあるので一括で置換できるほうほうがあればと思うのですが・・・
教えていただいたサイトは英語なのでよくわからず・・・すみません(涙)どうぞよろしくお願いします!
参考サイトのみで中途半端になってしまいましたね。
mutowpさんは既に記事に変更をかけられたとのことで、先の1番のデータを置換する方法についてお伝えします。
postmetaテーブルに_wp_attached_fileというキーにてファイルの場所が格納されています。
これをsqlにて書き換えてみる方法について説明します。
sqlの使い方が分からない場合には他の方法にて。update yousan_tmp.wp_postmeta set meta_value = REPLACE(meta_value, '2014/01/', '/') where meta_key = '_wp_attached_file';
スキーマ名、テーブル名、についてはご自身の環境に応じて変えてください。
またMySQLには正規表現と置換を同時に行うことができません。今回は2014年1月のみを対象としました。
2000件とのことで、年間は高々12月ですので、多くとも100行ぐらいに収まるかと思います。
エクセルのオートフィルと組み合わせて年月の所をコピーしてください。他にpostsテーブルのguidにも同じ内容が格納されています。こちらも何かに利用されている気がしましたが覚えていません
http://codex.wordpress.org/Changing_The_Site_URL#Important_GUID_Note
(またもや英語ですみません(;´Д`)
斜め読みすると、キャッシュされたりするときにこの値が重要だから変えちゃダメ!と言っている気がします。
guid自体はあくまで識別子なので、このままでも大丈夫かもしれません。以上となりますが、テーブルデータの変更を伴いますので、ご自身で責任をもってバックアップ等を忘れないよう気を付けてください。
guid は、feed に使われます。投稿記事は一意のデータなので、変えてはいけないけれども、メディアのアドレスは例外だから、ちゃんと変えてね、と書いてあります。
kjmtshさんフォローありがとうございます。feedではguid使われてたんですね。
hogetan様、kjmtsh様
お返事ありがとうございました!!
正直ちんぷんかんぷんでしたが、phpMyAdminを見てみて、おっしゃっていることが理解できました。
ただ、postmetaテーブルには_wp_attached_fileという項目がなく、あるのは「meta_id」「post_id」「meta_key」「meta_value」の4つだけでした…。
他のテーブルも探しましたが、wp_attached_fileと言う項目がありませんでした。また、データを表示させてみましたが私が置換したい「wp-content/uploads/年/月」と言うデータらしきものもありませんでした。
繰り返しになり恐縮ですすが、アップロードした画像の「wp-content/uploads/年/月」と言う情報を格納している場所と、それを置換するSQL文を教えていただけるととてもとても助かりますm(_ _)m
自分で調べたいのですがなんせ知識がなくて調べ方自体がわかりません…。
hogetan様の教えてくださったことはなんとかわかったので、もう少しお付き合いいただけると嬉しいです!!お手数おかけして申し訳ありませんがどうぞよろしくお願いしますm(_ _)m
すいません、見落としてました。
あるのは「meta_id」「post_id」「meta_key」「meta_value」の4つ…
これで正しいです。meta_key カラムに ‘_wp_attached_file’ というデータが、meta_value カラムに ‘yyyy/mm/*.jpg’ みたいなデータが入っています。
hogetan さんがお示しになった
UPDATE $wpdb->wp_postmeta SET meta_value = REPLACE(meta_value, '2014/01/', '/') WHERE meta_key = '_wp_attached_file';
というクエリは、’2014/01/sample.jpg’ というようなデータを ‘/sample.jpg’ に変えるものです。WordPress のメディアライブラリでは、この前に、’http://example.com/wp-content/uploads/’ というのがついてサムネールを表示しています。とすると、置換文字列の ‘/’ は、hogetan さんの勘違いで、正しくは ” と、空文字列にしないといけないところです(たぶん、ちゃんと動作はすると思いますが)。
ただ、これは ‘2014/01/’ しか変換してくれませんから、次には ‘2013/12/’ に書き換え、次は ‘2013/11/’ に書き換えして最後まで、というシナリオです。だから、
100行ぐらいに収まるかと思います。
ということなのですね。
これはちょっとたいへんなので、はやり PHP スクリプトで正規表現置換を使うやつを書きました。meta_key ‘_wp_attached_file’ のデータとシリアライズされた meta_key ‘_wp_attachment_metadata’ のデータ、それから、posts テーブルの guid データを一気に書き換えます。
1000 行のデータでテストしましたが、前半の ‘_wp_attached_file’ の書き換えだけで下くらいの時間がかかりました。念のため、最初でタイムリミットを300秒にしています。
real 1m44.966s user 0m1.668s sys 0m0.272s
コードが長いので、pastebin に置いてあります。
使い方は以下の通りです。
- スクリプトファイルを wp-config.php のあるディレクトリに置く。
- 管理者としてログイン。
- ブラウザのアドレスバーにスクリプトのアドレスを入れ、リターン。
- ‘Finished’ のメッセージが出るまで待つ。
以上です。途中でエラーがあった場合の処理は入れていませんし、テーブルロックやトランザクションは MySQL に任せっぱなしなので、メンテナンスモードにしてお使いください。テストはしましたが、無保証です。バックアップを取ってからお試しください。
申し訳ありません、付け加え忘れました。
「使い終わったら、ファイルを必ず削除してください」
kjmtsh、hogetan様
お返事ありがとうございました!!
すみませんがお聞きしたいことがたくさんあります(T_T)
私が置換したい年月は「2013/10」「2013/11」「2013/12」「2014/01」の4つだけなのでhogetanさんの方法でもそんなに手間はかかりそうにないです。
kjmtshさんの方法でやってみたいんですが、私の脳みそがついていけなくて…
ご丁寧に教えていただいたのに申し訳ないです(*_*)【1】hogetanさんの方法でする場合
phpMyAdminで↓のUPDATE文を年月を変えて4回実行すれば大丈夫ですか?
UPDATE $wpdb->wp_postmeta SET meta_value = REPLACE(meta_value, ‘2014/01/’, ”) WHERE meta_key = ‘_wp_attached_file’;
【2】hogetanさんの方法でする場合
wp_postsテーブルの「guid」と言う項目を書き変える文は以下であっていますでしょうか?
WHERE以降の書き方がわからないので教えていただけないでしょうか??UPDATE $wpdb->wp_posts SET guid = REPLACE(guid, ‘2014/01/’, ”) WHERE ・・・
【3】kjmtshさんの方法でする場合
スクリプトファイルはどうやって作ればいいでしょうか?
テキストに教えていただいた文章を貼り付けて、適当にファイル名をつければいいでしょうか?
その際、拡張子は何にすればいいでしょうか??
http://msdn.microsoft.com/ja-jp/library/cc392511.aspx【4】kjmtshさんの方法でする場合
「メンテナンスモードにしてお使いください。」とは、サーバーにメンテナンスモードのことでしょうか??
お手数をおかけして申し訳ありませんが、もう少しだけお付き合いいただけると嬉しいですm(_ _)m
どうぞよろしくお願いしますm(_ _)mm(_ _)mとりあえず、メディアライブラリにサムネールを表示したいという目的なら、
phpMyAdminで↓のUPDATE文を年月を変えて4回実行すれば大丈夫ですか?
これで十分と思いましたが、phpMyAdmin を使うなら、$wpdb->postmeta は使えません。というか、もともとの文が間違ってますね。$wpdb->wp_postmeta では、PHP を使っても動作しません。
$wpdb->postmeta は、WordPress によって、prefix_postmeta に変換されます。prefix は、wp-config.php で指定した「テーブルの接頭辞」です。デフォルトでは、’wp_’ となっていたはずです。ですから、$wpdb->wp_postmeta は、ありえないテーブルを指すことになって、
そんなプロパティはないよ
と言われてしまいます。正しくは、$wpdb->postmeta です。phpMyAdmin で使うなら、wp_postmeta です(デフォルト)。
また、よく考えると、確かに、REPLACE の中で REGEXP は使えませんが、今回の場合、置換するデータは、必ず yyyy/dd/ となっているのが保証されているので、SUBSTRING を使って最初の8文字を削除すればよいわけです。したがって、
UPDATE wp_postmeta SET meta_value = SUBSTRING(meta_value, 9) WHERE meta_key = '_wp_attached_file';
とすれば、1回のクエリで終了できます。文字ではなくて、文字数に注目すれば、簡単なことでした。
wp_postsテーブルの「guid」と言う項目を書き変える文は以下であっていますでしょうか?
UPDATE $wpdb->wp_posts SET guid = REPLACE(guid, '2014/01/', '') WHERE ...
やはり上に述べた理由で、$wpdb->wp_posts は誤りです。また、該当のデータ以外に ‘2014/01/’ といった文字列はありえないという保証があれば、WHERE 句なしでも成功します。そうでなければ、同じ文字列を持ったデータが全て書き変わります。
UPDATE wp_posts SET guid = REPLACE(guid, 'wp-content/uploads/2014/01/', 'wp-content/uploads/') WHERE post_type='attachment';
置換文字列をこれくらいにしておくと、安全かもしれません。アイキャッチとして使ったイメージは、post_type が attachment、post_status は inherit になっています。なお、ここでは、データが、
http://example.com/wp-conetnt/uploads/2014/01/hoge.jpg
というようになっていて、wp-content の前がわからないので、、最初の方法ではなくて REPLACE を使いました。これは4回実行する必要があります。最初の方法が使えるなら、1回で済みます。
kjmtshさんの方法でする場合
状況がわかると、あまりおすすめではありませんが… 実は、’_wp_attached_file’ を書き換えてみても、イメージ編集画面で右上に出るイメージの情報の url が書き変わりません。調べてみると、postmeta テーブルに、’_wp_attachment_metadata’ というのがあって、イメージ情報がシリアライズされて入っていることがわかりました。
この ‘_wp_attachment_metadata’ を、phpMyAdmin で書き換えてはいけません。
‘_wp_attachment_metadata’がそのままで我慢できるなら、上の5回(または2回)のクエリで十分です。
スクリプトファイルはこれも変更するようになっています。エディタに張り付けて、適当な名前で保存してください。拡張子は .php にしてください。WordPress が動くサーバなら、それで間違いありません。日本語は入れていませんので、ASCII でも UTF-8 でも大丈夫。あとは説明の通りです。保証はしませんので、よくわからない場合は、無理に使う必要はありません。
メンテナンスモードは、WordPress のサイトを、という意味です。データベースにアクセスする時間が長かったので、そう書きました。が、上の内容をもとに書き換えたので、たぶん、100倍以上速くなっているはずです。タイムリミットの指定も削除しました。メンテナンスモードは必要ないかもしれません。もし使うなら、スクリプトの最初のコメントの中にコードを入れておきましたので、それを functions.php に書いてください。テンプレートで get_header() を使っているページなら、全てメンテナンスモードになります。wp_head() しか使っていないページには効力がありませんが。作業が終わったら、そのコードを削除すると、もとに戻ります。
なお、スクリプトを使うなら、新しいものをお使いください。最初のものと区別するために、ファイルの先頭で、revised version としてあります。
kjmtsh様
できましたー!!!
初めてphpMyAdminを使ってドキドキでしたが、念のためとっていたバックアップを戻す必要もなさそうで、うまくいきました (〃▽〃)年月が入っていないデータも混ざっていたので最初の8文字をとることはできなかったのですが
●UPDATE wp_postmeta SET meta_value = REPLACE(meta_value, ‘2013/10/’, ”) WHERE meta_key = ‘_wp_attached_file’;
●UPDATE wp_posts SET guid = REPLACE(guid, ‘wp-content/uploads/2013/10/’, ‘wp-content/uploads/’) WHERE post_type=’attachment’;
この2つの文を4回ずつ実行で、思い通りの結果になりました。
色々詳しく教えてくださり、私のためにテストまでしていただいて、本当にありがとうございました(´A`。)
感謝しきれません。
kjmtsh様の益々のご活躍をお祈りしていますm(_ _)m
- トピック「画像のアップロード先変更について」には新たに返信することはできません。