2026年5月21日

2026年5月21日

WooCommerceの税率・消費税計算エラーを解決する方法

はじめに

WooCommerceの消費税計算が正しくない・税込み価格が表示されない・カートと注文確認で税額が変わる問題は、税率設定の不備・価格入力方法(税込み/税抜き)の設定ミス・キャッシュが原因です。

症状・原因

  • 商品価格に消費税が加算されない・二重に加算される
  • カート画面と注文確認で合計金額が変わる
  • 税率を変更したのに古い税率が適用される
  • 特定の商品カテゴリだけ税率が違う(軽減税率)

解決手順

ステップ1:税率設定の現状を確認する

# 税率設定を確認
wp option get woocommerce_calc_taxes        # yes/no
wp option get woocommerce_prices_include_tax # yes=税込入力, no=税抜入力
wp option get woocommerce_tax_display_shop  # incl/excl
wp option get woocommerce_tax_display_cart  # incl/excl

# 登録済み税率を確認
wp eval "
global \$wpdb;
\$rates = \$wpdb->get_results(
    \"SELECT * FROM {$wpdb->prefix}woocommerce_tax_rates ORDER BY tax_rate_order\"
);
foreach (\$rates as \$rate) {
    printf('ID:%d Class:%s Rate:%s%% Name:%s Country:%s' . PHP_EOL,
        \$rate->tax_rate_id,
        \$rate->tax_rate_class ?: 'standard',
        \$rate->tax_rate,
        \$rate->tax_rate_name,
        \$rate->tax_rate_country
    );
}
"

ステップ2:税率を正しく設定する

// functions.php: 税率をプログラムで登録・管理

// ① 日本の消費税率(標準税率10%・軽減税率8%)を登録
function register_japan_tax_rates(): void {
    global $wpdb;

    // 既存の税率を確認
    $existing = $wpdb->get_var("SELECT COUNT(*) FROM {$wpdb->prefix}woocommerce_tax_rates");
    if ($existing > 0) {
        return;
    }

    // 標準税率(10%)を登録
    $wpdb->insert("{$wpdb->prefix}woocommerce_tax_rates", [
        'tax_rate_country'  => 'JP',
        'tax_rate_state'    => '',
        'tax_rate'          => '10.0000',
        'tax_rate_name'     => '消費税(標準税率)',
        'tax_rate_priority' => 1,
        'tax_rate_compound' => 0,
        'tax_rate_shipping' => 1,
        'tax_rate_order'    => 1,
        'tax_rate_class'    => '',
    ]);

    // 軽減税率(8%)用のタックスクラスを作成
    $tax_classes = WC_Tax::get_tax_classes();
    if (!in_array('reduced-rate', $tax_classes, true)) {
        WC_Tax::create_tax_class('軽減税率(8%)', 'reduced-rate');
    }

    // 軽減税率(8%)を登録
    $wpdb->insert("{$wpdb->prefix}woocommerce_tax_rates", [
        'tax_rate_country'  => 'JP',
        'tax_rate_state'    => '',
        'tax_rate'          => '8.0000',
        'tax_rate_name'     => '消費税(軽減税率)',
        'tax_rate_priority' => 1,
        'tax_rate_compound' => 0,
        'tax_rate_shipping' => 0,
        'tax_rate_order'    => 2,
        'tax_rate_class'    => 'reduced-rate',
    ]);
}
add_action('init', 'register_japan_tax_rates');

ステップ3:価格表示と税計算を正確にする

// functions.php: 税込み・税抜き価格の表示をカスタマイズ

// ① 商品価格を税込みで表示
add_filter('woocommerce_get_price_html', function(string $price, WC_Product $product): string {
    if (get_option('woocommerce_tax_display_shop') === 'excl') {
        $incl_price = wc_get_price_including_tax($product);
        $price .= sprintf(
            ' <span class="tax-note">(税込 %s)</span>',
            wc_price($incl_price)
        );
    }
    return $price;
}, 10, 2);

// ② 税込み価格を計算して取得
function get_product_price_with_tax(int $product_id): array {
    $product = wc_get_product($product_id);
    if (!$product) {
        return [];
    }

    return [
        'price_excl_tax' => wc_get_price_excluding_tax($product),
        'price_incl_tax' => wc_get_price_including_tax($product),
        'tax_amount'     => wc_get_price_including_tax($product) - wc_get_price_excluding_tax($product),
        'tax_rate'       => WC_Tax::get_rates($product->get_tax_class()),
    ];
}

// ③ カートの税額表示を調整
add_filter('woocommerce_cart_totals_order_total_html', function(string $value): string {
    if (WC()->cart->get_tax_totals()) {
        $value .= ' <small class="includes_tax">' . WC()->cart->get_tax_totals_html() . '</small>';
    }
    return $value;
});

ステップ4:軽減税率を商品カテゴリに適用する

// functions.php: 食品カテゴリに軽減税率(8%)を自動適用

// ① 商品をカートに追加した時に税クラスを設定
add_filter('woocommerce_add_cart_item_data', function(array $cart_item_data, int $product_id): array {
    if (has_term('food', 'product_cat', $product_id)) {
        $cart_item_data['tax_class'] = 'reduced-rate';
    }
    return $cart_item_data;
}, 10, 2);

// ② 商品の税クラスをカテゴリで自動設定
add_filter('woocommerce_product_get_tax_class', function(string $tax_class, WC_Product $product): string {
    if (has_term('food', 'product_cat', $product->get_id())) {
        return 'reduced-rate';
    }
    return $tax_class;
}, 10, 2);

// ③ 軽減税率商品の一覧を確認
add_action('init', function(): void {
    if (!isset($_GET['check_tax_class']) || !current_user_can('administrator')) {
        return;
    }
    $products = wc_get_products(['category' => ['food'], 'limit' => 20]);
    foreach ($products as $product) {
        printf('[Tax Debug] %s: class=%s' . PHP_EOL,
            $product->get_name(), $product->get_tax_class());
    }
});

ステップ5:税計算のキャッシュと丸め処理を調整する

# 税設定のキャッシュをクリア
wp eval "WC_Tax::get_rates.cache = [];" 2>/dev/null || true
wp transient delete --all
wp cache flush

# 税率設定を WP-CLI で直接更新
wp eval "
update_option('woocommerce_calc_taxes', 'yes');
update_option('woocommerce_prices_include_tax', 'no');  // 税抜き入力
update_option('woocommerce_tax_display_shop', 'incl');  // 店舗は税込み表示
update_option('woocommerce_tax_display_cart', 'incl');  // カートも税込み表示
update_option('woocommerce_tax_round_at_subtotal', 'yes'); // 小計で丸め
echo '税設定を更新しました';
"
// functions.php: 税計算の丸め処理をカスタマイズ
add_filter('woocommerce_tax_round_at_subtotal', '__return_true'); // 小計で丸め(デフォルト)

// 税額の端数を切り捨て(独自ルールの場合)
add_filter('wc_tax_rounding_mode', function(): string {
    return 'floor'; // 'round'(四捨五入)/ 'ceil'(切り上げ)/ 'floor'(切り捨て)
});

// 注文確認ページの税表示をカスタマイズ
add_filter('woocommerce_order_tax_totals', function(array $tax_totals, WC_Order $order): array {
    foreach ($tax_totals as $code => $tax) {
        if (str_contains($code, 'reduced')) {
            $tax_totals[$code]->label = '消費税(軽減税率8%)';
        } else {
            $tax_totals[$code]->label = '消費税(標準税率10%)';
        }
    }
    return $tax_totals;
}, 10, 2);

注意事項

  • WooCommerceの価格入力方法(税込み入力か税抜き入力か)は「WooCommerce → 設定 → 税金 → 価格の入力方法」で決まります。途中で変更すると全商品の価格表示が変わるため、サイト開設時に決定してください
  • 軽減税率対象商品には必ず商品編集画面の「税金クラス」で「軽減税率」を設定してください。フィルターで自動設定する場合はキャッシュが残ることがあるため、設定後にキャッシュをクリアしてください
  • インボイス制度対応として、適格請求書発行事業者登録番号(T+13桁)をメールテンプレートや注文書に表示する必要があります。WooCommerce Germanizedなどのプラグインを活用してください

まとめ

WooCommerce税計算エラーの解決は①woocommerce_calc_taxeswoocommerce_prices_include_taxオプションで現在の設定を確認、②woocommerce_tax_ratesテーブルに標準税率10%と軽減税率8%を登録、③woocommerce_get_price_htmlフィルターとwc_get_price_including_tax()で税込み価格を正確に表示、④woocommerce_product_get_tax_classフィルターで食品カテゴリに軽減税率を自動適用、⑤wc_tax_rounding_modeフィルターで端数処理ルールを設定しキャッシュをクリアします。

お気軽にご相談ください

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