web-dev-qa-db-ja.com

アイテムのn番目の数ごとにWoocommerceの均一料金を変更する

私の問題の半機能的な解決策がこの回答で見つかりました WooCommerce-X数量ステップに基づく定額配送? しかし、これはカートアイテムの合計数量を数えます。顧客が一緒に梱包できる小さなアイテムを追加すると、このアイテムはカートアイテムの合計がしきい値を超えるため、送料が2倍になります。特定のクラス(つまり、大口配送クラス)がしきい値を超えた場合にのみ、配送料を2倍にする必要があります。ここに私が必要なもののいくつかの例があります。

サイト内の商品は2種類

  • シャツ(1つのパッケージで発送できるのは3つまでです)-「大量発送クラス」で分類
  • リング(1つのパッケージでそれらの多くを送信できます)

お客様がこれらの2つの製品の組み合わせを購入した場合は、シャツパッケージにリングを追加できるため、配送料金を設定して最大の配送クラス(大量配送)を請求しました。

これが注文のサンプルです

  • Tシャツ3枚=送料$ 8
  • Tシャツ3枚+指輪6枚=送料8ドル
  • Tシャツ4枚=送料$ 16(3秒ごとに2倍になります)
  • Tシャツ4枚+リング6個= $ 16(カートの数量としてリングは無視されます)

これは、以下のコードが行っていることです

  • Tシャツ3枚=送料$ 8(Good)
  • Tシャツ3枚+指輪1枚=送料$ 16(不良)
  • 6枚のTシャツ=送料$ 16(良好)

私のジレンマを参照してください?以下のコードを変更して、カートの数量ではなく、特定の配送クラスの商品のみをカウントしたいと思います。

これがコードです

add_filter( 'woocommerce_package_rates', 
   'change_shipping_method_rate_based_on_shipping_class_2', 11, 2 );
   function change_shipping_method_rate_based_on_shipping_class_2( $rates, $package ){

        $items_count  = WC()->cart->get_cart_contents_count(); // Cart item count
        $items_change = 5; // number of items needed to increase the cost each time
        $rate_operand = ceil( $items_count / $items_change ); // Operand increase each 5 items here

        foreach ( $rates as $rate_key => $rate ){
           // Targetting "Flat rate"
           if( 'flat_rate' === $rate->method_id ) {
              $has_taxes = false;

              // Set the new cost
              $rates[$rate_key]->cost = $rate->cost * $rate_operand;

              // Taxes rate cost (if enabled)
              foreach ($rates[$rate_key]->taxes as $key => $tax){
                 if( $tax > 0 ){
                     // New tax calculated cost
                     $taxes[$key] = $tax * $rate_operand;
                     $has_taxes = true;
                 }
           }
           // Set new taxes cost
           if( $has_taxes )
           $rates[$rate_key]->taxes = $taxes;
        }
    }
    return $rates;
}

どんな助けでもありがたいです

1
LOTUSMS

特定の配送クラスに属するカートアイテムの数量カウントに基づいて「定額」の配送料を変更するには、少し異なるものが必要になります。

add_filter( 'woocommerce_package_rates', 'progressive_shipping_cost_based_shipping_class_quantity_steps', 10, 2 );
function progressive_shipping_cost_based_shipping_class_quantity_steps( $rates, $package )
{
    // HERE Bellow your settings
    $shipping_class = "large-shipping"; // The shipping class ID
    $qty_step       = 3; // Items qty threshold for a step
    $item_count     = 0; // Initializing

    // Get the shipping class ID
    $class_id = get_term_by('slug', $shipping_class, 'product_shipping_class' )->term_id;


    // Loop through in cart items to get the Tshirts count
    foreach( $package['contents'] as $cart_item ) {
        if ( $cart_item['data']->get_shipping_class_id() == $class_id ){
            $item_count += $cart_item['quantity']; // Count Tshirts
        }
    }

    // The rate operand increase each {$qty_step} depending on {$item_count}
    $rate_operand = ceil( $item_count / $qty_step );

    foreach ( $rates as $rate_key => $rate ){
        // Targetting "Flat rate"
        if( 'flat_rate' === $rate->method_id ) {
            $has_taxes = false;

            // Set the new cost
            $rates[$rate_key]->cost = $rate->cost * $rate_operand;

            // Taxes rate cost (if enabled)
            foreach ($rates[$rate_key]->taxes as $key => $tax){
                if( $tax > 0 ){
                    // New tax calculated cost
                    $taxes[$key] = $tax * $rate_operand;
                    $has_taxes = true;
                }
            }
            // Set new taxes cost
            if( $has_taxes )
                $rates[$rate_key]->taxes = $taxes;
        }
    }
    return $rates;
}

コードは、アクティブな子テーマ(またはアクティブなテーマ)のfunction.phpファイルに入ります。テストして動作します。

配送キャッシュを更新する:(必須)

  1. このコードは、アクティブなテーマのfunction.phpファイルに既に保存されています。
  2. カートは空です
  3. 配送ゾーンの設定で、配送方法を無効/保存してから、有効/元に戻します。
2
LoicTheAztec