EC-CUBE で B2B
構築を相談する

プラグイン一覧 / 予約・先行受注

予約・先行受注プラグイン

発売前の商品を先に受け付けます。発売日を過ぎたら自動で通常販売に戻るので、切り替えの取りこぼしが起きません。

単体で動きます。他のプラグインは要りません。

何のためのプラグインか

アパレルの展示会受注と、雑貨・インテリアの予約は同じ形です。どちらも発売日で 自動的に通常販売へ切り替わることが要になります。

切り替えを人がやると必ず取りこぼします。発売日を過ぎても予約のまま売れ続けると、 届くはずの日に届きません。

予約受付中の商品

主な機能

機能 内容
予約販売 商品ごとに発売日を決めます
受付開始日 「まもなく受付開始」を出します。空欄ならすぐ受け付けます
受付数の上限 「先に100本だけ」。在庫とは別に決められます
自動の切り替え 発売日を過ぎたら通常販売に戻ります
ボタンの文言 「カートに入れる」ではなく「この商品を予約する」
受付前は受けない どの入口からも(商品一覧・まとめて入力・直接の POST)カートに入りません

画面は1枚も増えません。 商品登録の画面に欄が加わり、フロントは本体の商品詳細に 差し込まれます。

商品登録の予約設定

出す場所を変える

予約の案内は、既定では商品ページに自動で出ます。設定は要りません。

場所を決めたいときは、テーマのテンプレート (app/template/<テーマ>/Product/detail.twig)に書いてください。

{{ plg_preorder() }}

置いた場所にそのまま出て、書いたら自動表示は降ります(二重に出ません)。 テーマを触らない店はこれまでどおりです。

受け付けている期間

日付だけで見ます。 時刻まで見ると、発売日の朝に見た人と昼に見た人で表示が変わります。

いつ 見え方
受付開始日より前 「まもなくご予約受付開始」。ボタンは押せません
受付開始日〜発売日の前日 「ご予約受付中」。ボタンが「この商品を予約する」に変わります
発売日の当日以降 予約の案内は消え、通常の商品ページに戻ります

発売日が来たら何もしなくて構いません。 設定は残りますが効きません。次のシーズンに 使うときは、発売日を入れ直してください。

受付数の数え方

設定した日、または受付開始日より後の注文だけを数えます。

以前から売っていた商品を予約販売に切り替えると、過去の受注がそのまま受付数に化けて、 初日から「受付数に達しました」になります。実際にそうなりました。

注文の状態 数えるか
キャンセル 数えません。 断った予約が枠を埋めたままだと、受けられるはずの注文を断ります
処理中 数えます。 決済の途中で枠が空いて見えると、上限を超えて受けます
その他 数えます

上限を超える数量でカートに入れようとすると、残りの数を伝えて止めます。 数量は勝手に減らしません。 「10本欲しい」と言っている取引先に、黙って3本だけ 受けるのは失礼にあたります。

止めているのはカート単位の検証です。明細単位では、本体が例外を握って警告にするだけで 購入が止まりません。展示会の受注では、受けた数がそのまま生産数になります。

受付開始前は、どの入口からも止まります

商品ページではボタンを押せないようにしていますが、それはブラウザの中の話でしかありません。 商品一覧のカードや規格一括入力の表からは素通りし、 実際に受付開始前の商品がカートに入って購入手続きまで進めました。 サーバ側には どこにも止める処理がありませんでした。

いまはカートと購入手続きの両方で止めています。受付数の上限とは別の判定です。上限の 検証に混ぜると、上限を設定していない商品だけ素通りするためです。

保存のときに断ること

場合 理由
発売日が空 いつ通常販売に戻るのか決められません。ずっと予約のままになります
受付開始日が発売日以降 受け付けられる日が1日もありません

どちらも警告を出し、設定は保存しません。黙って受けません。

予約を受ける相手を絞る

商品の設定で決められるのは受付期間と受付数だけです。受付中なら非会員でも誰でも予約 できます。「展示会の先行受注は、来場した取引先の会員グループだけに受けたい」は判定を 足して書きます。

class ExhibitionGroupOnly implements PreorderPermissionInterface
{
    public function isAllowed(?Customer $Customer, Product $Product, PreorderSetting $Setting): bool
    {
        // 非会員には口を出さない(false にすると管理画面からの受注入力も止まる)
        if (null === $Customer || !method_exists($Customer, 'getGroups')) {
            return true;
        }

        foreach ($Customer->getGroups() as $Group) {
            if ('展示会2026春' === (string) $Group->getName()) {
                return true;
            }
        }

        return false;
    }
}

画面とカートは同じ判定を通ります。 対象でない相手の商品ページでは案内が 「対象のお客様に限らせていただいております」に変わってボタンが押せなくなり、 直接 POST してもカートと購入手続きで止まります。「ボタンは出るのにカートで弾かれる」は 起きません。

足した判定はすべて呼ばれ、1つでも「受けない」と答えたら受けません。 絞る方向にだけ 働くので、true を返しても受付期間や受付数の上限は緩められません。何も足していない店は 入れる前と同じで、誰でも予約できます。

いまできないこと

項目 内容
決済のタイミングを選べません 予約時にお支払いいただく前払いのみです。発売時に決済する形には対応していません
予約と通常販売を同時に受けられません 発売日で切り替わります
商品一覧・カテゴリ一覧は絞りません 相手を絞っても、予約中の商品は誰の一覧にも並びます。商品ページで案内が変わり、カートで止まる形です。一覧から消したいときは会員限定サイトや会員グループの公開範囲と併せてください
非会員と管理画面では会員が渡りません 未ログインの商品ページ、非会員の購入、管理画面の受注登録では会員が分かりません(管理画面でログインしているのは管理者です)。判定を書くときに「会員が分からない=拒否」にすると、非会員の購入も代理入力も丸ごと止まります
支払い方法・配送方法やカートの中身では絞れません 判定に受注が渡らないためです。必要なら購入フローの検証を自前で足してください
断り文句は書き分けられません 理由に関わらず同じ1つの文言です。変えたいときは翻訳を上書きしてください

動作要件

項目 内容
EC-CUBE 4.4 系
PHP 8.2 / 8.3
データベース MySQL 8 / PostgreSQL 13 以上
依存プラグイン なし

差し替えられるところ

主要な処理はインターフェースとして切ってあります。実装を差し替えれば動きが変わります。 自社の商習慣に合わない部分があれば、まず差し替えで済むかを確かめてください。

AI に書かせられます。このプラグインには CLAUDE.md と docs/extension-samples.md が 同梱されていて、差し替え口ごとにそのまま使えるサンプルが載っています。 やりたいことを日本語で伝えれば、AI コーディングツールが実装を書きます (くわしく)。

インターフェースできること
PreorderPermissionInterface予約を受ける相手を絞る(展示会に来場した取引先の会員グループだけに先行受注を受ける、など)

入手する

オーナーズストアで購入

買い切りです。月額はかかりません。予定価格 税抜 50,000 円。

予定価格です。オーナーズストアでの販売開始時に変わる場合があります。

販売ページの準備ができ次第、ここに載せます。

導入を任せる

サーバーの用意から EC-CUBE の設置、プラグインの導入と設定まで請け負います。 商習慣に合わせた作り足しもご相談ください。

この条件で回るか、確かめてから決めてください

締め日、支払サイト、請求書の様式、会計ソフトへの受け渡し。合うかどうかは商習慣によって変わります。やりたいことを書いて送ってください。