前提・実現したいこと
WordPressプラグインのWelcartで通販サイトを作っています。
同時に注文した商品のサイズによって発送の個口数が変わるため、個口数によって請求する送料が変わるようにしたい。
商品のSKUに重量を設定して、同時に注文した商品の合計重量で個口数を計算し、「個口数×送り先の都道府県別の送料」を計算して請求できるようにしたい。
発生している問題・エラーメッセージ
検索して調べて、SKUに重量を設定するところまではできたが、注文された商品の重量の合計を取得する方法がわからない。
SKUで設定した重量が保存されていないのか、取得方法が間違っているようで、取得しても空欄になってしまう。
試したこと
次のサイトを参考に、重量を設定できるようにしました。
http://web.contempo.jp/weblog/tips/welcart%E3%81%AEsku%E5%86%85%E3%81%AB%E5%85%A5%E5%8A%9B%E9%A0%85%E7%9B%AE%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B%E3%80%82
ここで設定した重量をもとに、個口数を計算して、送り先の都道府県別送料×個口数で送料を出したいができていない。
次のサイトを参考に、個口数を計算して、送り先の都道府県別送料×個口数で送料を出そうとしたが、SKUに追加した重量を取得すると値が0になっていて正しい値が取得できない。
https://teratail.com/questions/100686
var_dump($carts);で出力を確認したところ、 「["advance"]=> string(0) ""」となっていて重量のカスタム項目が正しく保存されていないのか、取得できていない状況。
ソースコード
SKUに重量のカスタム項目を追加する部分
functions.phpに記述しています。
add_filter( 'usces_filter_sku_meta_form_advance_title', 'add_new_sku_meta_title'); //項目を追加
function add_new_sku_meta_title(){
return '<th colspan="2">カスタム項目</th>';
}
add_filter( 'usces_filter_sku_meta_form_advance_field', 'add_new_sku_meta_field'); //フィールドを新規追加
function add_new_sku_meta_field(){
return '<td colspan="2" class="item-sku-zaikonum"><input name="newskuadvance" type="text" id="newskuadvance" class="newskuadvance metaboxfield" /></td>'."n";
}
add_filter( 'usces_filter_sku_meta_row_advance', 'add_new_sku_meta_row_advance',10,2); //フィールドを追加
function add_new_sku_meta_row_advance( $default_field, $sku ){
$metaname = 'itemsku[' .$sku["meta_id"]. '][skuadvance]';
return '<td colspan="2" class="item-sku-zaikonum"><input name="' .$metaname.'" type="text" id="' .$metaname. '" class="newskuadvance metaboxfield" value="' .$sku["advance"]. '"/></td>'."n";
}
add_filter( 'usces_filter_add_item_sku_meta_value', 'add_new_sku_meta'); //新規項目を作成
function add_new_sku_meta($value){
$skuadvance = isset($_POST['newskuadvance']) ? $_POST['newskuadvance'] : '';
$value['advance'] = $skuadvance;
return $value;
}
add_filter( 'usces_filter_up_item_sku_meta_value', 'up_new_sku_meta'); //項目を変更
function up_new_sku_meta($value){
$skuadvance = isset($_POST['skuadvance']) ? $_POST['skuadvance'] : '';
$value['advance'] = $skuadvance;
return $value;
}
add_filter( 'usces_filter_item_save_sku_metadata', 'save_new_sku_meta',10,2 ); //項目を保持
function save_new_sku_meta( $skus, $mid ){
$skuadvance = isset($_POST['itemsku'][$mid]['skuadvance']) ? $_POST['itemsku'][$mid]['skuadvance']: '';
$skus['advance'] = $skuadvance;
return $skus;
}
重量で送料を再計算する部分
functions.phpに記述しています。
// 重量2までを1個口として送料を重量で計算しなおす
add_filter('usces_filter_set_cart_fees_shipping_charge', 'custom_filter_set_shipping_charge', 10, 3);
function custom_filter_set_shipping_charge($shipping_charge, $carts, $entries){
$weight = 0;
foreach($carts as $cart){
$weight += $cart['advance']; //重量を加算したいが、$cart['advance']の値が0になっている
}
$shipping_charge = intval( $weight / 2 + 0.5 ) * $shipping_charge;
return $shipping_charge;
}
補足情報(FW/ツールのバージョンなど)
WordPress 5.0.2
PHP 7.3.0
Welcart 1.9.14
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.23%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
質問への追記・修正、ベストアンサー選択の依頼
退会済みユーザー
2018/12/27 21:12
custom_filter_set_shipping_charge関数の頭で$cartsをvar_dumpしてみてください。どのような出力がえられますか?
tks8888
2018/12/28 09:54
ありがとうございます。
custom_filter_set_shipping_chargeの頭でvar_dump($carts);したところ、次の出力が得られました。
array(1) { [0]=> array(7) { ["serial"]=> string(37) "a:1:{i:1540;a:1:{s:7:"sample1";i:0;}}" ["post_id"]=> int(1540) ["sku"]=> string(7) "sample1" ["options"]=> array(0) { } ["price"]=> string(4) "1000" ["quantity"]=> int(3) ["advance"]=> string(0) "" } }
商品登録ページでは重量を設定して保存されていますが、ここでは重量の["advance"]は空欄になっているようです。
よろしくお願いいたします。
退会済みユーザー
2018/12/28 11:48
追記、ご確認ありがとうございます。
$carts["advance"]が正常に保存されていないようなので、保存処理としてフックしている関数が正常に動いているか確認して、問題の切り分けをはかってみてはいかがでしょうか。(保存処理そのものが実行されているか、_POSTで取得している値が適切か、など)