EC-CUBEで「販売種別が異なるためカートが分かれます」という表示が出て戸惑った、複数の販売種別の商品を一度に決済させたい、というご相談は多いです。この記事では販売種別の仕様と、同時決済を可能にするカスタマイズをご紹介します。
販売種別とは — 購入フローを商品ごとに分ける仕組み
販売種別(SaleType)は商品(商品規格)ごとに設定する区分で、配送方法や決済のフローを商品のタイプごとに分けるためにあります。通常商品とダウンロード商品、通常配送とメーカー直送、といった分け方が典型です。
EC-CUBEでは配送方法を販売種別ごとに設定する仕組みになっており、これがEC-CUBEの受注・配送まわりの基本構造です。販売種別はマスタデータとして管理されており、管理画面のマスタデータ管理(mtb_sale_type)から追加できます。
販売種別が異なるとカートが分かれる(標準仕様)
販売種別が異なる商品はカートが分かれるようになっており、同時に決済ができないようになっています。

これは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ではなく独自クラスが適用されるようにカスタマイズします。
src配下を直接修正する方法と違ってバージョンアップ時に上書きされない利点がありますが、サービスコンテナの設定が必要で難易度が上がります。興味がある方は個別にご相談ください。
EC-CUBEに関するお問い合わせ
[重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。