「カートへの追加に失敗しました」は通信失敗のサイン、在庫や商品設定ではない
この警告が出るのは、追加ボタンのAjax通信がfail()の経路に入ったときです。在庫切れが原因ではありませんが、非公開商品など一部の商品ステータスは404を通じてこの警告を出すことがあります。在庫や規格の不足なら、サーバーは正常なJSONを返し、画面中央のモーダルにメッセージを表示します。alertに「カートへの追加に失敗しました」と出るのは、リクエストがエラーステータスを返した場合、そもそもサーバーに届かなかった場合、あるいはAjaxが dataType:’json’ を指定しているためHTTP 200でもレスポンスが不正なJSON(PHPの警告出力やカスタマイズによる非JSON応答など)だった場合です(2026年7月時点、EC-CUBE 4系)。
}).fail(function(data) {
alert('{{ 'front.product.add_cart_error'|trans }}');
})
このとおり、メッセージは通信失敗の経路(fail)でしか出ません。在庫を疑うのは後回しでかまいません。
最初に見るのはブラウザのNetworkタブに出るステータスコード
まずは費用ゼロの確認から。開発者ツールのNetworkタブを開いたまま追加ボタンを押し、product_add_cart のリクエストを探してステータスコードを見ます。
- 404 → アプリはリクエストを受け取り、意図的に失敗を返している。次章へ。
- 500 → アプリ内部エラー。var配下のアプリログにスタックトレースが残る。
- ステータスが出ない・タイムアウト → リクエストがアプリまで届いていない。アプリログには何も残らないので、Webサーバーやプロキシのログを確認する。
404が返る原因を切り分けて直す:再ログインから確認する
404なら、サーバーが addCart の処理内で NotFoundHttpException を投げています。原因は大きく二つ。手を動かすコストの低い順に試します。
セッション切れ・CSRFトークン期限切れでフォーム検証が通らないケース
長時間開いたままのページから追加すると起きやすい症状です。まずページを再読み込みし、会員なら再ログインしてからもう一度追加してください。これで直れば原因はこれです。
if (!$form->isValid()) {
throw new NotFoundHttpException();
}
Symfonyのフォーム検証にはCSRFトークンの照合が含まれます。セッションが切れるとトークンが一致せず isValid() が false になり、この一行が404を返します。在庫でもログイン状態でもなく、単なるトークンの期限切れが引き金です。これはページを長時間開いたままにした購入客側で起きる仕組み上避けられない事象であり、不具合ではありません。発生しても再読み込みで復帰できるので、問い合わせにはそう案内すれば十分です。
非公開商品化やカスタマイズがフォーム検証を壊しているケース
再読み込みでも直らないなら、可能性は二つ。一つは閲覧中に商品が非公開へ切り替わったケースで、checkVisibility が公開ステータス以外を弾き、同じ404になります。管理画面で公開状態を確認してください。
もう一つはカスタマイズ起因です。数量や規格の未選択は通常テンプレート側で送信前に止まり、サーバーには届きません。この送信前チェックを独自改修で外していると、不正値がそのまま届いて isValid() が落ちます。
切り分けの決め手はアプリログです。検証を通過した直後に「カート追加処理開始」というログが記録されます。この行が無ければ、フォーム検証か、可視性チェック(商品が非公開・削除済み)のどちらかで弾かれた証拠。あれば検証は通過済みで、404の原因はイベント購読の独自レスポンスなど別の箇所を疑います。
EC-CUBEに関するお問い合わせ
[重要]現在公式にセキュリティサポートが切れていないPHPは8.1以上、MySQLは8.0以上で、対応しているEC-CUBEバージョンは4.2以上です。古いEC-CUBEを使っている方は適切なタイミングでバージョンアップをご検討ください。
EC-CUBEゴールドパートナー