Bloosh Company

2021年5月4日

Development>WordPress

Really Simple CSV Importerのフックでカスタムフィールドの情報を本文に追加する

, , ,

Word Pressのプラグイン「Really Simple CSV Importer」を使用すると、大量の記事データを一気に登録できて便利です。
 
そこで、例えば投稿記事とは別に、お店情報を登録したい場合。
そんなときに、本文に追加してしまえば、検索に含めることができてとても便利になります。
※現状では、カスタムフィールドの情報は検索に引っ掛かりません。
その他、2つの小技を紹介します。
 
カスタムタクソノミーとカスタムフィールドを使って投稿記事とは別のデータを登録する
 
上の記事の通り、データを登録する準備までできたものとします。
で、まずはCSVファイルを用意します。
必須カラムはpost_typeです。こんな感じ。

※文字コードはUTF-8で。エクセルで文字コード指定しても直らない時は、メモ帳で開いてUTF-8で保存


Really Simple CSV Importerのフィルターフックを使えば、手間を減らせます。
 

手間その1:post_status(公開状態)

post_statusは必須ではありませんが、指定しなければ記事状態が「下書き」で登録されてしまいます。いちいち「公開」データを登録するのは面倒なので下記内容をfunctions.phpに追加します。

//csv登録時、postをpublishに
function modify_csv_post($post, $is_update){
	$post["post_status"] = "publish";
	return $post;
}
add_filter('really_simple_csv_importer_save_post', 'modify_csv_post', 10, 2 );

 

手間その2:カテゴリー

カテゴリーを登録するには、カテゴリーのスラッグを登録しないといけません。
しかし、CSVでお店カテゴリーをアルファベットで管理してると分かりにくいので、まず日本語で書いておきます。
カスタムタクソノミー内のカテゴリーに登録する場合は、CSVのカラムのヘッダーに「tax_」をつけます。※上の画像参照。
下の例は、カスタムタクソノミー内のカテゴリー「shop_category」に日本語から変換して登録してます。

//csv登録時、カスタムカテゴリーを振り分け
function modify_csv_tax($tax, $post, $is_update){

	$tax["shop_category"] = str_replace("中華","chinese",$tax["shop_category"]);
	$tax["shop_category"] = str_replace("和食","japanese",$tax["shop_category"]);
	$tax["shop_category"] = str_replace("スイーツ","sweets",$tax["shop_category"]);

	return $tax;

}
add_filter('really_simple_csv_importer_save_tax', 'modify_csv_tax', 10, 3 );

 

手間その3:カスタムフィールドの内容を本文に追加する

手間その1、その2はおまけでした。ラスボスのカスタムフィールドの本文追加です。

//csv登録時、カスタムフィールド内容を本文に追加
function csv_saved($post_object){

	if( !($post_object instanceof WP_Post) ) return;

	$post_id = $post_object->ID;

	if( !$post_id ) return;

	$cf = get_post_custom($post_id);

	if( empty($cf) ) return;

	$content = "";
	foreach ($cf as $key => $value) {
		foreach ($value as $v) {
			$content .= $v . "\n";
			$_POST[$key] = $v;
		}
	}


	// カスタムフィールドのデータで本文を更新するための配列を用意
	$my_post = array(
		'ID' => $post_id, // IDは必須
		'post_content' => $content
	);


	// wp_update_post関数で投稿を更新
	wp_update_post($my_post);

	return;

}
add_action('really_simple_csv_importer_post_saved', 'csv_saved', '99', 2);
//add_action

プラグインの中でpost_idが発行され、カスタムフィールドが登録された後のタイミングでフックしてます。
なんだかよく分かりませんがPOSTでデータをやり取りしてるらしく、改めてPOSTにカスタムフィールドのデータを入れてやらないと、空白で上書きされてしまいます。
お店データの本文をウェブサイトで表示しないなら、このまま保存しておけます。
そうでなければ、display: none;のブロックで囲ってあげればいいと思います。
 

カスタムフィールド上書き対策

このままでは、管理画面からカスタムフィールドを上書きして保存した際に、本文に追加したデータと齟齬が生じます。
保存時に本文も上書きするようにします。
 
下記、前述のカスタムタクソノミーとカスタムフィールドを使って投稿記事とは別のデータを登録するで作った関数save_custom_fields()※areaは省略

function save_custom_fields( $post_id, $post, $update) {

	if (get_post_type($post_id) != "shop"){
		return;
	}

	$addr = "";
	if(isset($_POST['addr'])){
		$addr = $_POST['addr'];
		update_post_meta($post_id, 'addr', $addr);
	}else{
		delete_post_meta($post_id, 'addr');
	}

	$specialty = "";
	if(isset($_POST['specialty'])){
		$specialty = $_POST['specialty'];
		update_post_meta($post_id, 'specialty', $specialty);
	}else{
		delete_post_meta($post_id, 'specialty');
	}


	// 更新するための配列を用意
	$my_post = array(
		'ID' => $post_id, // IDは必須
		'post_content' => $addr . "\n". $specialty
	);

	// この関数をフックから外し、無限ループを防ぐ。
	remove_action( 'save_post', 'save_custom_fields', 99, 3);

	// wp_update_post関数で投稿を更新 
	wp_update_post($my_post);

	// この関数を改めてフックする。
	add_action( 'save_post', 'save_custom_fields', 99, 3);

}
add_action('save_post', 'save_custom_fields', 99, 3);
Really Simple CSV Importerのフックでカスタムフィールドの情報を本文に追加する #WordPress #functionsphp #ReallySImpleCSVImporter #カスタムフィールド #プラグイン

<<次の記事

カスタムフィールドのデータを本文に挿入して検索対象にする

前の記事>>

lightgallery.jsのサムネイル画像のサイズを小さくして動作を軽くする