Help us understand the problem. What is going on with this article?

Advanced Custom FieldsとReally Simple CSV Importerでカスタムフィールド の値をCSVインポート

More than 1 year has passed since last update.

やること

プラグイン「Really Simple CSV Importer」のreally_simple_csv_importer_save_metaにフックさせます。
(フックって何?って人も気にせず読み進めて大丈夫です。僕もわからなかったです。)

カスタムフィールドの中身はこんなイメージっぽい

array{
    [field名] => value,                             // テキスト、セレクト、ラジオボタン
    [field名] => array{value1, value2, value3},     // チェックボックス
    [field名] => array{                             // グループ
        [field名] => value                          // の中のテキスト、セレクト、ラジオボタン
        [field名] => array{value1, value2, value3}, // の中のチェックボックス
    },
    [field名] => array {                            // 繰り返しフィールド
        [0] => array {
            [field名] => value,                     // の中のテキスト、セレクト、ラジオボタン
            [field名] => array{valu1, value2}       // の中のチェックボックス
        },
        [1] => array {
            [field名] => value,                     // の中のテキスト、セレクト、ラジオボタン
            [field名] => array{valu1, value2}       // の中のチェックボックス
        }
    }
}

これに合うように処理を書く。

CSVはこんな感じ

ID,post_type,post_author,post_date,post_content,post_title,post_status,テキスト,セレクト,チェックボックス,ループテキスト1,ループテキスト2,ループテキスト3,ループチェックボックス1,ループチェックボックス2,ループチェックボックス3,グループテキスト,グループチェックボックス,セレクト,ラジオ,datetime,日付,Aの場合,Bの場合
,post,1,2018/11/1,,test3,publish,testtext,select2,"checkbox1,checkbox2,checkbox3",looptest,looptest,looptest,check3,check2,check1,grouptest,check2,select2,radio3,2018/10/30,A,a2,

処理はこんな感じ

Custom_field_importer.php
/*  Plugin Name: custom_field_importer  */

function rsci_meta_filter( $meta, $post, $is_update ) {

    echo '<pre>';
    print_r($meta);
    echo '</pre>';

    // meta_array という配列を作って最後にreturnする。
    $meta_array = array();

    // Groupや繰り返しフィールドは、それぞれでまとまった配列を作り、最後に配列ごと$meta_arrayに入れる
    // 繰り返しフィールド用
    $looptest = array();

    // Group用
    $grouptest = array();

    // 繰り返しフィールド用
    $i = 0;

    foreach ($meta as $key => $value) { // $keyはcsvのカラム名、$valueはcsvの値

        $value = trim($value); // 値の前後の空白は削除しとく

        if ($value !== '') { // 値がなかったら無視

            // テキスト、セレクトボックス(1つ選択)、ラジオボタンなどはそのまま突っ込む
            if ($key == 'テキスト' ) {
                $meta_array['text'] = $value; //「text」は管理画面で指定したフィールド名。「フィールドキー」でもOK
            } elseif ($key == 'セレクト' ) {
                $meta_array['select'] = $value;
            } elseif ($key == '日付' ) {
                $meta_array['date'] = $value;


            // チェックボックスは配列にする
            } elseif ($key == 'チェックボックス' ) {
                $meta_array['checkbox'] = preg_split("/,+/", $value);


            // 繰り返しフィールド
            } elseif (preg_match('/^ループテキスト[0-9]+$/', $key) === 1) {
                $loop[$i]['text'] = $value;
            } elseif (preg_match('/^ループチェックボックス[0-9]+$/', $key) === 1) {
                $loop[$i]['checkbox'] = preg_split("/,+/", $value);
                $i ++;


            // Group
            } elseif ($key == 'グループテキスト') {
                $group['text'] = $value;
            } elseif ($key == 'グループチェックボックス') {
                $group['checkbox'] = preg_split("/,+/", $value);
            } elseif ($key == 'セレクト') {
                $group['select'] = $value;
            } elseif ($key == 'ラジオ') {
                $group['radio'] = $value;


            // 条件判定
            } elseif ($key == '条件') {
                $if['select'] = $value;
            } elseif ($if['select'] == 'A' && $key == 'Aの場合') {
                $if['checkbox'] = preg_split("/,+/", $value);
            } elseif ($if['select'] == 'B' && $key == 'Bの場合') {
                $if['checkbox'] = preg_split("/,+/", $value);
        }
    }

    // 他は「フィールド名」でいいのに、繰り返しとGroupの配列を入れるときは「フィールドキー」じゃないとダメだった
    // 「フィールドキー」は管理画面の表示オプションから表示させることができます。
    $meta_array['field_xxxxxxxxxxx'] = $loop;
    $meta_array['field_xxxxxxxxxxx'] = $group;
    $meta_array['field_xxxxxxxxxxx'] = $if;

    echo '<pre>';
    print_r($meta_array);
    echo '</pre>';

    return $meta_array;
}  add_filter( 'really_simple_csv_importer_save_meta', 'rsci_meta_filter', 10, 3 );

報告したときのメモも残しとく

  • このファイルをプラグインとして利用します。

  • サンプルのcsvファイルのカラム名は、ユーザーが入力することを考え日本語にしてあります。
    IDどの投稿基本情報部分のカラムを日本語にするのはできないようです。

  • カラム名は基本的に管理画面のフィールドラベルと同じ値になっていますが、重複しているものは変更してあります。

  • csvファイルの文字コードはutf8でお願いします。作成する際は、Googleスプレッドシートが良いです。

  • csvファイルのカラム名を見て処理を変えているため、カラム名を変更する場合はコードの変更が必要です。また、カラム名の重複はNGです。

  • 繰り返しフィールドの項目は動的に増えるようにしています。
    下はカラム指定方法です。(カラム名+数字の正規表現で判断)
    (columnA1, columnB1, columnC1, columnA2, columnB2, columnC2)
    数字で自動的に対応するようにはなっていないため、カラムの順番は揃えてください。
    下の場合、「columnA1, columnB2」、「columnA2, columnB1」という塊になります。
    (columnA1, columnB2, columnA2, columnB1)

  • セレクト、チェックボックス、ラジオボタンなどの選択肢が、A:B(ex, 1:りんご)と指定されている場合、csvファイルにはA(1)の値を記入します。

  • チェックボックなど複数選択フィールドの値は、1つのセルにカンマ区切りで値を入力してください。テキストファイルの場合は""で囲ってください。

pappikko
おじいちゃんの孫
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away