WordPressの「メディアライブラリ」のインポートが上手く行かない時の解決法

一言まとめ

[ツール]→[エクスポート/インポート]で「メディアライブラリ」のインポートが上手くいかない。
ならば、メディアライブラリ関連のデータをデータベースから直接 エクスポート & インポート すればいい。



サイトリニュアルの際など、WordPressのデータ移行(引越し)が必要なときがありますよね。古いデータベースをそのまま利用できれば、そうしたほうが一番手っ取り早くてトラブルも圧倒的に少ないです。

しかし、古いサイトでプラグインを多用してると、新しいサイトにとっては不要なデータがデータベースに残存してしまうケースもあります。そういった場合は、記事やカテゴリなど、新しいサイトに必要最低限のデータのみを古いサイトから吸収して、いわば「クリーンインストール」で行きたいものです。

記事系とタクソノミー系なら [ツール]→[エクスポート/インポート] を使えば割りと簡単に移行できます。しかし、「メディアライブラリ」だけどうしても上手くいきません!これまでに一度も成功した試しがない…

画像データをサーバーにアップロードする

新しいサイトをホストするサーバーも変える場合、まずは古いサーバーの画像(wp-content/uploads)を新しいサーバーに上げておきましょう。

データベースから直接インポート&エクスポートする

WordPressの「インポート/エクスポート」ツールが上手くいかないなら、最終手段として、データベース上にあるメディアライブラリ関連のデータをSQLとして直接エクスポート&インポートするのがいいでしょう。ちょいと面倒かもしれませんが、やはりこれが一番確実です。

phpMyAdmin でメディアライブラリ関連のデータをエクスポート

ツールは何でも構いませんが、ここでは多くの人たちに親しまれている phpMyAdmin とします。

やり方としては、select文でメディアライブラリ関連のデータを選んでSQLとしてエクスポートし、新しいサイト側でそれをインポートする。関連データはwp_postswp_postmetaテーブルから取り出します。

それからテーブル名にも注意して下さい。ここではデフォルトで設定されているwp_接頭辞を付け加えたテーブル名とします。

アイキャッチだけをエクスポートしたい場合

アイキャッチとして使われている画像のみをエクスポートしたい場合には、下記のselect文でレコードを選出します。

wp_posts テーブル:

-- アイキャッチとして使われているすべてのメディアファイル
SELECT * FROM wp_posts WHERE post_type = 'attachment' AND post_parent != '0';

wp_postmeta テーブル:

-- アイキャッチとして使われているすべてのメディアファイルの post-meta(カスタムフィールド)
SELECT * FROM wp_postmeta WHERE post_id IN ( SELECT ID FROM wp_posts WHERE post_type = 'attachment' AND post_parent != '0' );

すべてのメディアファイルをエクスポートしたい場合

wp_posts テーブル:

-- すべてのメディアファイル
SELECT * FROM wp_posts WHERE post_type = 'attachment';

wp_postmeta テーブル:

-- すべてのメディアファイルの必要最低限の post-meta のみをエクスポートしたい場合。
SELECT * FROM wp_postmeta WHERE meta_key IN ("_wp_attachment_metadata","_wp_attached_file");

古いサイトで使っていたプラグインなどが独自の post-meta をメディアファイルに付けていて、そして、引き続き新しいサイトでもそのプラグインを利用するといったシナリオであれば、下記の文になります。

-- すべてのメディアファイルのすべての post-meta をエクスポートしたい場合。
SELECT * FROM wp_postmeta WHERE post_id IN ( SELECT ID FROM wp_posts WHERE post_type = 'attachment' );

エクスポート

SQL文を実行した後の画面の下部にある “Export” ボタンを押して、

select-query

 

レコードのIDが開発環境上のものと重複する場合、重複したレコードを挿入しないようにしたいので、Export画面で “INSERT IGNORE statements” をチェックしておくと、INSERT文ではなく、INSERT IGNORE文を使うようにしてくれます。

export-as-sql

 

最後に、出力してくれたSQLファイルを開いて、INSERT 以外の文はすべて消しておいてから、新しいデータベースにインポートして下さい。

サイトURLが変わった場合

ドメインが変わっり、http から https になったりすると URL を差し替えないといけないので、やり方はおまかせします。私はいつもWP-CLIを使って置き換えます:

wp search-replace 'https://old.example.com' 'https://new.example.com'

それが使えない環境なら、Search Regex(プラグイン)を使うのもいいでしょう。

まとめ

もう本当にWordPressのインポートツールを使って、一度も成功した試しがないので(苦笑)、一手間も二手間も多いのですが、今後は直接SQLでエクスポート/インポートするようにしたほうが良さそう。

参考記事



コメントを残す

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

ABOUTこの記事をかいた人

Hi, 中国四川出身の王です。2008年に日本に渡り、大学卒業後Web制作会社勤務を経て、現在はフリーランスとしてゆるりと働いています。サイト制作の全般を担当しています。好きな生き物はプーティ(マイCat)です。趣味はアニメ鑑賞です。画家になるのが夢だったりします!