Blog

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のフィールドにデータが取り込まれます。


Share this entry