Woocommerce 2つ目から割引

情報を追記している場合はありますが、古い情報を訂正はしていませんので、公開年月日を参照してください。プラグイン・タグ、いずれもワードプレス・PHPのバージョン等によって動作しない場合もあります。

有料の出展申し込み・決済にWoocommerce を導入することになったが、特定の部門のみ2ブース目から1,000円割引という料金設定で、これを実現できるアドオンを探したが…

いくつ以上で何パーセント割引という設定ができるアドオンはあるが、2つ目からというのが難しく、オプションを設定できる有料のアドオンで、1つカートに入れて追加分をオプションで料金を設定、というのは可能そうだが、それではやはりわかりにくいだろう。

2つ目のアイテムを割引するというコードを見つけたので、2つ目以降を割引と書き換えてみたが、同じアイテムを複数カートに入れた場合は対象外となる。

特定のカテゴリーの注文数が2つ以上の場合、注文数の合計マイナス1×割引額をサブトータルから引く、を目標に、
https://stackoverflow.com/questions/45255375/apply-a-discount-only-on-the-second-cart-item-in-woocommerce
https://stackoverflow.com/questions/28576667/get-cart-item-name-quantity-all-details-woocommerce
https://gist.github.com/rwkyyy/26adeb4b418e59199a6e7d94f8cbe202
を参考に

add_action( 'woocommerce_cart_calculate_fees', 'discount_subtotal', 10, 1 );
function discount_subtotal( $cart ) {
  global $woocommerce;

    if ( is_admin() && ! defined( 'DOING_AJAX' ) )
        return;

    if ( did_action( 'woocommerce_cart_calculate_fees' ) >= 2 )
        return;

    foreach ( $cart->get_cart() as $cart_item => $values) {
        if( has_term( 'xxxx', 'product_cat', $values['product_id'] ) ){
	$total += $values['quantity'];
        }
    }
    if ($total >= 2) {
	$count = $total - 1;
	$discount_amount = (($count * 1000) * -1);
	$woocommerce->cart->add_fee('XXXX割引', $discount_amount);
    } 
}

とした。