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で在庫事前確認の手順で解決します。