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_couponwoocommerce_coupon_errorで使用ログを記録、⑤woocommerce_before_calculate_totalsで合計金額に応じたクーポン自動適用を実装します。

お気軽にご相談ください

お見積りへ お問い合わせへ