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

- WordPress -
2020.06.18
WordPress

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

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

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

しかし、③④のコンボ(特に④)で非常に苦労しました。

というのも、繰り返しフィールドへの画像/ファイルインポートは、インポート作業前にファイルそのものをメディアアップロードしておく必要があります(WordPressが保持する"ID"をCSVに書く必要がある)。

「事前にメディアアップロードしておくのが面倒。CSVにURLを記載→インポートするだけでメディアアップロードも記事への紐付けも終わらせたい!」

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

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

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

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

本記事で想定する例

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

SCFの繰り返しフィールド

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

そして、Really Simple CSV Importerでインポートが完了したら以下のようにファイルが記事に紐づいている状態を目指します。

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

また、ファイルをインポートする際に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をペーストします。複数ある場合は以下のようにカンマ区切りでつなげます。

手順④ WordPressのメディア設定を変更

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

really simple csv importerとsmart custom fields

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

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

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

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

手順⑤ Really Simple CSV Importerでインポート

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

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

という手順を踏むと、面倒な文字コード問題を意識しなくて良いので楽です。

ExcelファイルをGoogleスプレッドシートに移行する方法
スプレッドシートをCSV形式で保存する【Googleスプレッドシート】

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

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

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

これで、「事前に画像、ファイルを事前にメディアアップロードしておく」という手間が一気に省けました。

↑TOP