2026年6月16日
2026年6月16日
WooCommerceのクーポンが使えない問題を解決する方法
はじめに
WooCommerceのクーポンが「このクーポンは無効です」「クーポンの最低注文金額を満たしていません」のエラーになる・割引額が期待と違う問題は、クーポン設定の条件不備やカートキャッシュが原因です。
症状・原因
- 「このクーポンコードは無効です」エラーが出る
- クーポンを適用しても割引されない・金額が違う
- 有効期限内なのに使えない
- 特定ユーザーだけクーポンが使えない
解決手順
ステップ1:クーポンの設定状態を確認する
# クーポンが有効か確認
wp eval "
\$coupon = new WC_Coupon('SUMMER10');
printf(
'Valid: %s, Discount: %s%s, Expires: %s, Used: %d/%s' . PHP_EOL,
\$coupon->is_valid() ? 'yes' : 'no',
\$coupon->get_amount(),
\$coupon->get_discount_type() === 'percent' ? '%%' : '円',
\$coupon->get_date_expires() ? \$coupon->get_date_expires()->format('Y-m-d') : '無期限',
\$coupon->get_usage_count(),
\$coupon->get_usage_limit() ?: '無制限'
);
"
# クーポン機能が有効か確認
wp option get woocommerce_enable_coupons # yes/no
# 全クーポンを一覧表示
wp post list --post_type=shop_coupon --fields=ID,post_title,post_status
ステップ2:クーポンの有効条件を修正する
// functions.php: クーポンの有効条件をカスタマイズ
// ① クーポンの有効期限を延長(プログラムで変更)
function extend_coupon_expiry(string $coupon_code, int $days = 30): bool {
$coupon = new WC_Coupon($coupon_code);
if (!$coupon->get_id()) {
return false;
}
$new_expiry = new WC_DateTime('+' . $days . ' days');
$coupon->set_date_expires($new_expiry);
$coupon->save();
return true;
}
// ② クーポンのバリデーションをカスタマイズ
add_filter('woocommerce_coupon_is_valid', function(bool $valid, WC_Coupon $coupon): bool {
// ログインユーザーのみクーポン使用可能
if (!is_user_logged_in()) {
throw new Exception('クーポンはログインユーザーのみご利用いただけます。');
}
// 特定のユーザーロールのみ使用可能
$required_role = $coupon->get_meta('required_role');
if ($required_role) {
$user = wp_get_current_user();
if (!in_array($required_role, $user->roles, true)) {
throw new Exception(sprintf('このクーポンは%sのみご利用いただけます。', $required_role));
}
}
return $valid;
}, 10, 2);
// ③ クーポンコードの大文字小文字を無視
add_filter('woocommerce_coupon_code', 'strtolower');
ステップ3:クーポンをプログラムで作成・管理する
// functions.php: クーポンをプログラムで作成
function create_wc_coupon(array $args): int {
$defaults = [
'code' => '',
'discount_type' => 'percent', // percent / fixed_cart / fixed_product
'amount' => '10',
'date_expires' => '+30 days',
'usage_limit' => 100,
'usage_limit_per_user' => 1,
'minimum_amount' => '3000',
'maximum_amount' => '',
'individual_use' => true,
'exclude_sale_items' => false,
'product_ids' => [],
'excluded_product_ids' => [],
'product_categories' => [],
'excluded_product_categories' => [],
'email_restrictions' => [],
];
$args = wp_parse_args($args, $defaults);
$coupon = new WC_Coupon();
$coupon->set_code(strtolower($args['code']));
$coupon->set_discount_type($args['discount_type']);
$coupon->set_amount($args['amount']);
$coupon->set_date_expires(new WC_DateTime($args['date_expires']));
$coupon->set_usage_limit($args['usage_limit']);
$coupon->set_usage_limit_per_user($args['usage_limit_per_user']);
$coupon->set_minimum_amount($args['minimum_amount']);
$coupon->set_individual_use($args['individual_use']);
$coupon->set_exclude_sale_items($args['exclude_sale_items']);
$coupon->set_email_restrictions($args['email_restrictions']);
return $coupon->save();
}
// 使用例:初回購入者向け10%OFFクーポンを作成
// create_wc_coupon(['code' => 'WELCOME10', 'discount_type' => 'percent', 'amount' => '10']);
ステップ4:クーポン使用状況を追跡する
// functions.php: クーポン使用状況のログと分析
// ① クーポン使用時にログを記録
add_action('woocommerce_applied_coupon', function(string $coupon_code): void {
WC()->logger()->info(
sprintf('Coupon applied: %s by user %d (cart total: %s)',
$coupon_code,
get_current_user_id(),
WC()->cart->get_subtotal()
),
['source' => 'coupon-tracker']
);
});
// ② クーポン適用失敗を記録
add_filter('woocommerce_coupon_error', function(string $err, int $err_code, WC_Coupon $coupon): string {
error_log(sprintf('[WC Coupon Error] Code: %s, Error: %d - %s',
$coupon->get_code(), $err_code, $err));
return $err;
}, 10, 3);
// ③ クーポンの使用回数を確認・リセット
function get_coupon_usage_stats(string $coupon_code): array {
$coupon = new WC_Coupon($coupon_code);
return [
'code' => $coupon->get_code(),
'usage_count' => $coupon->get_usage_count(),
'usage_limit' => $coupon->get_usage_limit(),
'remaining' => $coupon->get_usage_limit()
? $coupon->get_usage_limit() - $coupon->get_usage_count()
: '無制限',
];
}
# クーポンの使用回数をリセット
wp eval "
\$coupon = new WC_Coupon('SUMMER10');
\$coupon->set_usage_count(0);
\$coupon->save();
echo 'Usage count reset for ' . \$coupon->get_code();
"
# 特定ユーザーのクーポン使用履歴を確認
wp eval "
global \$wpdb;
\$used = \$wpdb->get_results(\$wpdb->prepare(
\"SELECT meta_value FROM {$wpdb->usermeta}
WHERE user_id = %d AND meta_key = 'wc_last_order'\",
get_current_user_id()
));
print_r(\$used);
"
ステップ5:クーポンの自動適用を実装する
// functions.php: 条件を満たしたらクーポンを自動適用
add_action('woocommerce_before_calculate_totals', function(WC_Cart $cart): void {
if (is_admin() && !defined('DOING_AJAX')) {
return;
}
$cart_total = $cart->get_subtotal();
// 10,000円以上のカートに自動でクーポンを適用
if ($cart_total >= 10000 && !$cart->has_discount('AUTO10')) {
$cart->apply_coupon('AUTO10');
wc_add_notice('10,000円以上のご購入のため、10%OFFクーポンを自動適用しました。', 'notice');
}
// 10,000円未満になったら自動クーポンを削除
if ($cart_total < 10000 && $cart->has_discount('AUTO10')) {
$cart->remove_coupon('AUTO10');
}
});
注意事項
woocommerce_coupon_is_validフィルターで例外をスローする場合、メッセージは自動的にエラー通知として表示されます。例外をスローしないでfalseを返すだけだと汎用的なエラーメッセージが表示されます- クーポンの自動適用(
woocommerce_before_calculate_totals)は合計計算のたびに実行されます。wc_add_notice()を呼ぶ場合、同じ通知が複数表示されないようWC()->session->get()で表示済みかチェックしてください - メールアドレス制限(
email_restrictions)はチェックアウト時にのみ検証されます。カートではクーポンが適用されてもチェックアウト時に弾かれることがあります
まとめ
WooCommerceクーポンエラーの解決は①WC_Couponクラスで有効性・有効期限・使用回数を確認、②woocommerce_coupon_is_validフィルターでカスタムバリデーション(ログイン必須・ロール限定等)を実装、③WC_Couponクラスのセッターでクーポンをプログラム作成(割引タイプ・金額・制限・有効期限)、④woocommerce_applied_couponとwoocommerce_coupon_errorで使用ログを記録、⑤woocommerce_before_calculate_totalsで合計金額に応じたクーポン自動適用を実装します。