Open3

WordPressの記事の移設について

kazuaki uedakazuaki ueda

[松山]みんなで学ぼう!WordPressのお引越し
このイベントの中で議論があったのですが、運用中のウェブサイトで日々記事が更新される状況において、別のサイトで作った一部のコンテンツを流し込むのは意外にうまくいかないようであれこれ試し中。

例えば Local で画像付きの記事を書いて標準のツールで Export/Import を試したところ文章は良いのですがメディアのインポートができない。まぁこれはローカル環境(.localドメイン)なので、エクスポートしたxmlファイルから公開サイト側でインポートしようとしても.localドメインは見えないので仕方ない。

じゃあ LocalLive Link を使って外から見える状態でエクスポートファイルを作成して、公開サイトでインポートすれば...と試したところメディアのインポートができず。(Basic認証で引っかかる?)

となるとメディアをS3などのクラウドに置いて公開環境・制作環境のメディアの保管場所を一元化するのがベターなのかも。

念のため、Basic認証のかからないテスト用サイトを作って Export/Import を試してみる予定。

kazuaki uedakazuaki ueda

テスト用のウェブサイトを作って試してみました。

  • 制作サイト(移行元)
  • 運用サイト(移行先)

制作サイトで投稿を作成

制作サイトで画像付き投稿を作成して公開。
画像のパスがFQDN(https://.../wp-content/...)になっているので、
HTMLとして編集 から 先頭のプロトコル+ドメイン部分 を削除して保存。
修正前

<img src="https://.../wp-content/uploads/...

修正後

<img src="/wp-content/uploads/...

投稿:エクスポートファイルをダウンロード

ツール->エクスポート->投稿を選択して
開始日時, 終了日時 を適宜指定して エクスポートファイルをダウンロード する。
xmlファイルに移行が不要な記事があればテキストエディタで適宜編集。
<item>...</item> 単位で不要な項目を削除。

メディア:エクスポートファイルをダウンロード

投稿と同じ操作で、
ツール->エクスポート->メディアを選択して
開始日時, 終了日時 を適宜指定して エクスポートファイルをダウンロード する。
xmlファイルに移行が不要な記事があればテキストエディタで適宜編集。
<item>...</item> 単位で不要な項目を削除。

運用サイトで投稿をインポート

ツール->インポート で WordPressインポーターを実行。
上で保存した投稿のxmlを選択してインポートを実行。

運用サイトでメディアをインポート

上で保存したメディアのxmlを選択してインポートを実行。

  • 投稿を既存のユーザーに割り当てる
  • 添付ファイルをダウンロードしてインポートする(チェック)

ここまでの手順で完了(のはず)。

エクスポート・インポートのメリット

FTPを使わないので間違って削除という心配がない。

注意事項

移行する間に制作サイトと運用サイトで同じコンテンツが公開される形になるので、
制作サイト側で 検索エンジンがサイトをインデックスしないようにする とか
サイトマップを更新しないように配慮が必要。

kazuaki uedakazuaki ueda

Wordpress XML Media Import with HTTP Authentication
この記事を参考にBasic認証経由で エクスポート/インポート を確認しました。

制作サイト

Local で投稿する。
画像のパスからドメイン部分を削除。

<img src="/wp-content/uploads/...

LiveLinkを有効にする。
LiveLinkをブラウザで開いてダッシュボードへ移動する。

https://(livelinkのURL)/wp-admin/

ツール->エクスポートで投稿を選択。
適宜条件を指定して エクスポートファイルをダウンロード する。
同様にメディアを選択して エクスポートファイルをダウンロード する。

念のため ダウンロードしたXMLファイル内のURL部分が Live Link のドメインになっていることを確認する。

運用サイト

Basic認証を通すように plugins/wordpress-importer を改修。
user:passLive Link の設定に合わせる。

$remote_response = wp_safe_remote_get(
    $url,
    array(
        'timeout'  => 300,
        'stream'   => true,
        'filename' => $tmp_file_name,
        'headers'  => array(
            'Accept-Encoding' => 'identity',
            'Authorization' => 'Basic ' . base64_encode( 'user:pass'), // この行を追加
        ),
    )
);

投稿自体はXMLの中に必要な情報が記述されているので Live Link 経由じゃなくても良いのですが、メディアをインポートするには Live Link のURLから Basic認証 経由で運用サイトにダウンロードする必要があります。