2026年5月27日

2026年5月27日

WooCommerceのチェックアウトエラーを解決する方法

はじめに

WooCommerceのチェックアウトページで「注文の処理中にエラーが発生しました」が表示される・クレジットカード決済がいつまでも処理中になる・カートページに戻るとセッションが切れて商品がなくなっている・チェックアウトページにアクセスすると404エラーになるといった問題は、パーマリンク設定・セッション管理・決済ゲートウェイの設定ミス・プラグイン競合が原因です。

症状・原因

  • 「注文の処理中にエラーが発生しました。再度お試しください」エラーが繰り返し表示される
  • チェックアウトページのURLが/checkout/になっているが404エラーになる
  • カートのセッションが保持されず、ページ更新のたびに空になる
  • 決済ゲートウェイのAPIキーが正しいのに「接続エラー」が表示される

解決手順

ステップ1:WooCommerceエラーを診断する

# WP-CLIでWooCommerceの状態を確認
wp wc tool run install_pages --user=admin
wp wc system_status list --format=table

# チェックアウトページの確認
wp eval "
\$checkout_id = wc_get_page_id('checkout');
echo 'Checkout page ID: ' . \$checkout_id . PHP_EOL;
echo 'Checkout URL: ' . wc_get_checkout_url() . PHP_EOL;
\$page = get_post(\$checkout_id);
echo 'Page status: ' . (\$page ? \$page->post_status : 'NOT FOUND') . PHP_EOL;
"

# WooCommerceログを確認
wp eval "
\$log_dir = WP_CONTENT_DIR . '/uploads/wc-logs/';
\$logs = glob(\$log_dir . '*.log');
if (\$logs) {
    \$latest = end(\$logs);
    echo 'Latest log: ' . basename(\$latest) . PHP_EOL;
    echo file_get_contents(\$latest, false, null, -2000) . PHP_EOL;
}
"
# パーマリンクをフラッシュ(チェックアウト404の解決)
wp rewrite flush --hard

# セッションテーブルを確認
wp eval "
global \$wpdb;
\$sessions = \$wpdb->get_var('SELECT COUNT(*) FROM ' . \$wpdb->prefix . 'woocommerce_sessions');
echo 'Active sessions: ' . \$sessions . PHP_EOL;
"

ステップ2:チェックアウトページを修復する

# WooCommerceページを再作成
wp wc tool run install_pages --user=1

# チェックアウトページのショートコードを確認・修正
wp eval "
\$checkout_id = wc_get_page_id('checkout');
\$page = get_post(\$checkout_id);
if (\$page && strpos(\$page->post_content, '[woocommerce_checkout]') === false) {
    wp_update_post([
        'ID'           => \$checkout_id,
        'post_content' => '[woocommerce_checkout]',
    ]);
    echo 'Checkout shortcode restored.' . PHP_EOL;
}
"
// functions.php: チェックアウトページを動的に確認・修正
add_action('wp_loaded', function(): void {
    if (!class_exists('WooCommerce')) {
        return;
    }

    $pages = [
        'cart'     => '[woocommerce_cart]',
        'checkout' => '[woocommerce_checkout]',
        'myaccount' => '[woocommerce_my_account]',
    ];

    foreach ($pages as $page_key => $shortcode) {
        $page_id = wc_get_page_id($page_key);
        if ($page_id < 1) {
            error_log("[WooCommerce] Missing page: {$page_key}");
        }
    }
});

ステップ3:決済エラーを解決する

// functions.php: 決済エラーのデバッグと対応

// ① 決済処理のエラーを詳細ログに記録
add_action('woocommerce_payment_complete', function(int $order_id): void {
    error_log(sprintf('[WC] Payment complete: order #%d', $order_id));
});

add_action('woocommerce_order_status_failed', function(int $order_id): void {
    $order = wc_get_order($order_id);
    if (!$order) {
        return;
    }
    error_log(sprintf('[WC] Payment failed: order #%d, gateway: %s',
        $order_id,
        $order->get_payment_method()
    ));
});

// ② IPN/Webhookのデバッグ(StripeやPayPal用)
add_action('woocommerce_api_request', function(string $api_key): void {
    error_log('[WC] API request: ' . $api_key . ' from ' . ($_SERVER['REMOTE_ADDR'] ?? 'unknown'));
});

// ③ チェックアウトフィールドのバリデーションエラーをログ
add_action('woocommerce_after_checkout_validation', function(array $data, WP_Error $errors): void {
    if ($errors->has_errors()) {
        foreach ($errors->get_error_messages() as $message) {
            error_log('[WC Checkout] Validation error: ' . $message);
        }
    }
}, 10, 2);

ステップ4:カートセッションを修復する

// functions.php: セッション管理の改善

// ① セッション問題をデバッグ
add_action('woocommerce_cart_loaded_from_session', function(WC_Cart $cart): void {
    error_log(sprintf('[WC Cart] Items: %d, Total: %s',
        $cart->get_cart_contents_count(),
        $cart->get_cart_total()
    ));
});

// ② 期限切れセッションをクリーンアップ
add_action('woocommerce_cleanup_sessions', function(): void {
    global $wpdb;
    $deleted = $wpdb->query($wpdb->prepare(
        "DELETE FROM {$wpdb->prefix}woocommerce_sessions WHERE session_expiry < %d",
        time()
    ));
    error_log(sprintf('[WC] Cleaned %d expired sessions', $deleted));
});

// ③ Stripeなど外部決済のSSL確認をバイパス(開発環境のみ)
add_filter('https_local_ssl_verify', '__return_false');  // 本番では削除すること
# 期限切れセッションを手動削除
wp eval "
global \$wpdb;
\$deleted = \$wpdb->query(
    \$wpdb->prepare(
        'DELETE FROM ' . \$wpdb->prefix . 'woocommerce_sessions WHERE session_expiry < %d',
        time()
    )
);
echo 'Deleted ' . \$deleted . ' expired sessions.' . PHP_EOL;
"

ステップ5:WooCommerceを安定化する

// functions.php: WooCommerce安定化設定

// ① チェックアウトにカスタムフィールドを追加
add_filter('woocommerce_checkout_fields', function(array $fields): array {
    $fields['billing']['billing_company']['required'] = false;
    return $fields;
});

// ② 注文完了後のカスタムアクション
add_action('woocommerce_thankyou', function(int $order_id): void {
    if (!$order_id) {
        return;
    }
    $order = wc_get_order($order_id);
    if ($order && !$order->get_meta('_custom_processed')) {
        $order->update_meta_data('_custom_processed', current_time('mysql'));
        $order->save();
        error_log(sprintf('[WC] Order #%d thank you processed', $order_id));
    }
});

// ③ 在庫チェックを注文前に実行
add_action('woocommerce_checkout_process', function(): void {
    foreach (WC()->cart->get_cart() as $cart_item) {
        $product = $cart_item['data'];
        if ($product->managing_stock() && !$product->is_in_stock()) {
            wc_add_notice(
                sprintf('「%s」は現在在庫切れです。', $product->get_name()),
                'error'
            );
        }
    }
});

注意事項

  • WooCommerceのチェックアウトページには[woocommerce_checkout]ショートコードが必要です。ページを誤って削除・編集した場合は「WooCommerce → 設定 → 詳細」からページを再設定してください
  • 決済ゲートウェイのAPIキーを本番用とテスト用で間違えないように注意してください。Stripeの場合、pk_test_で始まるキーはテスト用、pk_live_で始まるキーが本番用です
  • セッションのクリーンアップを行う際は、処理中の注文(pendingステータス)が影響を受けないよう注意してください。セッション削除前に未完了注文の確認を行うことをお勧めします

まとめ

WooCommerceチェックアウトエラーの解決は①wp wc system_status listでシステム状態確認・wc-logs/のエラーログ分析・wc_get_page_id('checkout')でページ存在確認、②wp wc tool run install_pagesでWCページ再作成・wp rewrite flush --hardでパーマリンク修復・チェックアウトショートコードの確認、③woocommerce_order_status_failedで決済失敗ログ・woocommerce_api_requestでWebhookデバッグ・バリデーションエラーの記録、④woocommerce_sessionsテーブルのクリーンアップ・woocommerce_cart_loaded_from_sessionでセッションデバッグ、⑤woocommerce_checkout_fieldsでフィールド制御・woocommerce_thankyouで注文後処理・woocommerce_checkout_processで在庫事前確認の手順で解決します。

お気軽にご相談ください

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