2026年6月16日
2026年6月16日
WooCommerceのクーポンが使えない原因と対処法:エラー表示別の確認手順
WooCommerceでクーポンを入力すると「無効です」「期限切れです」などと表示されて割引されない場合、多くはクーポンに付けた条件のどれかに引っかかっています。WooCommerceはクーポンを適用するとき、決まった順番で条件を確認し、最初に当てはまらなかった条件のメッセージを表示します。この記事では、その仕組みと、表示されたメッセージから設定を直す手順を説明します。
画面の項目名は、WooCommerceのバージョンや日本語訳によって表記が異なることがあります。この記事では、英語の項目名を併記しています(2026年10月時点)。
最初に確認する2つのこと
クーポン機能が有効になっているか
「WooCommerce」→「設定」→「一般」に、クーポンコードの使用を有効にするチェックボックス(英語表記は「Enable the use of coupon codes」)があります。ここが外れていると、カートや決済画面にクーポンの入力欄が表示されません。WP-CLIでは次のように確認できます。
wp option get woocommerce_enable_coupons
# yes なら有効、no なら無効
クーポンが「公開」になっているか
WooCommerceは、クーポンコードから該当するクーポンを探すとき、公開状態のものだけを対象にします。下書き、予約投稿、ゴミ箱に入ったクーポンは「存在しない」扱いになります。「マーケティング」→「クーポン」の一覧で、状態を確認してください。コードの大文字・小文字は区別されないため、SAVE10 と save10 は同じクーポンとして扱われます。
WooCommerceがクーポンを確認する順番
クーポンを適用するとき、WooCommerceは次の順に条件を確認します(WooCommerceのソースコード WC_Discounts::is_coupon_valid() による)。
- クーポンが存在するか
- 全体の使用回数の上限に達していないか
- ユーザーごとの使用回数の上限に達していないか(ログイン中など、顧客が分かる場合)
- 有効期限が過ぎていないか
- 最低利用金額に届いているか
- 最高利用金額を超えていないか
- 対象商品が含まれているか
- 対象カテゴリーの商品が含まれているか
- 除外した商品・セール商品だけになっていないか
- 割引の対象になる商品がカートにあるか
- 利用できるメールアドレスに一致するか
- テーマやプラグインが追加した独自の条件(
woocommerce_coupon_is_validフィルター)
最初に失敗した条件のメッセージが表示されるので、メッセージから確認すべき設定が分かります。
表示されるメッセージと確認する設定
英語の原文と、確認する設定の対応は次のとおりです。日本語の表示は翻訳によって多少異なります。
| 英語の原文(WooCommerce) | 原因 | 確認する設定 |
|---|---|---|
| Coupon "…" cannot be applied because it does not exist. | コードが見つからない | コードの綴り、公開状態 |
| Usage limit for coupon "…" has been reached. | 使用回数の上限に達した | 「Usage limits」の「Usage limit per coupon」「Usage limit per user」 |
| Coupon "…" has expired. | 有効期限を過ぎた | 「General」の「Coupon expiry date」 |
| The minimum spend for coupon "…" is … | 最低利用金額に届かない | 「Usage restriction」の「Minimum spend」 |
| The maximum spend for coupon "…" is … | 最高利用金額を超えた | 「Usage restriction」の「Maximum spend」 |
| Sorry, coupon "…" is not applicable to your cart contents. | 対象の商品・カテゴリーがカートにない | 「Products」「Product categories」と除外の設定 |
| Sorry, coupon "…" is not valid for sale items. | セール商品が除外されている | 「Exclude sale items」 |
| Please enter a valid email at checkout to use coupon code "…" | 請求先メールが利用できるメールアドレスに一致しない | 「Allowed emails」 |
| Coupon "…" cannot be applied because it is not valid. | 独自の条件で弾かれた | woocommerce_coupon_is_valid を使うテーマ・プラグイン |
クーポンの編集画面は「マーケティング」→「クーポン」から開きます。設定は「General」(一般)、「Usage restriction」(使用制限)、「Usage limits」(使用回数の制限)の3つのタブに分かれています。
条件ごとの注意点
有効期限
WooCommerceの公式ドキュメントでは、有効期限に設定した日には、そのクーポンは使えないと説明されています。「10月31日まで使える」クーポンにしたい場合は、翌日の11月1日を有効期限に設定します。日付はサイトのタイムゾーンで解釈されるので、「設定」→「一般」のタイムゾーンが正しいかも確認してください。
最低利用金額・最高利用金額
金額の判定には、カートに表示されている小計が使われます。公式ドキュメントでは、価格を税込みで表示している場合は税込みの小計で判定すると説明されています。送料は小計に含まれません。「5,000円以上で使える」と案内しているのに使えない場合は、税込み・税抜きの表示設定と、案内している金額の基準が合っているかを確認します。
対象商品・セール商品の除外
「Products」や「Product categories」を指定すると、該当する商品がカートにないとクーポンを使えません。逆に「Exclude products」「Exclude categories」「Exclude sale items」で除外した商品だけのカートでも使えません。セール商品を除外していても、カートに通常価格の商品があれば、その商品にだけ割引が適用される場合があります(固定額のカート割引など)。
使用回数の制限とゲスト購入
「Usage limit per user」は顧客ごとの上限です。ログインしている顧客はユーザーIDで、ゲストは請求先のメールアドレスで回数を数えます。ゲストの場合、メールアドレスが分かるのは決済画面で入力したときなので、カートでは適用されたクーポンが、決済時に外されることがあります。
利用できるメールアドレス
「Allowed emails」は、顧客の請求先メールアドレスと照合されます。*@example.com のようにワイルドカードも使えます。カートの段階では請求先メールが未入力のことがあるため、決済画面でメールアドレスを入力した後にクーポンが外され、メールアドレスの入力を求めるメッセージが表示されることがあります。
他のクーポンとの併用
「Individual use only」にチェックがあるクーポンは、他のクーポンと併用できません。併用できないと案内されたときは、先に適用しているクーポンを外してから試します。
設定は正しいのに使えないとき
ページキャッシュがカート・決済画面を保存している
キャッシュプラグインやサーバーのページキャッシュが、カート、決済、マイアカウントのページまで保存していると、クーポンの適用結果が反映されなかったり、古い表示が残ったりします。これらのページはキャッシュの対象から外してください。設定方法はキャッシュプラグインやサーバー会社のマニュアルで確認します。
独自の条件が追加されている
メッセージが「cannot be applied because it is not valid」の場合は、テーマやプラグインが woocommerce_coupon_is_valid フィルターで独自の条件を加えている可能性があります。会員向けクーポンや紹介プログラムなどのプラグインを一時的に停止して、状況が変わるかを確かめます。本番サイトではなく、ステージング環境で試すのが安全です。
WP-CLIでクーポンの設定を一覧する
管理画面のタブを行き来せずに設定をまとめて確認したい場合は、次のPHPファイルを作り、wp eval-file で実行します。SUMMER10 は調べたいクーポンコードに置き換えます。
<?php
// check-coupon.php: wp eval-file check-coupon.php SUMMER10
$code = $args[0] ?? '';
$coupon = new WC_Coupon( $code );
if ( ! $coupon->get_id() ) {
WP_CLI::error( 'クーポンが見つかりません(コードの綴りと公開状態を確認)。' );
}
$expires = $coupon->get_date_expires();
$info = array(
'status' => get_post_status( $coupon->get_id() ),
'discount_type' => $coupon->get_discount_type(),
'amount' => $coupon->get_amount(),
'date_expires' => $expires ? $expires->date_i18n( 'Y-m-d H:i' ) : '(なし)',
'usage_count' => $coupon->get_usage_count(),
'usage_limit' => $coupon->get_usage_limit(),
'usage_limit_per_user' => $coupon->get_usage_limit_per_user(),
'minimum_amount' => $coupon->get_minimum_amount(),
'maximum_amount' => $coupon->get_maximum_amount(),
'individual_use' => $coupon->get_individual_use() ? 'yes' : 'no',
'exclude_sale_items' => $coupon->get_exclude_sale_items() ? 'yes' : 'no',
'product_ids' => implode( ',', $coupon->get_product_ids() ),
'email_restrictions' => implode( ',', $coupon->get_email_restrictions() ),
);
foreach ( $info as $key => $value ) {
WP_CLI::log( sprintf( '%-22s %s', $key, $value ) );
}
wp eval-file check-coupon.php SUMMER10
usage_limit が 0 の場合は、上限なしを意味します。
失敗した理由をログに残す
顧客から「使えなかった」と問い合わせがあっても、表示されたメッセージが分からないことがあります。woocommerce_coupon_error フィルターを使うと、表示されたエラーをWooCommerceのログに記録できます。このフィルターの3つ目の引数は、場合によって null になるため、型を WC_Coupon に限定しない書き方にします。
<?php
// テーマの functions.php、またはコードスニペット系プラグインに追加
add_filter(
'woocommerce_coupon_error',
function ( $err, $err_code, $coupon ) {
$code = ( $coupon instanceof WC_Coupon ) ? $coupon->get_code() : '';
wc_get_logger()->info(
sprintf( 'coupon=%s code=%s message=%s', $code, $err_code, wp_strip_all_tags( $err ) ),
array( 'source' => 'coupon-debug' )
);
return $err; // 表示するメッセージは変えない
},
10,
3
);
記録は「WooCommerce」→「ステータス」→「ログ」で、coupon-debug を選ぶと確認できます。調査が終わったら、このコードは削除してください。
独自の条件を追加する場合の書き方
「ログインした会員だけが使えるクーポン」のように、標準の設定にない条件を加えたい場合は woocommerce_coupon_is_valid フィルターを使います。このフィルターには、判定結果、クーポン、WC_Discounts の3つが渡されます。false を返すと汎用のメッセージになり、Exception を投げると、そのメッセージが顧客に表示されます。
<?php
// 例: コード members10 のクーポンは、ログイン中のときだけ使えるようにする
add_filter(
'woocommerce_coupon_is_valid',
function ( $valid, $coupon, $discounts ) {
if ( ! $valid ) {
return $valid;
}
if ( 'members10' === wc_strtolower( $coupon->get_code() ) && ! is_user_logged_in() ) {
throw new Exception( 'このクーポンはログインしてからご利用ください。' );
}
return $valid;
},
10,
3
);
クーポンコードは大文字・小文字を区別しないため、例では wc_strtolower() で小文字にそろえてから比較しています。条件を加えたら、使える場合と使えない場合の両方のカートで動作を確かめます。
まとめ
- まずクーポン機能の有効化と、クーポンが公開状態かを確認する
- WooCommerceは決まった順番で条件を確認し、最初に失敗した条件のメッセージを表示する。メッセージから確認する設定が分かる
- 有効期限に設定した日には使えない。最低利用金額は表示中の小計(税込み表示なら税込み)で判定される
- ゲストの使用回数とメールアドレスの制限は請求先メールで判定されるため、決済画面で外れることがある
- 設定が正しいのに使えないときは、カート・決済ページのキャッシュと、独自の条件を加えるプラグインを疑う