ShopifyブログからWordPressに全記事をお引越しする方法

Shopifyには管理画面からブログを書ける機能が搭載されていますが、Shopifyから別のECサイトASPへお引越ししたり、ブログだけをWordPressへお引越ししたい!という時に、実はShopifyから簡単にWordPressに記事移行できる機能がサポートされていないという落とし穴があります。
ShopifyでECサイトを作ってみたけど、利用料金や使い勝手の面から国産ECサイトASPへお引越ししたい…とかの時に、記事の移行が簡単にできないというだけで、これまで書いてきたコンテンツを捨てるなんてもったいない…!
ということで、ShopifyブログからWordPressに記事をお引越しする方法をまとめてみました。

なお、本記事とは逆にWordPressからShopifyブログへのお引越しに関しては以下の記事が参考になります。

目次

作業方針と注意事項

やり方としては、Shopify側では「Matrixify(旧:Excelify)」を使って記事をExcel形式でエクスポートし、WordPress側で「WP All Import」を利用して記事をインポートする!という流れになります。
そのままだと画像はShopifyのサーバー内にしかない状態になってしまうので、画像を「Smart Auto Upload Images」を利用してアップロードを行います。

注意事項
  • 「Matrixify」は無料だとブログは一度に10記事しかエクスポートできない点に注意が必要です。
    • 無料枠内であっても10記事ずつしかエクスポートできないだけでエクスポートの回数制限はないため、10記事ずつエクスポート・インポートの作業が発生しても大丈夫そう!ということであれば無料枠内での利用でよいと思います。
    • 課金してもベーシックプランでのブログの一度の出力数が50記事なので、あまりにも膨大な数の記事がある場合は利用するプランの検討が必要です。
  • WordPressに「WP All Import」を使ってインポートする際に、無料版だと画像が自動でアップロードされません。
    • 今回は手動作業が挟まってもどうにかなる記事数だったので、「Smart Auto Upload Images」を使って手動作業を挟みつつお手軽アップロードをする方法を採用しました。
    • 記事数があまりにも膨大だったり、どうしても画像も一括でアップロードしたい場合は「WP All Import Pro」へ課金するのがよさそうです。

やってみよう!

事前準備

あらかじめ、移行先のWordPressのセットアップだけ行っておきましょう!

STEP
【Shopify】Matrixifyのアプリを追加する

Shopifyのアプリの検索欄に「Matrixify」と入力してアプリを追加します。お引越ししたい記事があまりにも膨大な場合はこの時点で課金プランを選択して支払いを完了しておきます。

STEP
【Shopify】Matrixifyでブログ記事をエクスポートする

Matrixifyのアプリの画面から「New Export」を選択し、ブログ記事をエクスポートします。

「Format」欄から「Matrixify: Excel」を選択し、「Sheets」欄で「Blog Post」を選択するとExcel形式でブログ記事をエクスポートできます。
10記事ずつ出力したい場合は、「Filter」欄の「Publish Date」とかで日付を絞って10記事ずつ出力するのがおすすめです。

STEP
【WordPress】「WP All Import」と「Smart Auto Upload Images」のプラグインの追加して有効化する

プラグインの新規追加欄から「WP All Import」と「Smart Auto Upload Images」を検索し、それぞれのプラグインを追加して有効化します。

この2つのプラグインはインポートが終われば必要がないプラグインなので、お引越し完了後は削除してしまって大丈夫です。

基本的にどちらのプラグインもなにか特別な設定をすることなく使えますが、画像の命名規則などをこのタイミングで改めたい場合は「Smart Auto Upload Images」の設定画面から設定することが可能です。

STEP
【WordPress】「WP All Import」からエクスポートデータをインポートする

②でエクスポートしたExcelファイルを「WP All Import」からインポートします。

新規インポートの画面の「ファイルをアップロード」からExcelファイルをアップロードします。
「Create or modify…」で投稿タイプを選ぶことができるので、インポートしたい投稿タイプを選択しましょう。特にこだわりがなければ「投稿」を選べばOKです。

「Set Up Import」ボタンを押すとインポート設定時の割当を設定できます。
右側にExcelファイル内の各項目が表示されているので、WordPressにインポートする際のここに入ってほしい!という箇所に項目をドラッグアンドドロップして設定を行います。
右側の欄から当該箇所をドラッグアンドドロップし終わるとこんな感じの表示になります。

タイトルと本文の割当例

この調子で各項目をドラッグアンドドロップで設定していきます。
ここでShopifyのブログから引き継げるのは以下の項目になります。

  • 記事タイトル
  • 記事本文
  • スラッグ
  • タグ
    • 入力欄の設定によってはWordPressのタグにもカテゴリーにも変換可能です
  • 投稿日

画像も一気に移動させるために有料課金している場合はマッピング時に設定を行うことをお忘れなく!

セットアップが完了したら、あとはそのままインポートします。
ShopifyからエクスポートしたExcelファイルが複数になっている場合は、ファイルの数だけインポート作業を繰り返し行います。

STEP
【WordPress】「Smart Auto Upload Images」経由で画像をWordPressサーバーにアップロードする

今回は無料版の「WP All Import」を利用したので、この時点では画像のインポートができていません。
「Smart Auto Upload Images」経由で画像をWordPressのメディアにアップロードしていきます。

「Smart Auto Upload Images」は投稿を保存する際に画像がアップロードされるプラグインなので、全記事を開いて…保存して…閉じて…という作業が必要になります。
ただ、本文内の画像だけではなくアイキャッチ画像もインポートできていないので、アイキャッチ画像を手動で設定すると自ずと開いて保存して閉じる…という動作がもれなく行われますので、投稿数がそこまで多くない&すべての投稿にアイキャッチがついている!という場合は、感覚的にはアイキャッチ画像の設定作業を手動で行うだけでOKなので思ったより大変ではないんじゃないかなと思います。
また、「Smart Auto Upload Images」は外部URLからのアイキャッチ画像の設定にも対応しているので、Excelからアイキャッチ画像のURLのコピペ作業だけでなんとかなる点もありがたいところです。

アイキャッチ画像の設定方法

「Smart Auto Upload Images」を有効化すると各投稿の編集画面に「Set Featured Image from URL」という項目が追加されるようになります。チェックを入れるとURLの入力枠が表示されるので、ここにShopifyからエクスポートしてきたExcelの当該記事の「Image Src」欄の内容をコピペして保存すると、ここに入力したURLの画像をアップロードした上でアイキャッチに設定して保存してくれます。

一方で、アイキャッチ画像がついていないけれど、本文内に画像が設定されている投稿をどうするかです。これらもひとつひとつ手で投稿を開いて保存して閉じる…をやっていると埒が明かないので、一括再保存で対応しました。

一括再保存について

WP-CLIなどを利用できる環境であれば、WP-CLIを利用して投稿の再保存が可能です

wp post list --post_type=post --format=ids | xargs -n 50 wp post update

WP-CLIが利用できない場合は、functions.phpを利用して、再保存機能を追加してどうにかすることも可能です。
functions.phpに直接書いてもいいですが、今回は「Code Snippets」を利用して、functions.phpに追記を行うかたちで対応しました。以下のコードをコピペして、「管理画面のみで実行」として保存し有効化し利用しました。

functions.phpに追記する再保存機能追加用コード

今回はAIにコードを書いてもらったもので対応を行いました。
※ざっとコードを読んでみた上で問題のあるコードではないようでしたが、動作の保証はしかねる点ご容赦ください。

if (!defined('ABSPATH')) exit;

add_action('admin_menu', function () {
  add_management_page(
    'Bulk Resave',
    'Bulk Resave',
    'manage_options',
    'bulk-resave',
    'brp_render_page'
  );
});

function brp_render_page() {
  if (!current_user_can('manage_options')) return;

  $post_type = isset($_GET['post_type']) ? sanitize_key($_GET['post_type']) : 'post';
  $batch     = isset($_GET['batch']) ? max(1, (int)$_GET['batch']) : 50;
  $paged     = isset($_GET['paged']) ? max(1, (int)$_GET['paged']) : 1;

  // 実行ボタン押下時のみ動かす
  if (isset($_POST['brp_run'])) {
    check_admin_referer('brp_run');

    $q = new WP_Query([
      'post_type'      => $post_type,
      'post_status'    => 'any',
      'posts_per_page' => $batch,
      'paged'          => $paged,
      'fields'         => 'ids',
      'no_found_rows'  => false,
    ]);

    $updated = 0;
    foreach ($q->posts as $id) {
      // “なにも変えずに保存”相当:同じ内容を入れ直して save_post を走らせる
      $p = get_post($id);
      if (!$p) continue;

      // 更新日が変わるのが嫌なら、ここで post_date / post_date_gmt を保持する処理を追加する
      $r = wp_update_post([
        'ID'           => $id,
        'post_title'   => $p->post_title,
        'post_content' => $p->post_content,
        'post_excerpt' => $p->post_excerpt,
      ], true);

      if (!is_wp_error($r)) $updated++;
    }

    $total_pages = (int) $q->max_num_pages;

    echo '<div class="notice notice-success"><p>';
    echo esc_html("更新(再保存): {$updated} 件 / ページ {$paged} / 全 {$total_pages} ページ");
    echo '</p></div>';

    if ($paged < $total_pages) {
      $next = add_query_arg(['post_type'=>$post_type,'batch'=>$batch,'paged'=>$paged+1]);
      echo '<p><a class="button button-primary" href="'.esc_url($next).'">次のバッチへ</a></p>';
    } else {
      echo '<p><strong>完了</strong>(終わったらこのプラグインは無効化して削除推奨)</p>';
    }
  }

  ?>
  <div class="wrap">
    <h1>Bulk Resave</h1>
    <form method="get" style="margin-bottom:16px;">
      <input type="hidden" name="page" value="bulk-resave">
      <label>post_type:
        <input name="post_type" value="<?php echo esc_attr($post_type); ?>">
      </label>
      <label style="margin-left:12px;">batch:
        <input name="batch" type="number" min="1" max="500" value="<?php echo esc_attr($batch); ?>">
      </label>
      <label style="margin-left:12px;">paged:
        <input name="paged" type="number" min="1" value="<?php echo esc_attr($paged); ?>">
      </label>
      <button class="button">反映</button>
    </form>

    <form method="post">
      <?php wp_nonce_field('brp_run'); ?>
      <button class="button button-primary" name="brp_run" value="1">この条件で実行</button>
    </form>

    <p style="margin-top:12px;color:#666;">
      注意: 件数が多いとタイムアウトするので batch は50〜100くらいから推奨。
    </p>
  </div>
  <?php
}

保存後、「ツール」→「Bulk Resave」から再保存を行えます。何度も使うものではないと思うので、作業完了時にはfunctions.phpからの削除・「Code Snippets」上で無効化がおすすめです。

画像がちゃんとWordPress内にアップロードされているか確認して、作業完了です!おつかれさまでした!


今回はたまたまShopifyブログ→WordPressのお引越しでしたが、Shopifyのブログのみならずエクスポートデータの癖が強いブログサービスからのお引越しでも活用できるんじゃないかな、と思います。
異なるサービス間のお引越しは大変なことが多いので、この記事が少しでもお役に立てれば幸いです。

  • URLをコピーしました!
目次