WordPressのインポートでアイキャッチ画像がずれる問題を、
プラグインを使わず無料で解消

WordPressのインポートでアイキャッチ画像がずれる問題を、プラグインを使わず無料で解消

WordPressの記事を、別のWordPressに引越しをしたいときに、アイキャッチの引き継ぎがうまくいかない問題があります。

 

多くのブログ記事では、

WP CSV Exporter

という、CSV形式で書き出せるものを使う紹介や

 

Export Featured Images

という、4年以上前のプラグインを使うものが紹介されています。

 

また、そもそもMySQLの中身を引き継ぐのが早いという声も聞かれます。

 

これらでも解消する場合があるのですが、今回は別の角度で解決方法を検証してみます。

 

なぜ、アイキャッチ画像が引き継げないのか

それは、エクスポートされた記事のデータには、「アイキャッチID」しか含まれていないからです。

つまり、「元のWordPressの、10番目の画像をアイキャッチに設定する」という情報なのです。

 

新しい引越し先のWordPressの10番目の画像が、ちょうどアイキャッチに設定したい画像だったら、正常にインポートできるのですが

元の記事や、元の画像がすでに登録されている場合、

  • アイキャッチがずれる
  • アイキャッチがあるはずなのに空になっている

の2つのエラーの、どちらかが発生します。

これが、「WordPressはアイキャッチが引き継げない」という理由です。

 

アイキャッチが引き継げないケースを検証

どんなケースでエラーになるのか、検証してみました。

まずはこちら、インポート元のWordPressです。

10個の女性的なアイキャッチが登録されています。

image-WordPressのインポートでアイキャッチ画像がずれる問題を、プラグインを使わず無料で解消 | サロンホームページにおすすめのWordPressテーマ salonote

 

こちらは、色を変えた、インポート先のWordPressです。

男性的なアイキャッチが入った記事が、9つあります。

 

image-WordPressのインポートでアイキャッチ画像がずれる問題を、プラグインを使わず無料で解消 | サロンホームページにおすすめのWordPressテーマ salonote

 

では、WordPressの記事をエクスポート/インポート してみます。

投稿だけを引き継ぎたいので、「投稿」にチェックを入れて、エクスポートファイルを作成します。

image-WordPressのインポートでアイキャッチ画像がずれる問題を、プラグインを使わず無料で解消 | サロンホームページにおすすめのWordPressテーマ salonote

それを、新しいWordPressでインポートします。

image-WordPressのインポートでアイキャッチ画像がずれる問題を、プラグインを使わず無料で解消 | サロンホームページにおすすめのWordPressテーマ salonote

添付ファイルのインポートは、今回のアイキャッチには関係がないので、チェックを入れても入れなくても、同じ結果になります。

記事はインポートできたものの、アイキャッチ画像が別の画像になってしまっています。

また、10個目のブログ記事は、アイキャッチ画像が存在しないことになっています。

image-WordPressのインポートでアイキャッチ画像がずれる問題を、プラグインを使わず無料で解消 | サロンホームページにおすすめのWordPressテーマ salonote

この結果からも、エクスポートファイルには、画像そのものではなく、画像IDしか入っていなくて

インポートの際には、「今のWordPressにある画像ID」を参照しにいくので、ずれるか消失するのがわかります。

 

先述の通り、CSV形式で書き出してインポートする方法もありますし、便利なプラグインもありますが

今回は、

エクスポートの方法を調整し、

インポート後に画像を再読み込みする方式を検証します。

 


解決方法の仮説

今回検証する流れは、以下の通りです。

  1. エクスポートファイルに、アイキャッチIDではなく、アイキャッチ画像のURLを含める
  2. インポート先で、アイキャッチ画像のカスタムフィールド が含まれている場合は、アイキャッチを再設定する
  3. アイキャッチを再設定したら、アイキャッチURLのフィールドを削除して、二重起動しないようにする

 

 

1.WordPressのエクスポートファイルを調整する

WordPressのエクスポートは、

wp-admin/includes/export.php

というファイルで行われています。

これはコアファイルなので上書きするのは得策ではありません。

なので、フィルターフックを活用するようにします。

 

このファイルを検証すると、書き出されるカスタムフィールド に対して 直接 フックをかけられるところは、ほとんどありませんでした。

 

唯一、

<wp:postmeta>

<wp:meta_key>

を書き出すところに

wxr_export_skip_postmeta()

というフィルターがあるので、ここを使ってみます。

 

 

これで、エクスポートファイルに

_thumbnail_id

だけでなく

_thumbnail_url

を書き出せるようにしました。

フィルターは、何度も動いてしまうので、1度だけ動かす処理を書いています。

 

これをインポートすれば、アイキャッチURLがなんだったのかを、引越し先のWordPressで知ることができます。

 

2.引越し先のWordPressで、アイキャッチを再設定する

これで、引越し先のWordPressでは、

  • ずれたアイキャッチ画像 → _thumbnail_id
  • 本当のアイキャッチ画像URL → _thumbnail_url

の情報が、カスタムフィールド として渡されています。

そこで、_thumbnail_url というフィールドに値があったら、その値をもとにアイキャッチを再設定して

再設定し終わったら、_thumbnail_url を消去するという処理を走らせてみます。

 

まずは、ページの表示をトリガーにして置き換えてみました。

そのため、ページ表示直前のフックである

template_redirect

を使っています。

 


YouTube Movie


 

アイキャッチを一括で置き換えたい場合

今回は、ユーザーの訪問をトリガーにして、元のWordPressサイトから画像を取得して、

引越し先のWordPressに画像を保存し直し、アイキャッチに設定するという流れです。

 

ただ、

  • 元のWordPressはできるだけ早く削除したい。あるいは、非公開にしたい
  • ユーザーの訪問をトリガーにするのではなく、事前に全て置き換えておきたい

という場合は、何らかの一括処理を走らせる必要があります。

 

cronを設定してバックグランドで置き換えて行くとか

Ajaxで動的に順番に置き換えて行くとか

方法はいくつもあると思いますが、その辺りの高度なユーザーインターフェイスは今回は実装しません。

 

代わりに、「set_post_attachment」パラメーターがあれば、終わるまで処理するという

サーバー負荷を一切考えない挙動をしてみました。

YouTube Movie

 

一気に置き換わっているのがわかります。

 

サーバーの負荷を考えるなら、当然、バッチ処理や、バックグランド処理を一定時間をおいてするべきです。

例えば、1件ずつ表示するようにしておいて

jQuery(window).load(function () {
location.reload();
});

とかで、パラメーター付きのページにもう一度リダイレクトさせるとか。

(解決とはそういうことじゃない)

 

 

魔改造みたいなものなので、くれぐれもバックアップをとった上で自己責任でお願いします。


 

いずれにしても、WordPressのコアを触らずに

functions.phpの変更だけで、エクスポート → インポート → 一括置き換え

まで、行けることがわかりました。

 

ニーズがあれば、プラグイン化して配布するかもです。

とりあえず、WordPressテーマのsalonoteには、エクスポート時にアイキャッチの画像URLを含める処理を追記しておきました。

 

 


この記事の内容についてのご質問