Really Simple CSV Importer:SCF繰り返しフィールドの画像/ファイルをURLでインポート

- WordPress -
2020.06.18
WordPress/ワードプレス

本記事では、以下4つ全てに当てはまる人向けに書いています。

  1. Really Simple CSV Importerを使って記事を一括インポートしたい
  2. Smart Custom Fieldsの繰り返しフィールドを使っている
  3. 繰り返しフィールド内で、タイプ「画像」もしくは「ファイル」がある
  4. 画像、ファイルをURL指定でインポートして必要な記事に紐付けたい

Smart Custom Fieldsの繰り返しフィールドへのインポート自体(上記①②)は、プラグイン作者(Takuro Hishikawa)さんのアドオンを使えば簡単です。

しかし、③④の条件、すなわち「Smart Custom Fieldの繰り返しフィールドの画像/ファイル」を「CSVにURL指定でインポート → メディアアップロードも記事への紐付けも一発で終わらせたい」という要件がそろったときに苦労しました。

CSVにURLを指定 → 自動でダウンロードし取り込んで記事へも紐付け...が理想

これができないと、何百とあるファイルをWordPressに手動アップロード→1つ1つの記事へ紐付け作業をチマチマやることになるのが耐えられなかった...。

というわけで、Really Simple CSV Importerの作者さんが作ったアドオンを参考になんとか実現できたのでメモ。

functions.phpをいじります。参考にしてみてください。

Really Simple CSV ImporterでSCF繰り返しフィールドの画像/ファイルをURLでインポートする

WordPressプラグイン"Really Simple CSV Importer"をインストールし、有効化してある前提です。

本記事で想定する例

Smart Custom Fieldsで以下のような繰り返しフィールドがあり、その中にタイプ「ファイル」があるような場合を想定します。

SCFの繰り返しフィールド

※タイプ「画像」の場合でも以下同じ手順でインポート可能です。本記事ではタイプ「ファイル」を例にします

そして、Really Simple CSV Importerでインポートが完了したら

  1. ファイルがメディアアップロードされている
  2. 紐づいているべき記事にファイルが紐づいている(以下画像のように)

という状態を目指します。

インポート後の理想の状態

ファイルが記事に紐づいている状態

また、ファイルをインポートする際にCSVには「外部URLを指定してインポートする」という要件も叶えることとします。(以下はエクセルで編集中の例)

これはつまり「手動で必要なファイルを手元に用意して、それらを手動でメディアアップロードして、手動で記事に紐付ける」ということを絶対にやりたくないということです。

手順① functions.phpに追記

まずは、以下コードをfunctions.phpへ貼り付けます。

あとで16行目の★部分は環境に合わせ書き換えるのでとりあえずそのままどうぞ。

functions.php// 1. Really Simple CSV Importerプラグインで繰り返しフィールドへのインポート対応
add_filter('really_simple_csv_importer_save_meta', function($meta, $post, $is_update) {
    foreach ($meta as $key => $value) {
        if (strpos($value, ',') !== false) {
            $_value = preg_split("/,+/", $value);
            $meta[$key] = $_value;
        }
    }
    return $meta;
}, 10, 3);

// 2. Really Simple CSV ImporterプラグインでURLから"ファイル"インポート
add_filter('really_simple_csv_importer_post_saved', function($post) {
    global $wpdb;
    if (is_object($post)) {
        $meta_values = get_post_meta($post->ID, '★download_file');
        foreach ($meta_values as $meta_value) {
            $meta_id = $wpdb->get_var("SELECT meta_id FROM ".$wpdb->postmeta." WHERE meta_value = '{$meta_value}' AND post_id = $post->ID");
            $h = RSCSV_Import_Post_Helper::getByID($post->ID);
            $file = $h->remoteGet($meta_value);
            $attachment_id = $h->setAttachment($file);
            $wpdb->query(
                $wpdb->prepare(
                    "
                    update wp_postmeta set meta_value = %d where meta_id = %d
                    ",
                    $attachment_id,
                    $meta_id
                )
            );
        }
    }
});

1つめのフィルターは、以下Really Simple CSV Importer作者さんのアドオンをそのまま使いました。
参考Divide Meta Fields with Comma (Really Simple CSV Importer add-on)

2つめのフィルターは、作者さんのアドオンを参考に、カスタマイズさせていただきました。
参考[Really Simple CSV Importer] Example: import image from url to custom field

手順② ①の一部を書き換え

16行目の以下★部分を、

get_post_meta($post->ID, '★download_file');

ご自分のSmart Custom Fieldsの以下赤枠の文字列と置き換えます。

手順③ CSVを記載

インポートしたい画像やファイルのURLをコピーします。以下は例なのでGoogle検索結果上からファイルURLを持ってきています。

エクセルやGoogleスプレッドシートにURLをペーストします。1つの記事に複数のファイル/画像を紐付ける場合は以下のようにカンマ区切りでつなげます。

メモ:

ここで「ファイルのURL一覧をどう準備するか」が課題になるかもしれません。

ぼくの場合「旧サイトから新サイトへの移行」という案件だったので、旧サイトのpdfなど対象ファイルのURL一覧をPythonでスクレイピングしました。ファイルを1つ1つ手元に用意するより確実に楽なので、スクレイピングできないか検討するのが吉かと思います。

手順④ WordPressのメディア設定を変更【重要】

WordPress管理画面の「設定」>「メディア」の画面で、メディアサイズ設定を全て「0」に設定し保存します。

really simple csv importerとsmart custom fields

この設定変更をしないと、CSVインポート実行時に30〜50件進んだところで「メモリ容量エラー」となって中断してしまいます。

作業当時、この設定がエラーの原因だと突き止めるのに丸1日を要しました...。

この設定を元に戻す必要がある場合は、インポート作業完了後に戻してください。

ここまでで準備が完了です。

手順⑤ Really Simple CSV Importerでインポート【完了】

インポート用ファイルをエクセルで編集中の方は、

エクセル → Googleスプレッドシート → CSV変換 → インポートする

という手順を踏むと、CSVインポート時に必ず発生する面倒な文字コード問題を意識しなくて良いので楽です。

ExcelファイルをGoogleスプレッドシートに移行する方法 ≫

からの↓

スプレッドシートをCSV形式で保存する【Googleスプレッドシート】 ≫

ぼくはエクセルで編集していたので上記リンクを参考にCSVに変換しました。

Googleスプレッドシートから変換、ダウンロードしたCSVファイルをReally Simple CSV Importerでインポートしてみましょう。

インポート完了後、記事の編集画面で以下のように繰り返しフィールドへファイル(や画像)が反映されていれば成功です。

↑TOP