Really Simple CSV Importerを使ってAdvanced Custom FieldsのRepeater Fieldにデータをインポートする
Posted by admin at 7:47 日時 2013/10/08
拙作のWordPressプラグイン、Really Simple CSV Importerにはフィルターフックが用意してあり、活用すればCSVファイルから読み込んだデータをインポート前に様々に加工することが可能です。このフィルターフックを活用して、2000件くらいのブログ記事にあとからカスタムフィールドやカスタムタクソノミーのデータを追加するという仕事があり、その下調べとして色々試してみたので、ブログでもご紹介します。
今回は一例としてAdvanced Custom Fields(ACF)プラグインのRepeater Fieldアドオン(有償)で作ったフィールドにインポートする方法を取り上げます。フィルターフックの詳細はプラグインのOther Notesのページをご参照ください。
今回用意したCSVデータはこんなデータです。
post_status | post_title | textfield | select | text_1 | text_2 | text_3 | num_1 | num_2 | rnum_3 |
publish | ACFインポートテスト | インポートテキスト | red | 繰り返し1 | 繰り返し2 | 繰り返し3 | 100 | 101 | 102 |
publish | ACFインポートテスト2 | red,blue | あ | い | 250 |
このうち、”textfield” と “select” の値をそれぞれACFのフィールドにインポートしたいと思います。そして、”select” の値はACFのセレクトボックスにインポートしたいと思います。この場合、カンマ区切りのままではだめで、配列に変換する必要があります。
“text_1” “text_2” “text_3” “num_1” “num_2” “num_3” のそれぞれは、Repeater Field(繰り返しフィールド)にインポートしたいと思います。この場合、6つのフィールドに入っているデータを1つの配列にまとめてあげる必要があります。
ACFの設定画面
繰り返しフィールドを使用しています
実際の投稿画面はこんな風になります
それでは、実際のカスタマイズ例をご紹介しましょう。下記のコードをphpファイルに保存し、wp-content/plugins/ ディレクトリーにアップロードし、プラグインとして有効化します。
<?php /* Plugin Name: RS CSV Importer Customizer Version: 0.1 */ function rsci_meta_filter( $meta, $post, $is_update ) { echo '<pre>'; print_r($meta); echo '</pre>'; $meta_array = array(); $repeater_array = array(); foreach ($meta as $key => $value) { // カスタムフィールド名が "textfield" だった時 if ($key == 'textfield') { // ACF用のフィールドキーに変換 $meta_array['field_52528d5b8ad30'] = $value; // カスタムフィールド名が "select" だった時 } elseif ($key == 'select') { // カンマで分割して配列として登録 $meta_array['field_52528dc88ad31'] = preg_split("/,+/", $value); // 繰り返しフィールド用のデータを配列に入れていく処理 } elseif ($key == 'text_1') { $repeater_array[0]['repeater_text'] = $value; } elseif ($key == 'text_2') { $repeater_array[1]['repeater_text'] = $value; } elseif ($key == 'text_3') { $repeater_array[2]['repeater_text'] = $value; } elseif ($key == 'num_1') { $repeater_array[0]['repeater_number'] = $value; } elseif ($key == 'num_2') { $repeater_array[1]['repeater_number'] = $value; } elseif ($key == 'num_3') { $repeater_array[2]['repeater_number'] = $value; // ACF以外のメタデータはそのまま通す } else { $meta_array[$key] = $value; } } // 繰り返しフィールドの配列を戻す $meta_array['field_52528dea8ad32'] = $repeater_array; echo '<pre>'; print_r($meta_array); echo '</pre>'; return $meta_array; } add_filter( 'really_simple_csv_importer_save_meta', 'rsci_meta_filter', 10, 3 );
では、このプラグインが何をしているかの解説です。カスタムフィールドのデータは配列として、”really_simple_csv_importer_save_meta”フィルターを通ります。
Array ( [textfield] => インポートテキスト [select] => red [text_1] => 繰り返し1 [text_2] => 繰り返し2 [text_3] => 繰り返し3 [num_1] => 100 [num_2] => 101 [num_3] => 102 )
このままではACFのデータとして取り込まれませんので、”textfield”など仮のフィールドキーをACF用のフィールドキーに置き換えてあげる必要があります。
// カスタムフィールド名が "textfield" だった時 if ($key == 'textfield') { // ACF用のフィールドキーに変換 $meta_array['field_52528d5b8ad30'] = $value; }
また、複数データをカンマ区切りでCSVファイルの中に入れているときなどは、カンマで分割して配列に変更してあげる必要があります。
if ($key == 'select') { // カンマで分割して配列として登録 $meta_array['field_52528dc88ad31'] = preg_split("/,+/", $value); }
繰り返しフィールド用のデータは少し複雑なことをしていて、複数の値を配列として再構成しています。
Array ( [0] => Array ( [repeater_text] => 繰り返し1 [repeater_number] => 100 ) [1] => Array ( [repeater_text] => 繰り返し2 [repeater_number] => 101 ) [2] => Array ( [repeater_text] => 繰り返し3 [repeater_number] => 102 ) )
再構成した繰り返しフィールド用のデータも、メタデータの配列に戻しています。
$meta_array['field_52528dea8ad32'] = $repeater_array;
最終的にはこういう配列になるように加工しています。そんなに難しくないと思います。
Array ( [field_52528d5b8ad30] => インポートテキスト [field_52528dc88ad31] => Array ( [0] => red ) [field_52528dea8ad32] => Array ( [0] => Array ( [repeater_text] => 繰り返し1 [repeater_number] => 100 ) [1] => Array ( [repeater_text] => 繰り返し2 [repeater_number] => 101 ) [2] => Array ( [repeater_text] => 繰り返し3 [repeater_number] => 102 ) ) )
加工がうまく行っていれば、無事ACFのフィールドにデータが取り込まれます。