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

POSTED BY  
2016年11月22日
eyecatch

一言まとめ

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

サイトリニュアルの際など、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でエクスポート/インポートするようにしたほうが良さそう。

参考記事


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

関連記事

PHPの「遅延静的束縛 (Late Static Bindings)」機能、解読!
2016年10月31日
PHP, Web制作
PHPのアクセス権キーワード `private` と疑似変数 `$this` の落とし穴
2016年10月31日
PHP, Web制作
Cloudflareを使ってWordPressサイトをHTTPS化する時の流れとポイント
2016年10月25日
Web制作, WordPress
【CSS】img画像の縦横比を保ったままボックス内に収める方法
2016年8月25日
CSS, Web制作
PHPを踏み台サーバー経由でRDSに接続させる方法
2016年8月10日
Web制作, WordPress
WordPressプラグイン「Advanced Custom Fields」のフィールド名を後から変更する方法
2016年7月27日
Web制作, WordPress

Post a comment

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