WelCart の SKU データ構造の追跡
SKUにフィールドを追加するにあたって、外部モジュールで追加したフィールドにデータを入れたい。
それには WelCart の SKU のデータ構造がわからないといけない。
例えば、POST ID と SKU の配列を投げ込めば、追加フィールドも含めて読み書きができれば、
追加フィールドはCSVで操作できないので、それが書ければデータの一括更新とかが楽になる。
とりあえず、WelCart の SKU データ構造の追跡だ。
ここまでで、
SKUは、[itemsku][sku id][field id] -> [itemsku][行番号][field id] で管理されてることが推測できる。
SKUは、POSTのメタデータにシリアライズされて保存してある。
要するに、カスタムフィールドに投げ込んであるってことね。
ここまでわかれば、POST ID を使って SKU のIOを作るのはそんな難しいことではない。
WP のカスタムフィールドのIOモジュールを使えば簡単に操作できる。
なぜ、WelCartが直接MySQLのコマンドを使っているかが不明だ。。。何か意味があるのかもう少し調べてみる。
案外簡単です。
sku は、配列データなのですが、get_post_metadata , add_post_metadata , update_post_metadata を使ってやればいちいちシリアライズ、アンシリライズしなくても勝手にやってくれるのでお手軽です。
わざわざかぶせものをするのは、IOに統一感を持たせるためで、直接 get_post_metadata($post_id,’_sku_’)などとやっても問題ありません。
それには WelCart の SKU のデータ構造がわからないといけない。
例えば、POST ID と SKU の配列を投げ込めば、追加フィールドも含めて読み書きができれば、
追加フィールドはCSVで操作できないので、それが書ければデータの一括更新とかが楽になる。
とりあえず、WelCart の SKU データ構造の追跡だ。
WelCart の SKU データ構造の追跡 の足掛かりで POSTの流れを追ってみる
$metadata = has_item_sku_meta($post->ID);// includes/edit-form-advanced.php -> functions/item_post.php
list_item_sku_meta($metadata); :
function list_item_sku_meta($skus){// functions/item_post.php
foreach ( $skus as $sku )// 1行づつ処理
echo _list_item_sku_meta_row( $sku ); :
function _list_item_sku_meta_row( $sku ){// functions/item_post.php
$key = esc_attr($sku[′code′]);
$cprice = $sku[′cprice′];
$price = $sku[′price′];
$zaikonum = $sku[′stocknum′];
$zaiko = $sku[′stock′];
$skudisp = esc_attr($sku[′name′]);
$skuunit = esc_attr($sku[′unit′]);
$skugptekiyo = $sku[′gp′];
$id = (int)$sku[′meta_id′]; <—
:
<input name=′itemsku[<?php echo $id; ?>][key]′・・・
<input name=′itemsku[<?php echo $id; ?>][cprice]′・・・
<input name=′itemsku[<?php echo $id; ?>][price]′・・・
<input name=′itemsku[<?php echo $id; ?>][zaikonum]′・・・
<input name=′itemsku[<?php echo $id; ?>][skudisp]′・・・
<input name=′itemsku[<?php echo $id; ?>][skuunit]′・・・
追加フィールド itemsku[ $id = (int)$sku[′meta_id′] ][field id]・・・
<select id=′itemsku[<?php echo $id; ?>][skugptekiyo]′・・・
list_item_sku_meta($metadata); :
function list_item_sku_meta($skus){// functions/item_post.php
foreach ( $skus as $sku )// 1行づつ処理
echo _list_item_sku_meta_row( $sku ); :
function _list_item_sku_meta_row( $sku ){// functions/item_post.php
$key = esc_attr($sku[′code′]);
$cprice = $sku[′cprice′];
$price = $sku[′price′];
$zaikonum = $sku[′stocknum′];
$zaiko = $sku[′stock′];
$skudisp = esc_attr($sku[′name′]);
$skuunit = esc_attr($sku[′unit′]);
$skugptekiyo = $sku[′gp′];
$id = (int)$sku[′meta_id′]; <—
:
<input name=′itemsku[<?php echo $id; ?>][key]′・・・
<input name=′itemsku[<?php echo $id; ?>][cprice]′・・・
<input name=′itemsku[<?php echo $id; ?>][price]′・・・
<input name=′itemsku[<?php echo $id; ?>][zaikonum]′・・・
<input name=′itemsku[<?php echo $id; ?>][skudisp]′・・・
<input name=′itemsku[<?php echo $id; ?>][skuunit]′・・・
追加フィールド itemsku[ $id = (int)$sku[′meta_id′] ][field id]・・・
<select id=′itemsku[<?php echo $id; ?>][skugptekiyo]′・・・
ここまでで、
SKUは、[itemsku][sku id][field id] -> [itemsku][行番号][field id] で管理されてることが推測できる。
skuの保存するところをみてみる
function item_save_metadata( $post_id, $post )
:
//SKU
if( isset($_POST[′itemsku′]) ){// $_POST -> 入力欄のitemskuの同一 id ( itemsku[id][key] )
:
foreach($_POST[′itemsku′] as $mid => $temp){// 使用している行番号を meta_ids へ送り込んでいる
$meta_ids[] = $mid;
}
$meta_ids = array_unique($meta_ids);// 行番号の重複を捨てている
foreach( $meta_ids as $meta_id ){// 行ごとに処理
$skucode = isset($_POST[′itemsku′][$meta_id][′key′]) ?・・・
$skucprice = isset($_POST[′itemsku′][$meta_id][′cprice′]) ?・・・
$skuprice = isset($_POST[′itemsku′][$meta_id][′price′]) ?・・・
$skustocknum = isset($_POST[′itemsku′][$meta_id][′zaikonum′]) ?・・・
$skustock = isset($_POST[′itemsku′][$meta_id][′zaiko′]) ?・・・
$skuname = isset($_POST[′itemsku′][$meta_id][′skudisp′]) ?・・・
$skuunit = isset($_POST[′itemsku′][$meta_id][′skuunit′]) ?・・・
$skugp = isset($_POST[′itemsku′][$meta_id][′skugptekiyo′]) ?・・・
$skusort = isset($_POST[′itemsku′][$meta_id][′sort′]) ?・・・
$skutaxrate = ( isset( $_POST[′itemsku′][$meta_id][′applicable_taxrate′] ) ) ?・・・
$skus[′code′] = $skucode;
$skus[′name′] = $skuname;
$skus[′cprice′] = $skucprice;
$skus[′price′] = $skuprice;
$skus[′unit′] = $skuunit;
$skus[′stocknum′] = $skustocknum;
$skus[′stock′] = $skustock;
$skus[′gp′] = $skugp;
$skus[′sort′] = $skusort;
if( !empty( $skutaxrate ) ) {
$skus[′taxrate′] = $skutaxrate;
}
$skus = $usces->stripslashes_deep_post($skus);
$skus = apply_filters( ′usces_filter_item_save_sku_metadata′, $skus, $meta_id );
// シリアライズして 。。。 (読み込むときは unserialize してやる必要がある)
$valueserialized = serialize($skus); // DB へ書き込み
$res = $wpdb->query( $wpdb->prepare("UPDATE $wpdb->postmeta ・・・
:
//SKU
if( isset($_POST[′itemsku′]) ){// $_POST -> 入力欄のitemskuの同一 id ( itemsku[id][key] )
:
foreach($_POST[′itemsku′] as $mid => $temp){// 使用している行番号を meta_ids へ送り込んでいる
$meta_ids[] = $mid;
}
$meta_ids = array_unique($meta_ids);// 行番号の重複を捨てている
foreach( $meta_ids as $meta_id ){// 行ごとに処理
$skucode = isset($_POST[′itemsku′][$meta_id][′key′]) ?・・・
$skucprice = isset($_POST[′itemsku′][$meta_id][′cprice′]) ?・・・
$skuprice = isset($_POST[′itemsku′][$meta_id][′price′]) ?・・・
$skustocknum = isset($_POST[′itemsku′][$meta_id][′zaikonum′]) ?・・・
$skustock = isset($_POST[′itemsku′][$meta_id][′zaiko′]) ?・・・
$skuname = isset($_POST[′itemsku′][$meta_id][′skudisp′]) ?・・・
$skuunit = isset($_POST[′itemsku′][$meta_id][′skuunit′]) ?・・・
$skugp = isset($_POST[′itemsku′][$meta_id][′skugptekiyo′]) ?・・・
$skusort = isset($_POST[′itemsku′][$meta_id][′sort′]) ?・・・
$skutaxrate = ( isset( $_POST[′itemsku′][$meta_id][′applicable_taxrate′] ) ) ?・・・
$skus[′code′] = $skucode;
$skus[′name′] = $skuname;
$skus[′cprice′] = $skucprice;
$skus[′price′] = $skuprice;
$skus[′unit′] = $skuunit;
$skus[′stocknum′] = $skustocknum;
$skus[′stock′] = $skustock;
$skus[′gp′] = $skugp;
$skus[′sort′] = $skusort;
if( !empty( $skutaxrate ) ) {
$skus[′taxrate′] = $skutaxrate;
}
$skus = $usces->stripslashes_deep_post($skus);
$skus = apply_filters( ′usces_filter_item_save_sku_metadata′, $skus, $meta_id );
// シリアライズして 。。。 (読み込むときは unserialize してやる必要がある)
$valueserialized = serialize($skus); // DB へ書き込み
$res = $wpdb->query( $wpdb->prepare("UPDATE $wpdb->postmeta ・・・
SKUは、POSTのメタデータにシリアライズされて保存してある。
要するに、カスタムフィールドに投げ込んであるってことね。
ここまでわかれば、POST ID を使って SKU のIOを作るのはそんな難しいことではない。
WP のカスタムフィールドのIOモジュールを使えば簡単に操作できる。
なぜ、WelCartが直接MySQLのコマンドを使っているかが不明だ。。。何か意味があるのかもう少し調べてみる。
SKU を POST ID を使って入出力する
案外簡単です。
/********************************************************/
function yuzu_cartcstm_sku_get($post_id)
/********************************************************/
{
$sku = get_post_meta( $post_id, ′_isku_′) ;
//— $sku —
//sku[0]["code"]
//sku[0]["name"]=>
//sku[0]["cprice"]=>
//sku[0]["price"]=>
//sku[0]["unit"]=>
//sku[0]["stocknum"]=>
//sku[0]["stock"]=>
//sku[0]["gp"]=>
//sku[0]["sort"]=>
//sku[0]["advance"]=>
//sku[1]["code"]
//sku[1]["name"]=>
//:
//p_dump($sku,′sku′);
return($skus);
}
/********************************************************/
function yuzu_cartcstm_sku_put($post_id,$meta_value)
/********************************************************/
{
if( ! add_post_meta( $post_id, ′_sku_′, $meta_value, true) ){
update_post_meta( $post_id, $meta_key, $meta_value);//, $prev_value );
}
}
function yuzu_cartcstm_sku_get($post_id)
/********************************************************/
{
$sku = get_post_meta( $post_id, ′_isku_′) ;
//— $sku —
//sku[0]["code"]
//sku[0]["name"]=>
//sku[0]["cprice"]=>
//sku[0]["price"]=>
//sku[0]["unit"]=>
//sku[0]["stocknum"]=>
//sku[0]["stock"]=>
//sku[0]["gp"]=>
//sku[0]["sort"]=>
//sku[0]["advance"]=>
//sku[1]["code"]
//sku[1]["name"]=>
//:
//p_dump($sku,′sku′);
return($skus);
}
/********************************************************/
function yuzu_cartcstm_sku_put($post_id,$meta_value)
/********************************************************/
{
if( ! add_post_meta( $post_id, ′_sku_′, $meta_value, true) ){
update_post_meta( $post_id, $meta_key, $meta_value);//, $prev_value );
}
}
sku は、配列データなのですが、get_post_metadata , add_post_metadata , update_post_metadata を使ってやればいちいちシリアライズ、アンシリライズしなくても勝手にやってくれるのでお手軽です。
わざわざかぶせものをするのは、IOに統一感を持たせるためで、直接 get_post_metadata($post_id,’_sku_’)などとやっても問題ありません。