Quantcast
Channel: notnil creation weblog » Web制作Tips
Viewing all articles
Browse latest Browse all 41

Really Simple CSV Importerを使ってAdvanced Custom FieldsのRepeater Fieldにデータをインポートする

$
0
0

拙作の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の設定画面

acf_sample1

繰り返しフィールドを使用しています

acf_sample2

実際の投稿画面はこんな風になります

acf_sample3

それでは、実際のカスタマイズ例をご紹介しましょう。下記のコードを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のフィールドにデータが取り込まれます。

acf_sample5

acf_sample4


Viewing all articles
Browse latest Browse all 41

Latest Images

Trending Articles