質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.23%

WordPressプラグインのWelcartで送料を商品の重量(個口数)で設定するためのカスタマイズでSKUの重量が取得できない

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,178

tks8888

score 10

前提・実現したいこと

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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • 退会済みユーザー

    退会済みユーザー

    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で取得している値が適切か、など)

    キャンセル

回答 1

check解決した方法

0

難しそうなので他のシステムを使うことにしました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.23%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • トップ
  • PHPに関する質問
  • WordPressプラグインのWelcartで送料を商品の重量(個口数)で設定するためのカスタマイズでSKUの重量が取得できない