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);