プラグイン一覧 / 予約・先行受注
予約・先行受注プラグイン
発売前の商品を先に受け付けます。発売日を過ぎたら自動で通常販売に戻るので、切り替えの取りこぼしが起きません。
単体で動きます。他のプラグインは要りません。
何のためのプラグインか
アパレルの展示会受注と、雑貨・インテリアの予約は同じ形です。どちらも発売日で 自動的に通常販売へ切り替わることが要になります。
切り替えを人がやると必ず取りこぼします。発売日を過ぎても予約のまま売れ続けると、 届くはずの日に届きません。

主な機能
| 機能 | 内容 |
|---|---|
| 予約販売 | 商品ごとに発売日を決めます |
| 受付開始日 | 「まもなく受付開始」を出します。空欄ならすぐ受け付けます |
| 受付数の上限 | 「先に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 円。
予定価格です。オーナーズストアでの販売開始時に変わる場合があります。
この条件で回るか、確かめてから決めてください
締め日、支払サイト、請求書の様式、会計ソフトへの受け渡し。合うかどうかは商習慣によって変わります。やりたいことを書いて送ってください。