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

- WordPress -
2019.11.25
WordPress

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

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

②のSmart Custom Fieldsの繰り返しフィールドのインポート自体は、プラグイン作者さんのアドオンを使えば簡単ですが、③④のコンボ(特に④)で非常に苦労しました

というのも、繰り返しフィールドへの画像/ファイルインポートは、事前にメディアアップロードしておく必要があります(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行目の★部分は環境に合わせ書き換えるのでとりあえずそのままどうぞ。

// 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スプレッドシートで以下のようにカンマ区切りでつなげつつ貼り付けていきます。

ここまでで作業自体は完了。あとはCSVに変換しインポートするだけです。

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

エクセルで編集中の方は、

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

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

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

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

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

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

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