EC-CUBE4系ではSaleTypeCartAllocatorというクラスによって販売種別ごとにカートをつくるよう振り分けられています。この振り分け方法をカスタマイズしてやることで、販売種別が異なる商品を同時にカートに入れて同時に決済を行うことが可能ですのでご紹介します。
商品種別について標準の仕様
商品種別が異なる商品はカートが分かれるようになっており、同時に決済ができないようになっています。

これはCartItemAllocatorという仕組みでカートが商品種別ごとに作られるためで、CartItemAllocatorをカスタマイズすることで振り分け方を変えることが可能です。

簡単なカスタマイズ方法(src配下のファイルを修正)
src/Eccube/Service/Cart/SaleTypeCartAllocator.phpを下記のように修正します。
<?php
/*
* This file is part of EC-CUBE
*
* Copyright(c) EC-CUBE CO.,LTD. All Rights Reserved.
*
* http://www.ec-cube.co.jp/
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
namespace Eccube\Service\Cart;
use Eccube\Entity\CartItem;
/**
* 販売種別ごとにカートを振り分けるCartItemAllocator
*/
class SaleTypeCartAllocator implements CartItemAllocator
{
/**
* 商品の振り分け先となるカートの識別子を決定します。
*
* @param CartItem $Item カート商品
*
* @return string
*/
public function allocate(CartItem $Item)
{
return 1;
// 元のコードはコメントアウト
// $ProductClass = $Item->getProductClass();
// if ($ProductClass && $ProductClass->getSaleType()) {
// return (string) $ProductClass->getSaleType()->getId();
// }
// throw new \InvalidArgumentException('ProductClass/SaleType not found');
}
}
この僅かのカスタマイズで商品種別が異なる商品を同時に決済することが可能になります。
ただし、配送は商品種別ごとに分かれます。配送方法設定を見るとわかるように、販売種別ごとに配送方法を設定する仕組みはEC-CUBEの基本となっているため、同時に決済を行えるようにするとしても配送を同じにすることは諦めた方が良いです。
独自に分類項目を設けるなど、販売種別以外の方法で商品を分類する方向を検討してみてはいかがでしょうか。

配送を同じにしたいのであれば、商品種別は同じにして別の方法で商品を分類することをおすすめ致します。
難しいカスタマイズ方法(src配下のファイルを修正しない)
こちらはCustomizeディレクトリ以下にCartItemAllocatorインターフェースを実装した独自クラスを用意し、CartItemAllocatorインターフェースに対してSaleTypeCartAllocatorではなく独自クラスが適用されるようにカスタマイズします。
ここでは紹介しませんが、興味がある方は個別にご相談ください。
EC-CUBEに関するお問い合わせ
[重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。
EC-CUBEゴールドパートナー