タグアーカイブ WooCommerce

WooCommerce決済が「処理中」で止まりサンクスページに遷移しない場合の対処法

WooCommerce決済が「処理中」で止まりサンクスページに遷移しない場合の対処法

WooCommerceでRazorpay決済を利用しているサイトで、支払い自体は成功しているのにチェックアウト画面が「処理中です。しばらくお待ちください」と表示されたまま止まり、注文完了ページへ遷移しない問題は、RazorpayのJavaScript SDKが正常に読み込まれていないか、他のプラグインとの競合によってフォーム送信処理が破損している場合に起こる。

特にサンドボックスモードでは正常に動作するのに本番環境でのみ発生する場合、APIキーの設定ミスや決済スクリプトのパス解決エラーが根本原因である可能性が高い。ブラウザの開発者コンソールを開くと GET .../build/undefined 403 や document.razorpayform.submit is not a function といったエラーが記録されているはずだ。以下では原因の特定から具体的な修正手順までを順に解説する。

ブラウザコンソールでエラーの全体像を把握する

ブラウザコンソールでエラーの全体像を把握する

まず最初に行うべきは、問題が起きているページで開発者ツールを開き、コンソールタブとネットワークタブに出力されているエラーを確認することだ。Razorpayの処理フローはほぼすべてフロントエンドのJavaScriptで制御されているため、バックエンドのログだけでは見えない問題がここに集中して現れる。

Chromeの場合、決済画面で F12 を押してDevToolsを開き、以下の手順で記録を取る。

STEP 1 コンソールタブを開き、ゴミ箱アイコンでログをクリアする
↓
STEP 2 ネットワークタブを開き「プリザーブログ」にチェックを入れる
↓
STEP 3 実際に決済を実行し、処理が止まるまでの全リクエストとエラーを記録する

記録した中で特に注目すべきは以下の2種類のエラーだ。

  • GET https://checkout-static-next.razorpay.com/build/undefined 403 というリクエストが発生している場合、Razorpay SDKのビルドパスが正しく解決されていない。末尾が /undefined になっているのが最大の手がかりだ。
  • Uncaught TypeError: document.razorpayform.submit is not a function は、決済フォームの送信メソッドが何らかの理由で失われていることを示す。他のJavaScriptによって上書きされているか、Razorpayのスクリプト自体が最後まで読み込まれていない可能性が高い。

GET …/build/undefined 403 エラーが示す根本原因

GET .../build/undefined 403 エラーが示す根本原因

Razorpayのチェックアウトスクリプトは、プラグインが動的に生成するパスに基づいて checkout-static-next.razorpay.com/build/【バージョン番号】 というURLから読み込まれる。このバージョン番号が何らかの理由で空になると /build/undefined という不正なURLが生成され、当然ながら403 Forbiddenで拒否される。

この現象は主に次の3つの状況で起こる。

本番用APIキーが未設定または誤ったキーが入力されている

Razorpayプラグインの設定画面(WooCommerce → 設定 → 決済 → Razorpay)を開き「本番用キーID」と「本番用キーシークレット」の両方が 本番環境用の正しい値 になっているか確認する。サンドボックス用のキーが誤って本番フィールドに入力されていると、スクリプトパスの生成に失敗する。キーはRazorpayダッシュボードの「Settings → API Keys」から再発行できる。

プラグインのバージョンが古いか不完全に更新されている

公式の「Razorpay for WooCommerce」プラグインが最新版かどうかを確認する。過去のバージョンには、特定の条件下でSDKバージョン文字列が空になる不具合が報告されている。wp-adminのプラグイン一覧で更新があれば適用し、問題が継続する場合は一度プラグインを完全に削除してから再インストールする。削除前に必ずAPIキーをメモしておくこと。

マルチカレンシープラグインがRazorpayの設定を上書きしている

WooCommerce Currency Switcher(FOXやAeliaなど)を使用している場合、通貨切り替えの過程でRazorpayの決済スクリプトに渡すパラメータが改変されることがある。特にジオベースで通貨を自動切り替えしている環境では、チェックアウトページ読み込み時に想定外の通貨コードがRazorpayに渡され、SDKの初期化に失敗するケースが確認されている。

通貨スイッチャー側の設定で、チェックアウトページと決済完了ページを通貨切り替えの対象外にするルールを追加しても改善しない場合、以下の方法で問題の所在を明確にできる。

Before(通貨スイッチャー有効時)
Razorpayに渡される通貨コードが undefined になり、スクリプトパスが /build/undefined に
NGscript読み込み失敗 → 403
↓
After(通貨スイッチャー無効化後)
Razorpayに正しい通貨コード(INR)が渡り、スクリプトパスが /build/v3.45.0 など正常に
OKscript読み込み成功 → 決済完了
■ エラー状態 ■ 修正後

document.razorpayform.submit is not a function を解消する

document.razorpayform.submit is not a function を解消する

このTypeErrorは、決済フォームを送信するタイミングで razorpayform オブジェクトの submit メソッドが存在しないことを意味する。原因は主に2つに絞られる。

JavaScriptの最適化や結合によるメソッド破損

LiteSpeed CacheやAutoptimizeなどのキャッシュ・最適化プラグインがJavaScriptを結合(Combine)したり、圧縮(Minify)したり、遅延読み込み(Defer)したりする設定が有効だと、Razorpayのフォームオブジェクトが初期化される前に他のスクリプトが実行され、document.razorpayform が不完全な状態になる。

JavaScriptの最適化機能をすべてオフにしても改善しない場合でも、LiteSpeed Cacheにはページ単位の最適化設定や「ゲストモード」など追加の最適化機能が存在する。プラグインを完全に無効化してテストした上で、それでも直らなければキャッシュ以外の競合を疑う。

サンクスページカスタマイズプラグインによるリダイレクト干渉

「WooCommerce Thank You Page」のような注文完了ページをカスタマイズするプラグインは、通常のリダイレクトフックを上書きする。Razorpayが決済完了後に実行する razorpayform.submit() が、この上書きされたフローと衝突し、メソッド呼び出し自体が失敗するケースがある。

サンクスページプラグインを無効化してテストした結果、問題が解消するのであれば、そのプラグインが原因だ。Razorpayとの互換性をプラグイン開発者に確認するか、よりシンプルなフックベースのカスタマイズ(テーマのfunctions.phpで制御)に切り替える。

プラグインの競合を段階的に切り分ける手順

プラグインの競合を段階的に切り分ける手順

エラーのパターンから明らかな原因を特定できない場合は、標準的なトラブルシューティングの手順で競合を絞り込む。本番サイトで作業する前に、必ずステージング環境を用意するか、メンテナンスモードを有効にしてから行う。

STEP 1 Razorpay以外の全プラグインを無効化する
↓
STEP 2 標準テーマ(Twenty Twenty-Fourなど)に切り替える
↓
STEP 3 本番APIキーでテスト決済を実行し、正常に動作するか確認する
↓
STEP 4 プラグインを1つずつ有効化し、どのタイミングで問題が再発するか特定する

STEP 4では、まず通貨スイッチャーとキャッシュ系プラグインを最初に有効化してテストする。この2つが最も競合を起こしやすい。次にPixelYourSiteなどの外部スクリプトを注入するプラグインをテストし、最後にサンクスページプラグインを検証する。

RazorpayのWebhook設定も再確認する

フロントエンドのJavaScriptエラーに加えて、バックエンドのWebhookが正しく設定されていないと、決済完了後に注文ステータスが更新されない。Razorpayダッシュボードの「Settings → Webhooks」で以下を確認する。

  • Webhook URLが https://あなたのサイトURL/wc-api/razorpay_webhook/ になっている。
  • イベントに payment.authorized と refund.created が最低限含まれている。
  • WebhookシークレットがWooCommerce側のRazorpay設定に入力した値と完全に一致している。
  • 重複したWebhook登録がない(過去のテストで作成した古いWebhookが残っていると競合する)。

よくある質問

サンドボックスでは正常なのに本番だけで止まるのはなぜですか?

本番用のAPIキー設定ミスか、本番環境専用のプラグイン(セキュリティや最適化)がRazorpayのスクリプトに干渉している可能性が高い。サンドボックスと本番で異なるキーを使っていることを再確認し、本番環境にのみ有効なプラグインを一時停止して切り分ける。

Razorpay以外の決済ゲートウェイでも同じ現象は起こりますか?

StripeやPayPalなど他の決済プラグインでも、JavaScriptの競合やリダイレクトフックの干渉によって同様の「処理中」ループが発生することがある。原因の切り分け手順はほぼ共通しているため、本記事のSTEPを他のゲートウェイにも応用できる。

コンソールにエラーが出ていないのに処理が止まる場合は?

PHPのメモリ不足や実行時間制限が原因で、決済完了後のサーバーサイド処理が途中で止まっている可能性がある。WooCommerceのステータスレポートでPHPのメモリ制限が256MB以上、最大実行時間が300秒以上あるか確認する。サーバーのエラーログも併せて調査する。

Razorpayプラグインを最新にしても直らない場合は?

プラグインの公式GitHubリポジトリで同様のIssueが報告されていないか確認する。解決策としてパッチが提供されていることもある。また、Razorpayのカスタマーサポートに本番環境のドメインとエラーの詳細を伝えて調査を依頼する方法も有効だ。APIキーの発行元アカウントに制限がかかっていないかも合わせて確認してもらえる。

PixelYourSiteを無効化せずに共存させる方法はありますか?

PixelYourSiteの設定で「チェックアウトページでのスクリプト実行を遅延させる」オプションをオフにするか、カスタムコードでRazorpayのスクリプトがPixelYourSiteより先に読み込まれるよう wp_enqueue_scripts の優先度を調整する。functions.phpに以下のようなコードを追加する方法もある。

add_action('wp_enqueue_scripts', function() {
    if (is_checkout()) {
        wp_dequeue_script('pys');
        wp_enqueue_script('pys', 'path/to/pys.js', array('razorpay'), null, true);
    }
}, 100);

このコードはあくまで概念を示すもので、実際のハンドル名やパスはプラグインのソースを確認して書き換える必要がある。

この記事のポイント

  • ブラウザコンソールで /build/undefined 403エラーや razorpayform.submit TypeErrorを確認する
  • 本番用APIキーが正しく入力されているか、Razorpayダッシュボードで再確認する
  • 通貨スイッチャーがチェックアウトページで干渉していないか検証する
  • JavaScript最適化プラグインを完全無効化し、サンクスページカスタマイズプラグインを停止してテストする
  • 全プラグイン無効化と標準テーマ切り替えで競合を段階的に切り分ける
WooCommerceクーポン自動適用、209行のコードで約1万3000行を削減

WooCommerceクーポン自動適用、209行のコードで約1万3000行を削減

WooCommerce.comは、BFCM(ブラックフライデー・サイバーマンデー)2025に向けてクーポン自動適用の仕組みを内製化し、それまで使っていたサードパーティ製プラグインを廃止した。削除したコードは実に約12,888行、新たに書いたコードはわずか209行である。WooCommerceコアのクーポン機能をそのまま活かし、再発明を避けることで、大幅なコード削減と安定性の向上を両立させた。

WooCommerce Developer Blogの記事で、開発者のRonny Shani氏がこのプロジェクトの全貌を公開した。BFCM本番では数万人規模の顧客に利用され、クーポン起因のバグはゼロだったという。返品率の低減や顧客単価の上昇といった副次効果も確認されており、少ないコードがもたらすビジネスインパクトを示す好例だ。

従来のサードパーティ製プラグイン
プラグイン 段階的割引ロジックを独自実装
プラグイン 使用制限・有効期限などを自前で再実装
プラグイン 通貨対応も独自処理
12,888行 削除対象となったコード量
↓
内製化された自動適用プラグイン
小プラグイン 「自動適用」チェックボックスのみ追加
WooCommerceコア is_valid()で既存の検証ロジックを活用
WooCommerceコア 複数通貨対応も標準機能で動作
209行 新たに書いたコード量
■ 削除(サードパーティ)  ■ 追加(内製化)  ■ 自動発動の指示役  ■ 検証・実行を担うWooCommerce本体

このデモでは、従来の肥大化したアプローチと内製化後のシンプルな構造を対比している。「何でも自前でやろうとする」と「コアの力を借りて指示役に徹する」の差がコード量に直結している点を視覚化した。以下、具体的な実装と成果を見ていく。

少数のコードでクーポンを自動適用する仕組み

この内製プラグインの考え方は極めて明快だ。WooCommerceがもともと持っているクーポンの検証機能(WC_Couponクラスによる使用回数制限・商品制限・有効期限チェックなど)を一切再実装せず、「いつ」「どのクーポンを」「どう適用するか」という判断部分だけを追加する。WooCommerce Developer Blogの著者Ronny Shani氏は「再発明はしない」という原則を掲げ、徹底的にコアに委ねた設計を選んだ。

このアプローチは、WordPressやWooCommerceのエコシステム全般に当てはまる教訓でもある。機能拡張が必要なとき、つい「全部入り」のプラグインを導入したり、独自のロジックを上から書いたりしがちだが、コアがすでに提供している仕組みの上に薄い層を重ねるだけで要件を満たせるケースは少なくない。コードが少なければバグの入り込む余地も減り、保守負荷も下がる。

チェックボックスひとつで制御する設計

管理画面のクーポン編集画面には「Apply coupon automatically(クーポンを自動適用する)」というチェックボックスが追加される。ここにチェックを入れると、該当クーポンの投稿メタ _auto_apply に yes が保存される。判定ロジックはこのメタ値を見るだけであり、新たなデータベーステーブルや複雑な設定画面は一切作っていない。

カートが再計算されるタイミングで、プラグインは _auto_apply = yes のクーポン一覧を取得する。この一覧は12時間キャッシュされるため、WooCommerce.comのような高トラフィックサイトでもパフォーマンス上の問題は起きない。取得後は各クーポンに対して WC_Coupon::is_valid() を呼び出し、条件を満たしていれば静かに適用、満たさなくなったら静かに削除する。顧客に余計な通知を見せることもない。

再帰防止とWooCommerce.com固有の対応

実装上の唯一の「厄介なポイント」として、Shani氏は再入(re-entrancy)ガードを挙げている。クーポンを適用する処理自体が woocommerce_after_calculate_totals フックを再度発火させるため、何も対策しないと無限ループに陥る。これを防ぐために static $running フラグを導入し、処理中は再実行をブロックしている。このデバッグは、Shani氏の言葉を借りれば「なかなか楽しめた」類の不具合だったようだ。

また、WooCommerce.comの要件として、BFCMクーポンがサブスクリプション更新や特定の決済フローに適用されないようにする制御も追加されている。こうしたドメイン固有の制約はGitHub上のプルリクエストには含まれていないが、各自のストアで同様の仕組みを実装する際の参考になる。

STEP 1 カート再計算イベント発生
買い物客が商品を追加・数量変更を行うと woocommerce_after_calculate_totals が発火する
↓
STEP 2 自動適用クーポンの取得
_auto_apply = yes のクーポンコード一覧をキャッシュから取得(12時間キャッシュ)
↓
STEP 3 各有効性チェック
WC_Coupon::is_valid() で使用制限・有効期限・商品制限をまとめて検証。コアが処理するため再実装不要
↓
STEP 4 自動適用または自動削除
有効なら適用・無効なら削除。いずれも顧客に通知なし。static $running フラグで再帰を防止
■ トリガー  ■ 取得  ■ 検証  ■ 適用・削除

上図の流れがカート再計算のたびに実行される。重要なのは、STEP 3の検証部分が完全にWooCommerceコア任せであることだ。プラグイン開発者は「どのクーポンが自動適用対象か」というメタ管理と、「適用・削除のタイミング制御」の2点だけをコード化すればよい。

BFCM 2025本番でのパフォーマンス

BFCM 2025本番でのパフォーマンス

このプラグインが初めて本格稼働したのはBFCM 2025(2025年11月19日〜12月2日)だった。結果は上々で、数万件の完了注文、数万人のユニーク顧客が3段階の割引(20%・30%・40%)を利用し、クーポン起因のバグやシステム停止は一度も発生しなかった。

WooCommerceコアのクーポン機能に乗ったことで、複数通貨対応も標準機能のまま問題なく動作した。多くのマルチカレンシーストアにとって、これは見逃せない恩恵だ。独自実装では通貨ごとの計算ロジックを自前で保守しなければならないが、コア任せならその負荷から解放される。

返品率低下と顧客単価上昇という副産物

数字にもはっきりとした改善が表れた。同記事の報告によれば、返品率は13.1%から7.8%へと約5.3ポイント低下し、顧客あたりの純現金収入は前年比25%増加した。クーポン適用の仕組みそのものが返品率に直接作用したとは考えにくいが、安定した割引適用がスムーズな購買体験につながり、結果的にポジティブな指標改善を後押しした可能性が高い。

SQLでクーポン効果を可視化する方法

同様の分析を自社ストアで行いたい場合、記事では以下のようなSQLクエリが紹介されている。クーポンコードごとに利用注文数とユニーク顧客数を集計するもので、プロモーションの効果測定に使える。

SELECT
    oi.order_item_name                  AS coupon_code,
    COUNT(DISTINCT oi.order_id)         AS orders_with_coupon,
    COUNT(DISTINCT o.customer_id)       AS unique_customers
FROM wp_woocommerce_order_items oi
JOIN wp_wc_orders o ON oi.order_id = o.id
WHERE oi.order_item_type = 'coupon'
  AND oi.order_item_name IN ('sale-20%', 'sale-30%', 'sale-40%')
  AND o.date_created_gmt BETWEEN '2025-11-19 14:00:00' AND '2025-12-02 23:59:59'
  AND o.status IN ('wc-completed', 'wc-processing')
GROUP BY oi.order_item_name
ORDER BY orders_with_coupon DESC;

クーポン名と日付範囲を自社のキャンペーンに合わせて変更すれば、同じ集計が簡単に得られる。データベースへの直接クエリになるため、実行前には必ずバックアップを取得しておきたい。

WooCommerceコアへのフィードバックと今後の展開

WooCommerceコアへのフィードバックと今後の展開

Shani氏はこの仕組みをWooCommerceのコアに取り込むためのプルリクエストをGitHub上で公開している。WooCommerce.com固有の制約は外されているが、_auto_applyメタによる自動適用のコア機能は「WooCommerceがネイティブでサポートすべき」と判断され、将来のリリースに含まれる見込みだ。

現時点でも、このプルリクエストを参考に自前のミニプラグインを構築することは十分可能である。コード量が少ないため、中級者以上のPHP開発者であれば半日もかからずに実装できるだろう。

今後に残る課題

完璧ではない部分もある。ひとつはクーポンのHPOS(High-Performance Order Storage)移行対応だ。_auto_applyメタは現在 wp_postmeta テーブルに保存されているが、注文データがHPOSに移行するタイミングでクエリの見直しが必要になる。Shani氏もこの点を「再検討が必要」として明記している。

もうひとつは、ブロックカート上でクーポン削除ボタンを非表示にするJavaScriptの実装だ。特定のブロックCSSクラス名に依存しているため、WooCommerceのバージョンアップでクラス名が変わると動作しなくなる可能性がある。本格的に汎用化するなら、より堅牢なセレクタ戦略が求められる。

また、BFCM用のクーポン名がハードコードされている点も、汎用プラグインとして配布するには改善の余地がある。現状はフィルターフックで上書きできる設計にはなっているが、管理画面から設定できるようにするほうがより実用的だろう。

「コードを書かない」判断がもたらす安定性

「コードを書かない」判断がもたらす安定性

この事例が示しているのは、技術的な巧みさよりも「何を書かないか」の判断の重要さである。WooCommerceのクーポンシステムは、利用制限、有効期限、商品カテゴリ制限、使用回数制限、複数通貨対応など、すでに十分すぎるほどの検証ロジックを備えている。それらを再実装するかわりに「適用するタイミング」だけをコード化したことで、バグの総量は劇的に減り、保守コストも最小化された。

実際の数字もこの判断の正しさを裏付けている。12,888行を削除して209行に置き換え、BFCM本番でバグゼロ。返品率は13.1%から7.8%に低下し、顧客単価は25%向上した。コードを減らすことはリスクを減らすことであり、それがそのままビジネス指標の改善に直結した好例といえる。

やりがちなアプローチ(Bad)
プラグイン 割引計算 → プラグイン 有効期限チェック → プラグイン 通貨換算
すべて自前で実装するためコードが膨張し、バグの温床になる
↓
コア活用アプローチ(Good)
小プラグイン 自動適用フラグ管理 → WooCommerce is_valid()で全検証
209行で完結。検証ロジックの再実装は一切なし
■ 肥大化・自前実装  ■ スリム・コア活用  ■ 制御役  ■ エンジン役(コア)

この対比はWooCommerceに限らず、あらゆるシステム開発に通じる原則だ。既存の仕組みを活かし、本当に必要な差分だけをコード化する。その結果が「12,888行削除して209行追加」という数字であり、BFCM本番でのバグゼロ運用という実績である。

この記事のポイント

  • WooCommerce.comはBFCM 2025に向けてクーポン自動適用を内製化し、12,888行のサードパーティコードを209行のミニプラグインで置き換えた
  • コアの WC_Coupon::is_valid() を活用し、検証ロジックの再実装を徹底的に避ける設計が功を奏した
  • BFCM本番では数万件の注文を処理し、クーポン起因のバグはゼロ。返品率は5.3ポイント低下、顧客単価は25%向上した
  • 将来のWooCommerceコアリリースで _auto_apply メタによる自動適用がネイティブサポートされる見込み。現時点でもGitHub上のPRを参考に自前実装が可能
  • 既存の仕組みを活かして「書かない」判断を積み重ねることが、コード品質とビジネス指標の両方を引き上げる好例
WooCommerceの税金レポートが表示されない時の原因と直し方

WooCommerceの税金レポートが表示されない時の原因と直し方

WooCommerce の分析「税金」レポートが突然「表示するデータがありません」になった場合、履歴データの再インポートと分析キャッシュのクリアでほぼ解決する。この症状は注文データや収益レポートが正常でも、税金レポートだけが空白になるのが特徴だ。

なぜ税金レポートだけが空白になるのか

なぜ税金レポートだけが空白になるのか

WooCommerce の分析画面は、注文が発生するたびにバックグラウンドで集計テーブルを更新している。しかし、プラグインの更新やサーバーの一時的な負荷、データベースの不整合が重なると、この集計処理が途中で止まることがある。すると注文や収益といった主要レポートは残余データで表示される一方、国別の税金内訳のような細かい集計を必要とするレポートだけが「表示するデータがありません」と出る。

とくに手動で税率を設定している店舗では、税率コードと注文データの突合作業が必要になるため、集計の中断に対して脆弱だ。一時的な不具合であり、データそのものが消失したわけではない。

Before(エラー状態)
税金レポートに「表示するデータがありません」
注文・収益は正常に表示される
履歴データのインポートが「0件中2件」で止まっている
↓
After(正常状態)
国別の税額が一覧表示される
VAT 申告データをそのまま抽出できる
履歴データのインポートが全件完了している
■ エラー状態 ■ 正常状態

履歴データを再インポートして集計を再開する

履歴データを再インポートして集計を再開する

最も確実な解決策は、分析用の履歴データを手動で再インポートすることだ。この操作は既存の注文や顧客データを消さず、集計テーブルだけを再構築する。

STEP 1 管理画面の「分析」→「設定」を開く
↓
STEP 2 ページ下部の「履歴データをインポート」セクションまでスクロール
↓
STEP 3 期間を「すべて」に設定し、「開始」ボタンを押す
↓
STEP 4 インポート完了後、税金レポートを再確認する

「スキップ」チェックボックスに注意する

履歴データのインポート画面には「以前にインポートした顧客と注文をスキップ」というチェックボックスがある。通常はチェックを入れたままでも問題ないが、インポートが途中で止まっている場合は、このチェックを外して全件を再処理するほうが確実だ。件数が多いと時間はかかるが、税金レポートの不整合を解消する近道になる。

インポートが「準備完了」で止まっている場合

履歴データのインポートが「準備完了」と表示され、クリックしても動かない場合は、WooCommerce のスケジュールアクションが滞留している可能性が高い。「WooCommerce」→「ステータス」→「スケジュールされたアクション」を開き、「保留中」のタスクがないか確認する。もし大量に溜まっているなら、WP Crontrol などのプラグインで手動実行するか、サーバーの WP-Cron が正しく動作しているかを調べる必要がある。

分析キャッシュをクリアして表示をリセットする

分析キャッシュをクリアして表示をリセットする

履歴データの再インポートだけで改善しない場合、分析画面が参照しているキャッシュが破損している。WooCommerce には専用のキャッシュクリア機能が用意されている。

  • 管理画面で「WooCommerce」→「ステータス」→「ツール」を開く
  • 「分析キャッシュをクリア」という項目を探す
  • 「実行」ボタンを押す
  • 画面を更新して税金レポートを再表示する

この操作は注文データや設定を一切変更しない。キャッシュを消すだけなので、安全に何度でも実行できる。実行後すぐに改善しない場合は、ブラウザのキャッシュも個別にクリアしてから再確認する。

ブラウザキャッシュとサーバーキャッシュも疑う

分析キャッシュをクリアしても改善しない場合、ブラウザが古い管理画面を表示し続けている可能性がある。シークレットウィンドウで管理画面を開き、同じ症状が出るかを試す。また、サーバー側で Redis や Memcached などのオブジェクトキャッシュを導入している場合は、そちらのキャッシュもクリアする。

データベースツールで直接修復する最終手段

データベースツールで直接修復する最終手段

ここまでの手順で直らない場合、WooCommerce の分析テーブルそのものに不整合が生じている。管理画面の「WooCommerce」→「ステータス」→「ツール」には、分析データベースの検証や修復を行うツールも含まれている。

  • 「分析データベースのテーブルを作成」を実行する(既存テーブルがある場合は何もしない)
  • 「分析データベースのテーブルを検証」を実行し、エラーがあれば修復を試みる

もしこれでも解決しない場合は、ステージング環境(本番とは別のテスト用サイト)に本番のデータを複製し、WooCommerce と WordPress を最新版に更新してから同じ手順を試す。更新によって分析テーブルの構造が修正され、問題が解消することがある。

よくある質問

注文データは消えていないか

消えていない。税金レポートが表示されないのは集計テーブルの不整合であり、実際の注文データは「WooCommerce」→「注文」から確認できる。VAT 申告に必要な情報も、個別の注文画面で確認可能だ。

WooCommerce を更新するのが怖いが、どうすればよいか

WP Staging などのプラグインでステージング環境を作り、そこで先に更新をテストするのが安全だ。問題なければ本番にも反映すればよい。更新を完全に避けるより、検証した上で適用するほうが長期的なリスクは小さい。

手動税率と自動税率のどちらが税金レポートに強いか

WooCommerce Tax 拡張(自動税率)を使うと、税率の管理と集計が一本化されるため、レポートの安定性は上がる。ただし手動税率でも正しく設定されていれば問題なく動作する。今回のように不具合が出たときは、手動税率のほうが原因特定に手間がかかることがある。

分析キャッシュをクリアすると他のレポートに影響するか

影響しない。キャッシュをクリアしても、次回アクセス時に再集計が走るだけだ。むしろ他のレポートでも古いキャッシュによる誤表示が起きていた場合、一括で改善する。

インポートがいつまでも終わらない時の対処法は

注文件数が数万件を超える大規模店舗の場合、インポートに時間がかかることがある。サーバーの PHP 実行時間制限(max_execution_time)が短すぎると途中で停止するため、サーバー管理者に延長を依頼するか、WP CLI を使ってコマンドラインから実行するのが確実だ。

この記事のポイント

  • 税金レポートだけが空白になるのは、集計テーブルの不整合が主な原因
  • 履歴データの再インポートと分析キャッシュのクリアが最も効果的な解決策
  • 「スキップ」チェックを外して全件インポートするとより確実
  • スケジュールアクションの滞留やサーバーキャッシュも併せて確認する
  • どうしても直らない場合はステージング環境で更新をテストする
英国配送ルール変更、EC事業者が今すぐ監査すべき4つのポイント

英国配送ルール変更、EC事業者が今すぐ監査すべき4つのポイント

英国のEC事業者を取り巻く配送環境が、ここ数年で最も大きな転換期を迎えている。規制変更や旧態依然としたキャリア契約が原因で、気づかぬうちに過剰なコストを支払っていたり、税関で突然荷物が差し止められたりするケースが増えている。根本的な原因は、数年前に構築した配送フローをそのまま使い続けていることにある。

この記事では、WooCommerce Blogが2026年6月29日に公開した最新レポートを基に、英国発送のEC事業者が今すぐ監査すべき4つの大きな運用変更点と、その解決を自動化する手段を具体的に解説する。

税関書類は「完璧」が最低ラインに

税関書類は「完璧」が最低ラインに

ポストBrexitのルールが定着した現在、「だいたい合っていれば通る」という時代は完全に終わった。税関の審査は急速に自動化が進み、以前なら警告で済んでいた標準的な記入ミスが、今では即座に国境での拒否や大幅な配送遅延に直結する。

人の手によるチェックを介さずに貨物を通関させるには、バックエンドで管理する3つのデータを完全にクリーンな状態に保つ必要がある。

拒否される申告書(Before)
HSコード: 6204.62(素材・用途不明瞭)
品目: 衣類(一般的な表現)
EORI番号: 未記載
↓
許可される申告書(After)
HSコード: 6109.10.00(綿製Tシャツ)
品目: 綿100% 編みTシャツ
インボイス: 単価/通貨/原産国を完全一致

税関システムが求めるデータと、実際に記入した内容の不一致が、配送トラブルの最大の要因だ。上記の比較のように、曖昧さを排除した正確な情報が求められる。

HSコードは「素材・構造・用途」で特定する

HSコード(Harmonized Systemコード)は、国際貿易における商品の統一分類番号だ。ここで求められるのは、商品の素材、構造、用途を正確に反映した、もっとも細かいレベルのコードである。「衣類」や「電子機器」といった大雑把な分類は通用しない。

HMRC(英国歳入関税庁)が提供するTrade Tariffツールを使って、自社のSKUカタログ全体の参照スプレッドシートを作成し、手動入力の工程を省くことを推奨する。

コマーシャルインボイスと税関申告書の完全一致

税関申告書に記載する合計金額は、コマーシャルインボイス(商業送り状)と1セントたりともずれてはならない。商品説明についても「gear(道具)」のような一般的な単語は一切使えず、箱の中身を正確に記述する必要がある。単価、通貨、そして明確な原産国も必須の項目だ。

UK EORI番号の必須化

商業目的で英国から輸出する場合、EORI番号(Economic Operator Registration and Identification)は事業者の基本的なライセンスにあたる。すべての英国発輸出品に必要で、HMRCを通じて無料で申請でき、数日以内に発行される。この番号を配送プロファイルに組み込み、常にシステムから自動付与される状態にしておくことが欠かせない。

2026年7月、EU向け少額輸入の免税が撤廃される

2026年7月、EU向け少額輸入の免税が撤廃される

2026年7月1日、EUは長年維持してきた150ユーロ以下の少額輸入品に対する関税免除(de minimis)を撤廃する。これにより、EU域内に入るすべての商用貨物が課税対象となり、商品カテゴリごとに一律3ユーロの関税が発生する。

2026年6月30日までの注文(Before)
Tシャツ 1枚(15ユーロ)
関税 0ユーロ(免税)
送料のみで配送完了
↓
2026年7月1日以降の注文(After)
Tシャツ 1枚 + サングラス 1つ(合計45ユーロ)
関税 3ユーロ × 2カテゴリ = 6ユーロ
別途、標準の輸入VATも加算

この変更は、消費者直送(D2C)モデルを採用するEC事業者にとって、事業構造を揺るがす大きな運用変更だ。

一律€3の関税が商品カテゴリごとに発生

注意したいのは、課金単位が「箱」ではなく「商品カテゴリ」である点だ。ヨーロッパの顧客が同じ箱にTシャツとサングラスを注文した場合、2つの別カテゴリとして扱われ、6ユーロの一律関税が直接注文に適用され、さらに標準の輸入VATが上乗せされる。商品点数ではなく、HSコードの分類数がコストを決める。

価格戦略の見直しが急務に

安価な小物商品を中心に欧州市場へ越境販売している場合、現在の価格設定はもはや通用しない。利益率を守るためには、直ちに送料設定を更新するか、EU域内にフルフィルメント拠点を設けて国境通過そのものを回避するルートを模索する必要がある。

DDUからDDPへの切り替えが顧客維持を左右する

DDUからDDPへの切り替えが顧客維持を左右する

国際配送をDDU(関税抜き配送)のまま続けているなら、顧客維持に深刻なダメージを与えている可能性が高い。DDUとは、配送業者から届く突然のSMSやメールで、荷物を受け取るための現金支払いを要求される方式だ。購入時に予期していなかった追加の国境手数料に直面した買い物客の多くは、単純に受け取りを拒否する。商品は返送され、事業者は返金処理に加え、往復の国際送料を負担する二重の損失を被る。

DDU(関税抜き配送)フロー
購入者 商品代金を支払う → 配送中に追加請求の連絡 → 支払い拒否
※返品 + 送料往復負担 + 返金処理が発生
↓
DDP(関税込み配送)フロー
購入者 チェックアウト時に関税を一括支払い → 追加費用ゼロで受け取り
※通関手続きが完了し、自宅へ直送される

DDP(関税込み配送)はこうした摩擦を根本から取り除く。関税額を正確に計算してチェックアウト画面で徴収し、事業者側で配送業者を通じて事前に関税を支払うことで、荷物は税関の留置施設を経由せず、直接顧客の玄関先に届く。

DDUは「サプライズ費用請求」で機会損失を生む

「追加で○ポンド支払ってください」という連絡は、衝動買いに近い感覚で購入した顧客にとって、クーリングオフの引き金になる。商品到着の喜びよりも、予期せぬ出費への苛立ちが勝り、荷物は放置され、やがて返送される。この流れが構造的な機会損失を生んでいる。

DDPでチェックアウト画面から摩擦を除去する

目安として、国際関税が平均バスケット単価の10%を超える場合、DDPのワークフローを構築するだけで、受け取り拒否率の激減によって投資は即座に回収できる。顧客体験の透明性を高め、返品に関わる隠れコストを削減できる点が、DDP最大の利点だ。

北アイルランド向け配送、UKIMS登録で手続き簡略化

北アイルランド向け配送、UKIMS登録で手続き簡略化

北アイルランドは英国の関税領域に属するが、物品に関してはEUルールに従う特殊な立場にある。このため、グレートブリテン島(イングランド、スコットランド、ウェールズ)から北アイルランドへ商品を送る際の扱いは、その商品が「EU域内に流出するリスクがない」かどうかで変わる。

2025年5月1日から、UKIMS(英国国内市場スキーム)に登録された事業者が、UK Internal Marketレーンを通じて適格商品を移動させる場合、税関申告書の作成が不要になった。UKIMSへの登録は無料で、HMRCは手続きや申告を支援するTrader Support Serviceも無償提供している。北アイルランド向け配送の頻度が高いなら、登録しない手はない。

配送キャリアの料金は半年に1度の見直しが必須

配送キャリアの料金は半年に1度の見直しが必須

ほとんどの事業者は、開業初期に選んだ配送キャリアと契約したまま、料金交渉をしない。しかし、取引量が少なかった時期の料率シートは、現在の出荷量に見合っていない可能性が極めて高い。

単一キャリア依存(従来の方法)
特定のキャリアA すべての荷物に一律適用
※エディンバラ宛2kgとダブリン宛500gで、同じ料金テーブルを使う非効率が発生
↓
複数キャリアの動的比較(改善後)
荷物A(2kg / 英国内) → キャリアBが最安 、 荷物B(500g / アイルランド) → キャリアCが最安
※重量と宛先に応じて、配送ごとに最適なキャリアを自動選定

WooCommerce Blogの記事によれば、6〜12カ月に一度はアカウントマネージャーに連絡し、出荷量の増加を伝えて新たな料率シートを要求すべきだとしている。Royal Mail、DPD、Evriなど主要キャリアは段階的な料金体系を採用しており、2年前には関係なかった割引閾値が、今の自分たちには適用されるかもしれない。単一キャリアに依存せず、荷物の重量と目的地ごとに最適なサービスを自動選択するマルチキャリア比較が、継続的なコスト削減の鍵となる。

WooCommerceで配送を自動化する具体的な手段

WooCommerceで配送を自動化する具体的な手段

これらの問題を解決するには、初期設定にある程度の手間はかかるが、一度構築してしまえば配送業務は完全にバックグラウンドで動くようになる。バックエンドのコードを一から書き換えずにこの仕組みを素早く展開するには、ShipStationのようなアグリゲーターを利用するのが最も早い。

ShipStationで注文処理から通関書類作成まで一元化

WooCommerce Blogで紹介されているShipStationは、WooCommerceと直接接続することで、フルフィルメントの全工程を一元管理する。注文の取り込みから、クリーンな通関書類の自動生成、国際発送時の商品HSコードのシステム的な適用までを自動化できる。

英国のWooCommerceストアにとっての最大の利点は、Royal Mail、DPD、Parcelforce、Evriといった英国の主要キャリアと事前交渉済みの割引料金を、契約後すぐに利用できる点にある。個別に初回契約を結ぶ手間が省け、既存のキャリアアカウントを持っている場合は、それを追加することも可能だ。

導入ハードルは30日間の無料トライアルで検証可能

ShipStationは柔軟な月額契約で、クレジットカード不要の30日間無料トライアルを提供している。税関ルールの手動監査に疲弊していたり、実際の配送料率をリスクゼロで比較検証したいなら、自社ストアを接続してテスト出荷のバッチを走らせてみるのも一つの手段だ。

この記事のポイント

  • 税関申告では、HSコードを「素材・構造・用途」の3軸で完全に特定し、インボイスと申告書の記載内容を一致させることが必須になっている
  • 2026年7月からEU向けの150ユーロ関税免除が撤廃され、商品カテゴリごとに3ユーロの一律関税が発生するため、価格戦略の見直しが急務だ
  • DDP(関税込み配送)への切り替えにより、顧客へのサプライズ請求を排除し、受け取り拒否による損失を防止できる
  • 北アイルランド向け配送は無料のUKIMSに登録することで、税関申告の手間を大幅に省ける
  • 配送キャリアの料率は半年ごとに再交渉し、マルチキャリア比較による自動選定で継続的なコスト削減を図るべきだ
  • ShipStationのようなWooCommerce連携ツールで、通関書類の作成からキャリア選択までを自動化し、運用負荷を軽減できる
WooCommerce HPOSが48時間で100万件以上のアクションスケジューラ完了ジョブを生成した原因と対処法

WooCommerce HPOSが48時間で100万件以上のアクションスケジューラ完了ジョブを生成した原因と対処法

WooCommerceサイトでデータベースサイズが突然急増し、wp_actionscheduler_actionsテーブルに数百万件もの完了済みジョブが蓄積している場合、HPOSデータ同期バッチプロセスが無限ループを起こしている可能性が極めて高い。ここでは症状の見分け方から原因の特定、停止、クリーンアップまで、具体的な手順をまとめる。

HPOS関連のデータベース肥大化が疑われる症状

HPOS関連のデータベース肥大化が疑われる症状

以下のような兆候が複数同時に現れたら、Action Schedulerの暴走を疑ってよい。

  • データベース容量が短時間で急激に増加する(数GB単位)
  • PHPエラーログのファイルサイズが異常に大きくなる
  • データベースのロックエラーやデッドロックが頻発する
  • 管理画面やフロントエンドで「INSERT command denied」などのエラーが出る
  • サーバーのバックグラウンドプロセスがほぼ常時稼働し続ける
  • 注文件数が数百件なのにAction Schedulerテーブルだけが肥大化している

これらの症状は、単体では他の原因もあり得るが、データベース内の完了ジョブが異常に増えている点が最大の特徴だ。

正常時(Before)
wp_actionscheduler_actions テーブルに数百件程度のジョブが存在する
↓
暴走時(After)
100万件以上の完了ジョブが蓄積し、データベース全体が膨張する
■ 正常時  ■ 暴走時

Action Schedulerが暴走していないか確認する方法

Action Schedulerが暴走していないか確認する方法

まずはデータベースを直接調べ、どのジョブが何件蓄積しているかを確かめる。WP-CLIが使えるならコマンドラインから、そうでなければphpMyAdminやAdminerで以下のクエリを実行する。

STEP 1 Action Schedulerテーブルの完了ジョブ数を集計する
↓
STEP 2 フック名「wc_run_batch_process」でフィルタし、引数を確認する
↓
STEP 3 注文件数とジョブ件数を比較し、異常な乖離を確認する
↓
STEP 4 実行中のジョブが1件完了するたびに次が即座にスケジュールされるループを特定する

完了ジョブの数とフック名を調べる

データベースに直接問い合わせる場合、以下のSQLで完了状態のジョブをフック名別に集計できる。

SELECT hook, COUNT(*) AS cnt
FROM wp_actionscheduler_actions
WHERE status = 'complete'
GROUP BY hook
ORDER BY cnt DESC
LIMIT 10;

ここで wc_run_batch_process の件数が数十万〜数百万件と突出していれば、疑いは濃厚だ。

引数(args)から発行元を特定する

次に、そのフックの引数を見る。例えば以下のクエリで先頭の数件を取得する。

SELECT action_id, args, scheduled_date_gmt
FROM wp_actionscheduler_actions
WHERE hook = 'wc_run_batch_process'
AND status = 'complete'
ORDER BY action_id DESC
LIMIT 5;

引数フィールドにはシリアライズされたデータが入っている。その中に Automattic\WooCommerce\Internal\DataStores\Orders\DataSynchronizer という文字列が含まれていれば、HPOSのデータ同期機構がバッチを発行している証拠だ。

注文件数との比較で異常を確信する

管理画面のWooCommerce → 注文で表示される注文の総数は、データベースの wp_posts(またはHPOS有効時は wp_wc_orders)で確認できる。注文が600件しかないのに、同期バッチの完了ジョブが100万件もあるなら、明らかにループが発生している。

動作中のループをリアルタイムで観察する

WP-CLIが利用可能なら、以下のコマンドでペンディング状態のジョブを監視する。

wp action-scheduler list --hook=wc_run_batch_process --status=pending

定期的に実行すると、常に1件だけ存在し、それが完了するとすぐに新たなペンディングが生まれるパターンが観測できるはずだ。これはキューが滞留しているのではなく、バッチ自身が次をスケジュールし続ける無限ループであることを示す。

なぜHPOS DataSynchronizerが無限ループを起こすのか

なぜHPOS DataSynchronizerが無限ループを起こすのか

HPOS(High-Performance Order Storage)を有効にすると、WooCommerceは注文データを従来の wp_posts テーブルから専用テーブルへ移行する。この移行やデータの同期を担うのが DataSynchronizer であり、バックグラウンドでバッチ処理を走らせる。

通常は同期が完了すればバッチは停止するが、何らかの設定不整合やエラーにより「同期が完了したと見なされず、次のバッチが即座に予約される」状態に陥ることがある。具体的には、各バッチが「保留中 → 完了 → 次バッチ予約」というサイクルを際限なく繰り返す。注文数が少なくても、このループによってAction Schedulerのテーブルだけが急激に肥大化し、データベース全体を圧迫する。

保留中(Pending)
↓
完了(Complete)
↓
次バッチ予約(Schedule Next)
↓
再び 保留中(Pending)へ
↑ 無限にループする

このループが起きているかどうかは、データベースを直接見るまで気づきにくい。キャッシュやRedis、WP Rocketなどを最初に疑いがちだが、真因はAction Schedulerの中にある。

データベースの安静化とクリーンアップの手順

データベースの安静化とクリーンアップの手順

原因がHPOSの同期バッチループと判明したら、ループを止め、完了ジョブを削除し、再発を防ぐ。以下の手順を順に実行する。

STEP 1 WP-CLIで同期状態を確認し、必要に応じて同期をリセットする
↓
STEP 2 Action Schedulerの完了ジョブを安全に一括削除する
↓
STEP 3 データベーステーブルを最適化し、容量を解放する
↓
STEP 4 再発防止のためにHPOS設定を見直す

同期状態のリセット

まず、現在のHPOS同期状況を確認する。WP-CLIで次のコマンドを実行する。

wp wc hpos sync status

ここで「status: in-progress」や「pending」が表示される場合、同期が完了しておらず、バッチが動き続けている可能性がある。強制的にリセットし、不要な同期を停止するには以下を実行する。

wp wc hpos sync reset

リセット後、再度ステータスを確認し「idle」や「complete」になっていれば、新たなバッチはスケジュールされなくなる。

完了ジョブの一括削除

100万件単位の完了ジョブを削除するには、Action Schedulerが提供するWP-CLIコマンドを使うのが安全で高速だ。以下のコマンドで、完了状態のジョブをすべて削除できる。

wp action-scheduler clean --status=complete

特定のフックのみを削除したい場合は、プレーンなSQLで一度に削除してもよいが、必ず事前にデータベース全体のバックアップを取ること。

DELETE FROM wp_actionscheduler_actions
WHERE hook = 'wc_run_batch_process' AND status = 'complete';

さらに、関連するログテーブル(wp_actionscheduler_logs)の不要レコードも合わせて削除すると、ディスク容量を大きく回復できる。ただし、こちらは慎重に扱う必要があるため、まずは完了ジョブの削除だけでも効果は大きい。

テーブル最適化で容量を解放

大量のレコードを削除した後は、データベースが断片化し、実際の容量が解放されないことがある。phpMyAdminなどから該当テーブルに対して「最適化(OPTIMIZE TABLE)」を実行するか、以下のSQLを流す。

OPTIMIZE TABLE wp_actionscheduler_actions;
OPTIMIZE TABLE wp_actionscheduler_logs;

これにより、削除した領域がOSに返却され、データベース全体のサイズが縮小する。

再発防止とHPOS設定の見直し

ループが再発しないように、WooCommerceのHPOS設定を確認する。管理画面の WooCommerce → 設定 → 詳細設定 → 機能 から「High-performance order storage(高性能注文ストレージ)」が有効になっているか、そして「互換モードを有効にする」や「データ同期を有効にする」オプションがどのようになっているかをチェックする。

既に全注文がHPOSテーブルに完全移行済みで、互換モードが不要なら、これらの同期オプションを無効化することで、バックグラウンドのバッチ処理そのものを止められる。ただし、テーマやプラグインが古い注文データ参照方法を使っている場合は注意が必要だ。

また、WP-CLIのcronを定期的に監視し、Action Schedulerのジョブ数が異常増加していないかをチェックする仕組みをサーバー監視に組み込むと早期発見につながる。

よくある質問

HPOSが有効かどうかはどこで確認できるか

管理画面の「WooCommerce → 設定 → 詳細設定 → 機能」に移動し、「注文データストレージ」の項目で「High-performance order storage」が選択されていれば有効だ。WP-CLIでは wp wc hpos status で確認できる。

完了ジョブを削除してもサイト動作に影響はないか

Action Schedulerの完了ジョブは過去の処理履歴であり、削除しても現在予約されているジョブや進行中の処理には影響しない。ただし、監査やデバッグ目的で残したい場合は、削除前にバックアップを取ることを強く推奨する。

WP-CLIが使えないレンタルサーバーではどうすればよいか

phpMyAdminなどのデータベース管理ツールから直接SQLで削除できる。プラグイン「WP Crontrol」などを利用すれば、Action Schedulerの一覧を管理画面で確認し、フックごとに手動で削除することも可能だが、件数が多い場合はSQLのほうが現実的だ。

同期をリセットしてもループが再発するのはなぜか

根本原因が解消されていないと再発する。たとえば、同期オプションが有効なまま残っていたり、カスタムコードがバッチをトリガーし続けているケースがある。同期の完全停止を試み、プラグインの干渉も疑いながら一つずつ切り分ける必要がある。

この記事のポイント

  • データベースの急激な肥大化とAction Schedulerの完了ジョブ数に注目する
  • フック名「wc_run_batch_process」と引数からHPOSの同期バッチループを特定する
  • WP-CLIで同期状態をリセットし、完了ジョブを一括削除してテーブルを最適化する
  • HPOSの同期設定を見直し、不要なバッチ処理を完全に止めて再発を防ぐ
WooCommerce PayPal決済が断続的に失敗する原因と直し方

WooCommerce PayPal決済が断続的に失敗する原因と直し方

WooCommerce PayPal Payments プラグインで決済が断続的に失敗し OrderProcessor.php のエラーが発生する場合、注文 ID のセッション保存が決済リダイレクトと競合しているか、PayPal ウェブフックの署名検証に失敗している可能性が高い。原因をログから特定し、設定と更新状況を見直せば、決済の取りこぼしを止められる。

なぜ PayPal 決済やカード決済が断続的に失敗するのか

なぜ PayPal 決済やカード決済が断続的に失敗するのか

断続的に発生する決済失敗は、一定の条件が重なった時だけ起こる「競合状態」が原因になっていることが多い。WooCommerce PayPal Payments 4.0.4 以前のバージョンでは、購入者が PayPal にリダイレクトされる直前に注文 ID をセッションへ保存する処理と、PayPal 側の承認完了後の戻り処理がうまく噛み合わず、注文 ID を見失うケースが報告されている。

また PayPal から届く CHECKOUT.ORDER.APPROVED ウェブフックの署名検証に失敗すると、ブラウザ経由の戻りが完了しなかった注文を復旧できず、売上が失われる。キャッシュや最適化を完全に停止しても再発するケースは、プラグイン内部のタイミング問題である可能性が極めて高い。

エラーログから失敗のパターンを特定する

エラーログから失敗のパターンを特定する

WooCommerce PayPal Payments の詳細ログを有効にする

管理画面の「WooCommerce」から「設定」へ進み「決済」タブを開く。PayPal の項目にある「接続を管理」画面の下部に「ログ」というチェックボックスがあるので、これを有効にして保存する。有効化後は決済のたびにログが蓄積され始めるので、エラーが出たタイミングを正確に追える。

ログに記録されるエラーメッセージを読み解く

失敗時のログには「Payment failed: There was an error processing your order. OrderProcessor.php:109」と出力される。ただしこのメッセージだけでは表面的な情報に過ぎない。同じ時刻付近に PayPal API への注文作成リクエストや capture 呼び出しが記録されているかを確認することが重要だ。

もしログに PayPal 側の注文作成すら残っていないなら、プラグインが PayPal へ処理を引き継ぐ前の段階でコケている。逆に注文作成は成功しているのに capture 呼び出しが見つからないなら、戻り処理かウェブフックの不具合を疑う。

STEP 1 WooCommerce 設定で PayPal の詳細ログを有効にする
↓
STEP 2 失敗時刻の前後で PayPal API 呼び出しの有無を調べる
↓
STEP 3 注文作成ログがない場合はセッションと注文 ID の欠落を疑う

上の手順で失敗パターンを大まかに分類できる。注文作成ログが欠けているパターンは後述の注文 ID 消失問題と合致する。

ウェブフック検証失敗の原因と直し方

ウェブフック検証失敗の原因と直し方

ウェブフックが届いているのに検証に失敗する仕組み

PayPal から WordPress サイトの REST エンドポイント(/wp-json/paypal/v1/incoming)に届いたウェブフックは、プラグインが PayPal の公開鍵を使って署名を検証する。この検証が通らないと、たとえ CHECKOUT.ORDER.APPROVED イベントを受け取っていても支払いを完了できず、注文は保留のままになる。

署名検証が失敗する典型的な原因

まず疑うのはサーバー時刻のずれだ。署名にはタイムスタンプが含まれており、サーバーの時刻が大きく狂っていると検証に失敗する。次に考えられるのがプラグイン内部で保持している PayPal 公開鍵のキャッシュ不整合だ。接続情報を更新した直後や、マルチサイト構成でドメインが一致していない場合にも起こりうる。

ウェブフック検証を復旧させる具体的な対処

最初に PayPal との接続を一度解除し、再度接続し直す。これで公開鍵のキャッシュが強制的に再取得される。それでも直らない場合は WooCommerce の「ステータス」画面から「ツール」タブを開き、「WooCommerce のトランジェントをクリア」と「期限切れのトランジェントをクリア」を順に実行する。最後に PayPal のデベロッパーダッシュボードでウェブフック URL が本番環境の正しいドメインを指しているか確認する。

Before(検証失敗時)
ウェブフック受信 → 署名照合エラー → 注文が未完了のまま放置
↓
After(再接続後)
ウェブフック受信 → 署名照合成功 → 注文が正常に完了
■ 検証失敗 ■ 再接続で復旧

上の流れで復旧しない場合はプラグインバージョン固有の不具合が根底にある可能性が高い。

注文 ID がセッションから消える問題に対処する

注文 ID がセッションから消える問題に対処する

リダイレクト前に注文 ID が保存されない既知の不具合

GitHub の issue #4458 でも報告されているが、WooCommerce PayPal Payments 4.0.4 以前のバージョンでは、購入者が PayPal へリダイレクトされる直前に注文 ID を正しくセッションへ格納できないケースがある。これが発生すると、PayPal 上で決済が承認されても、戻ってきた WooCommerce 側でどの注文に紐づければよいかわからず、OrderProcessor がエラーを起こす。

修正パッチやバージョンアップで解決できるか

バージョン 4.1.0 ではこのタイミング問題に対する修正が含まれていると開発者からアナウンスされている。まずはプラグインを 4.1.0 以降へ更新することが最も確実な対処となる。どうしても本番環境で即時の更新が難しい場合は、プラグインの公式サポートチャネルを通じて修正パッチの提供を依頼する手もある。

更新前に検証するべき設定

更新前に WooCommerce の「システムステータス」レポートを取得し、PHP のバージョンが 8.0 以上であること、WordPress 本体と WooCommerce が最新の安定版であることを確認する。多言語プラグイン(WPML 等)を併用している場合は、プラグイン同士の互換性もあわせてチェックしておく。

それでも直らない場合に踏むべき最終手順

それでも直らない場合に踏むべき最終手順

キャッシュとセキュリティ系プラグインの完全な切り離し

速度最適化プラグインやサーバー側の動的キャッシュはすでに無効化していても、WAF(ウェブアプリケーションファイアウォール)やセキュリティプラグインが PayPal からのコールバック通信をブロックしている場合がある。一時的にすべてのセキュリティ系プラグインを停止し、サーバーのアクセスログで /wp-json/paypal/v1/incoming への POST リクエストが 200 ステータスを返しているか確認する。

注文メタデータとセッションデータの直接確認

失敗した注文の詳細画面を開き、カスタムフィールドに _ppcp_paypal_order_id というメタキーが存在するか調べる。これが空になっている注文は、まさに注文 ID の引き継ぎに失敗した注文だ。WooCommerce が生成した注文番号は存在するのに PayPal 側の注文 ID だけ欠落している場合は、前述の競合が再現したと断定してよい。

確認項目
注文メタデータ → _ppcp_paypal_order_id の有無を確認
アクセスログ → /wp-json/paypal/v1/incoming への POST が 200 を返しているか
プラグインバージョン → 4.1.0 以上へ更新済みか
■ データ・技術系の確認ポイント

この三点を確認すれば、問題がインフラ寄りなのかアプリケーション寄りなのか切り分けられる。

よくある質問

PayPal のウェブフック検証失敗は何が原因か

サーバー時刻のずれや PayPal 公開鍵のキャッシュ不整合が最も多い原因だ。接続を一度解除して再接続し、WooCommerce のトランジェントをクリアすることで解決することが多い。まれにホスティング環境のファイアウォールが PayPal の検証用リクエストを遮断しているケースもある。

決済が断続的に失敗する場合、キャッシュが原因か

キャッシュが直接の原因でないケースも多い。キャッシュを完全に停止し、カートやチェックアウトの除外設定を施しても再発するなら、プラグイン内部の競合状態や注文 ID の引き継ぎ不良を疑うべきだ。

WooCommerce PayPal Payments の最新バージョンで問題は修正されたか

バージョン 4.1.0 では、注文 ID のセッション保存タイミングに関する修正が含まれている。4.0.4 以前で OrderProcessor エラーが断続的に出ている場合は、まず 4.1.0 以降へ更新することが推奨される。

注文 ID が保存されない問題はどうやって確認するか

失敗した WooCommerce 注文のカスタムフィールドを確認し、_ppcp_paypal_order_id というメタキーが空かどうかを調べる。空であれば注文 ID の引き継ぎに失敗している。プラグインの詳細ログにも PayPal 側の注文作成リクエストが記録されない。

ウェブフックのエンドポイントにアクセスできるか確認する方法は

サイトのアクセスログで /wp-json/paypal/v1/incoming への POST リクエストを探し、HTTP ステータスが 200 であることを確かめる。PayPal のデベロッパーダッシュボード上でウェブフック URL が本番ドメインを指しているかも同時に検証する。

この記事のポイント

  • ログを有効にして OrderProcessor エラーの前後に PayPal API 呼び出しが存在するか確認する
  • ウェブフック検証失敗は接続の再設定とトランジェントクリアで復旧する可能性が高い
  • 注文 ID のセッション消失は 4.1.0 以上のプラグイン更新で根本対処できる
  • キャッシュ停止だけでは直らない競合はプラグイン内部のタイミング問題を疑う
  • 注文メタデータとアクセスログの二面から原因の切り分けを進める
WooCommerce更新後に重大なエラーが発生した時の原因と直し方

WooCommerce更新後に重大なエラーが発生した時の原因と直し方

WooCommerce 10.9.1 への更新後に「このサイトで重大なエラーが発生しました」と表示されたり、管理画面にアクセスできなくなったりした場合、対処の第一歩はサーバー側の PHP OPcache をクリアすることだ。更新中にオートローダーが古いキャッシュを参照して必要なファイルを読み込めず、致命的エラーが発生しているケースが多い。キャッシュをリセットし PHP プロセスを再起動すれば、多くの場合はそのまま復旧する。

なぜ WooCommerce 更新後に「重大なエラー」が発生するのか

なぜ WooCommerce 更新後に「重大なエラー」が発生するのか

このエラーの根本原因は、WooCommerce が内部で使っている Jetpack オートローダーのクラス読み込みに失敗している点にある。class-php-autoloader.php の102行目で Settings.php ファイルを要求しようとしたが、ファイルが存在しないかパスが解決できず、E_ERROR が発生している。

スタックトレースを見ると、REST API の初期化から管理画面の設定データを構築するまでの一連の処理でエラーが連鎖している。通常これは WooCommerce の更新が完了しない中途状態で発生する一時的な不具合で、新しいバージョンのコードが正しく配置された後もサーバーが古い OPcache を参照し続けるために起こる。

実際の環境は WordPress 7.0、テーマ Flatsome 3.20.7、PHP 8.3.31 と非常に新しいバージョン構成であり、各要素の互換性が原因ではなく、更新プロセスの瞬間的なファイル整合性の乱れがトリガーになっている。

Before(エラー状態)
OPcache 更新前の古いパス情報を保持
オートローダー 存在しないファイルを要求 → 致命的エラー
管理画面 「このサイトで重大なエラーが発生しました」と表示
↓
After(復旧状態)
OPcache クリアされ最新のパス情報を読み込み
オートローダー 正しいファイルを見つけて読み込み成功
管理画面 通常通りアクセス可能に
■ エラー発生時の状態 ■ OPcache クリア後の復旧状態

最初に試すべき復旧手順「PHP OPcache のクリア」

最初に試すべき復旧手順「PHP OPcache のクリア」

管理画面にアクセスできずエラーメールだけが届いている状況では、サーバー側で PHP の OPcache をリセットするのが最も即効性のある対処だ。OPcache は PHP の実行速度を上げるためにスクリプトのコンパイル結果をメモリ上に保持する仕組みだが、プラグイン更新後はこのキャッシュが古くなり、実際には存在するファイルを「見つからない」と誤認させる。

STEP 1 サーバーの管理パネル(cPanel 等)または SSH にログインする
↓
STEP 2 PHP 設定のセクションから「OPcache をリセット」または「PHP を再起動」を実行する
↓
STEP 3 ブラウザのキャッシュもクリアし、シークレットウィンドウで管理画面に再度アクセスする
↓
STEP 4 管理画面に正常にログインできたら、WooCommerce の更新が完了していることを「プラグイン」一覧で確認する

共用サーバーで OPcache をクリアする方法

多くの国内共用サーバーでは、管理パネル(cPanel や独自パネル)の「PHP 設定」や「PHP セレクター」の中に「OPcache のリセット」ボタンが用意されている。このボタンを押すだけでサーバー側のキャッシュが即座に消去され、PHP プロセスが新しいコードを読み直す。

もし管理パネルに専用ボタンが見あたらない場合は、PHP のバージョンを一度別のバージョンに切り替えてから元に戻す操作でも OPcache がクリアされる。たとえば PHP 8.3 から 8.2 に変更し、数分後に再び 8.3 に戻すといった方法だ。この操作はサーバーの設定変更として扱われるため、内部で PHP-FPM の再起動が走り OPcache がリセットされる。

SSH が使える場合のコマンドライン操作

VPS やクラウドサーバーで SSH アクセス権があるなら、ターミナルから直接 PHP-FPM を再起動することで OPcache をクリアできる。よく使われるコマンドは以下の通りだ。

sudo systemctl restart php8.3-fpm

サーバーによっては php-fpm のサービス名が異なるため、systemctl list-units | grep php で正確なサービス名を確認してから実行する。OPcache 専用の CLI コマンド opcache_reset() を直接呼ぶ方法もあるが、PHP-FPM 再起動のほうが確実で手間もかからない。

それでも直らない場合の追加手順

それでも直らない場合の追加手順

OPcache をクリアしても WordPress 管理画面にアクセスできない場合や、「このサイトで重大なエラーが発生しました」というメッセージが消えない場合は、手動でのファイル修復とプラグインのリセットを試す。

FTP で WooCommerce プラグインを手動再配置する

更新中の通信断やタイムアウトで一部のファイルが書き込まれなかった可能性もある。FTP クライアントでサーバーに接続し、/wp-content/plugins/woocommerce/ ディレクトリをいったん削除またはリネームし、WordPress.org からダウンロードした最新の WooCommerce 10.9.1 の ZIP を解凍してアップロードし直す。この操作でオートローダーが参照する Settings.php を含むすべてのファイルが正しく配置される。

この手順を行う前には、必ずサイト全体のバックアップを取っておくこと。WooCommerce のデータベーステーブルはプラグインファイルの差し替えでは影響を受けないが、カスタマイズが入っている場合は注意が必要だ。

管理画面にすらアクセスできない場合の緊急リセット

管理画面が完全にダウンしていて FTP しか使えない状況では、WooCommerce プラグインのフォルダ名を一時的に変更する手段が有効だ。/wp-content/plugins/woocommerce/ を woocommerce_tmp などにリネームする。WordPress は存在しないプラグインディレクトリを無効化するため、WooCommerce に依存しない管理画面の基本機能が復活する。

管理画面にログインできたら、プラグイン一覧で WooCommerce が「無効」になっていることを確認し、その後フォルダ名を元に戻してからプラグイン一覧で再有効化する。この一連の流れで、オートローダーの読み込みエラーがリセットされることが多い。

エラーを未然に防ぐための更新前チェックリスト

エラーを未然に防ぐための更新前チェックリスト

WooCommerce のような大規模プラグインの更新は、事前にいくつかの準備をしておくだけで致命的エラーのリスクを大幅に下げられる。

  • 更新前に必ずサイト全体とデータベースのバックアップを取得する
  • 可能であればステージング環境で先に更新をテストする
  • 更新中はブラウザを閉じず、更新完了のメッセージが表示されるまで待つ
  • 更新直後に管理画面から「設定」→「パーマリンク設定」を開き「変更を保存」を押してキャッシュをリフレッシュする

更新のタイミングも重要だ。アクセスの少ない深夜帯やメンテナンスモードを有効にした状態で行うと、万一エラーが発生してもユーザーへの影響を最小限に抑えられる。

よくある質問

WooCommerce の更新中にブラウザを閉じてしまったらどうすればいいか

更新中に切断しても、ファイルのダウンロードと展開が完了していれば問題ないことが多い。管理画面にアクセスできるならプラグイン一覧でバージョンを確認し、古いバージョンのままなら再度更新を実行する。管理画面に入れない場合は OPcache クリアか手動再配置を試す。

エラーメールに記載されたファイルが本当に存在しないのか確認する方法は

FTP でサーバーに接続し、/wp-content/plugins/woocommerce/src/Admin/API/Settings.php が実際に存在するか確認する。ファイルが存在するのにエラーが出ているなら、OPcache の問題と判断できる。存在しない場合は手動再配置が必要だ。

OPcache をクリアしてもエラーが繰り返し発生するのはなぜか

他のプラグインやテーマが WooCommerce の REST API 初期化にフックしており、競合が起きている可能性がある。すべてのプラグインを一時的に無効化し、標準テーマに切り替えてから WooCommerce のみを有効にして原因を特定する。

PHP のバージョンを上げた直後にエラーが出た場合の対処は

PHP 8.3 では一部の古いプラグインやテーマが非互換を起こす。WooCommerce 10.9.1 自体は PHP 8.3 に対応しているが、他のプラグインが同バージョンに対応しているか確認し、必要に応じて PHP 8.2 に一時的に戻して様子を見る。

エラーが表示されず画面が真っ白になるだけの場合は

「このサイトで重大なエラーが発生しました」の代わりに真っ白な画面(ホワイトスクリーン)になるのは、PHP のエラー表示が無効になっているためだ。wp-config.php に define('WP_DEBUG', true); と define('WP_DEBUG_LOG', true); を追加すると /wp-content/debug.log にエラー詳細が出力される。

この記事のポイント

  • WooCommerce 更新後のオートローダーエラーは PHP OPcache のクリアでほぼ解決する
  • 管理パネルの「OPcache リセット」ボタンか PHP 再起動で対処する
  • 直らない場合は FTP でプラグインファイルを手動再配置する
  • 緊急時は WooCommerce フォルダを一時的にリネームして管理画面に復帰する
  • 更新前のバックアップとステージングテストでリスクを下げられる
WooCommerce納品書印刷で致命的エラーが出た時の直し方

WooCommerce納品書印刷で致命的エラーが出た時の直し方

WooCommerce の「Print Invoice & Delivery Notes for WooCommerce」プラグインで納品書や請求書を印刷しようとしたとき、管理画面に「このサイトで重大なエラーが発生しました」と表示され、PDF が生成されない問題は、PDF 生成に使う Dompdf ライブラリのクラスが見つからないことが原因だ。プラグインを再インストールし、サーバーのキャッシュをクリアすればほぼ解決する。

なぜ納品書印刷で致命的エラーが発生するのか

なぜ納品書印刷で致命的エラーが発生するのか

エラーログを確認すると「PHP Fatal error: Uncaught Error: Class “Dompdf\Options” not found」というメッセージが記録されている。これはプラグインが PDF を生成するために依存している Dompdf ライブラリを読み込めず、クラスが存在しない状態で呼び出されたことを意味する。原因は主にふたつに集約される。

ひとつはプラグインのインストールやアップデート時に、Dompdf のファイルを含む vendor ディレクトリが正しく配置されなかったケース。FTP アップロードの中断やパーミッションの問題でライブラリが欠落すると、このエラーが起きる。もうひとつは OPcache やプラグインのクラス自動読み込み(オートローダー)の不具合だ。管理画面の Ajax 経由で印刷を実行する際、特定の条件下でオートローダーが動かず、クラスが見つからないと判断される。一括印刷(Bulk Actions)が正常に動作するのも、別のコード経路でライブラリが読まれるためで、単票の印刷だけが失敗する典型的なパターンになっている。

エラーの切り分けと再インストール手順

エラーの切り分けと再インストール手順

エラーを解消するには、まずプラグインのファイルが完全に揃っている状態に戻し、キャッシュの影響を断ち切るのが確実だ。以下のステップで順に進めると、根本原因を速やかに取り除ける。

STEP 1 エラーログの確認で原因を絞り込む
↓
STEP 2 プラグインを完全に再インストール
↓
STEP 3 OPcache やサーバーキャッシュをクリア
↓
STEP 4 納品書印刷を再度実行して確認

STEP 1 エラーログを確認して確実に特定する

WordPress の wp-config.php に define('WP_DEBUG', true); define('WP_DEBUG_LOG', true); が記述されていれば、/wp-content/debug.log に今回のような致命的エラーが記録される。ログを開き「Dompdf\Options not found」という行が含まれていることを確かめる。もしログが取れていなければ、上記の定数を一時的に有効にしてから問題の印刷操作をもう一度試す。この情報があると、単なる画面の白化や汎用エラーと区別でき、対応を誤らない。

STEP 2 プラグインを完全に再インストールする

管理画面の「プラグイン」→「インストール済みプラグイン」から「Print Invoice & Delivery Notes for WooCommerce」を探し、一度「無効化」をクリックしてから「削除」を実行する。その後、改めて「プラグイン」→「新規追加」で同じプラグインを検索し、最新バージョンをインストールして有効化する。これで vendor ディレクトリ以下の Dompdf ライブラリが確実に揃う。

もしなんらかの事情で管理画面から削除できない場合は、FTP またはサーバーのファイルマネージャーを使って /wp-content/plugins/woocommerce-delivery-notes/ ディレクトリを丸ごと削除し、再度アップロードする。その際、ディレクトリ名やパーミッションが正しいことを確認しておく。

STEP 3 サーバー側のキャッシュをリセットする

PHP 8.2 環境では OPcache が有効になっており、古いクラスパスの情報がキャッシュに残っていると再インストール後もエラーが続く場合がある。レンタルサーバーの管理画面から PHP の OPcache をクリアするか、php.ini などで opcache_reset(); を一時的に実行する。また、nginx の fastcgi キャッシュを使っている場合はそちらも削除しておく。WordPress 側で WP Rocket や W3 Total Cache などのキャッシュプラグインを利用していれば、すべてのキャッシュを完全にクリアする。

❌ Before

管理画面で「印刷」を押すと「このサイトで重大なエラーが発生しました」と表示され PDF が生成されない

↓
✅ After

納品書や請求書の PDF が問題なく生成され、印刷も正常に動作する

■ エラー状態 ■ 修正後

STEP 4 納品書印刷を再度実行して検証する

WooCommerce の注文一覧から該当の注文を選び、「印刷」ボタンをクリックして PDF が開くことを確認する。もしこれでも同じエラーが出る場合は、別の PDF 出力系プラグイン(例 「PDF Invoices & Packing Slips for WooCommerce」など)との競合も疑い、それらを一時的に無効化して原因を絞り込む。Dompdf クラスを上書きするようなカスタマイズや、異なるドキュメント生成ライブラリが同じ名前空間を使っているケースでは、片方のプラグインを停止する必要がある。

キャッシュや競合プラグインの対処をもう少し深掘りする

キャッシュや競合プラグインの対処をもう少し深掘りする

OPcache の影響は想像以上に大きい。特に PHP のバージョンを上げたり、プラグインを一括更新したあとは、古いオートロードマップが残ってしまい、クラス不存在のエラーが続くことがある。サーバーが共用の場合でも、管理パネルに「PHP 設定」「PHP 再起動」などの項目があればそこから OPcache をクリアするか、何もなければレンタルサーバー会社のサポートに依頼する。

また、Kinsta や WP Engine のようなマネージドホスティングでは独自のキャッシュレイヤーを持っているため、管理画面のキャッシュクリア機能を使ってオブジェクトキャッシュやページキャッシュを完全に削除する必要がある。自前で nginx の fastcgi_cache を組んでいる場合は、fastcgi_cache_path のディレクトリを空にするか、キャッシュ無効化のパラメータを追加してから再度有効化する。

複数の PDF プラグインが有効になっていると、同じ Dompdf ライブラリを異なるバージョンで読み込もうとしてクラス衝突が起きることもある。このプラグインのバージョン 7.2.0 が特に最新の Dompdf に追従していない場合、他のプラグインが読み込んだ後に自前のオートローダーが正しいパスを指せず、今回のエラーになる。こうしたケースでは、問題のプラグイン以外の PDF 関連プラグインをすべて無効化し、一つずつ原因を特定していく。最悪の場合は代替プラグインへの乗り換えも選択肢になる。

よくある質問

プラグインを再インストールしても直らない場合は?

管理画面の「ツール」→「サイトヘルス」でループバックリクエストのエラーや REST API の異常がないかを確認する。Ajax 通信自体がブロックされていると Dompdf の読み込み以前に失敗する。また、サーバーのエラーログで open_basedir 制限や disable_functions の影響が出ていないかもチェックする。

一括印刷は動くのに単票だけ失敗する理由は?

一括印刷は admin-post.php 経由か、直接テンプレートを呼び出す仕組みで動いており、admin-ajax.php を使う単票印刷とは異なるコードパスになる。結果としてオートローダーの読み込みタイミングが変わり、エラーが出たり出なかったりする。根本的には再インストールで解消するが、どうしても直らなければプラグインの設計上の不具合の可能性もある。

エラーログに Dompdf のクラスがないと出るが、ファイルはサーバーに存在している

FTP などで /wp-content/plugins/woocommerce-delivery-notes/vendor/dompdf/dompdf/src/Options.php が実在するのにエラーが出る場合、PHP の OPcache か、nginx のファイルキャッシュが古い状態を返している可能性が高い。OPcache の再起動やサーバーキャッシュのクリアで直ることがほとんどだ。それでも変わらないときは、ファイルのパーミッションが読み取り不可になっていないかも確認する。

ほかの PDF プラグインと同時に使えるか?

同じ Dompdf を内部で使うプラグイン同士は、名前空間の解決順序によってクラスが見つからなくなるリスクがある。実際に複数の PDF 出力系プラグインを有効にしている場合は、トラブルシューティングのために一度すべて無効化し、必要なものだけを再び有効化することを推奨する。

PHP のバージョンを上げた後に起きたが関係あるか?

PHP 8.2 以上ではクラス自動読み込みの挙動が厳格になり、以前は暗黙的に読めていたファイルが読めなくなることがある。プラグインが最新バージョンで PHP 8.2 に対応しているかどうかを開発元の Tyche Softwares のドキュメントで確認し、対応済みであれば再インストールで問題は解消する。

この記事のポイント

  • 致命的エラーは Dompdf ライブラリのクラスが読み込めないことが原因
  • プラグインをいったん完全に削除し、最新版を再インストールするのが最も確実
  • サーバーの OPcache や各種キャッシュを必ずリセットする
  • 複数の PDF プラグインの同時利用が競合を引き起こしている可能性も疑う
  • 一括印刷が動作していても単票でのエラーは起こり得る
WooCommerce 10.9で「あとで買う」「ほしいものリスト」が実験搭載

WooCommerce 10.9で「あとで買う」「ほしいものリスト」が実験搭載

WooCommerce 10.9が2026年6月にリリースされ、ログイン顧客向けの実験的なショッピングリスト機能「Shopper Lists」が導入された。カート画面に表示される「あとで買う(Save for Later)」と、商品ページに追加される「ほしいものリスト(Wishlists)」の2機能が含まれている。

いずれもデフォルトでは無効化されており、店舗運営者が明示的にオンにして使うオプトイン方式だ。今回は WooCommerce のブロックベースショッピング体験を前提に設計されており、従来のショートコードベースの店舗では動作が保証されない点に注意が必要だ。

両機能は同じ Shopper Lists バックエンドを共有しており、今回の実験リリースを経て、将来的にはさらに多くのリスト系機能へ拡張される可能性がある。

2つのショッピングリスト機能の詳細

2つのショッピングリスト機能の詳細

Save for Later(あとで買う)

「Save for Later」はカートブロックの各商品行に「あとで買う」というアクションを追加する。ログイン顧客がこのボタンを使うと、その商品はカートから取り除かれ、カートブロックの下部に新設された「あとで買う」セクションへ移動する。

顧客はあとで買うセクションから商品をカートに戻したり、リストから削除したりできる。バリエーション商品(サイズや色を選択する商品)の場合、選択済みの属性情報が保持されるため、「どのサイズを保存したか」をあとで確認できるのが実務上の利点だ。

従来のカート(Before)
Tシャツ(Mサイズ) ¥2,980 数量 1
購入する か 削除する の二択しかない
購入する 削除
※「迷っている商品」を置いておく場所がない
↓
Save for Later 導入後(After)
カート内
マグカップ ¥1,200 購入する
あとで買うセクション
Tシャツ(Mサイズ) ¥2,980 カートに戻す 削除

現時点ではカートブロックのみ対応で、ミニカートには未対応。WooCommerce 開発チームの発表によれば、ミニカート対応は今回の実験リリースのスコープ外とされている。

Wishlists(ほしいものリスト)

「Wishlists」は Add to Cart with Options ブロックを使っている商品ページに「ほしいものリストに追加」ボタンを表示する。単純商品だけでなく、選択済みのバリエーション商品も保存できる。

保存した商品はマイアカウントの「ほしいものリスト」セクションから一覧表示され、そこからカートへの移動や削除が可能だ。店舗運営者は Wishlist ブロックを任意の固定ページに配置することで、顧客が自分専用のほしいものリストページを持てるようになる。

Wishlists のデータフロー
顧客 商品ページで「ほしいものリストに追加」をクリック
↓
WooCommerce Store API 経由で shopper-lists に保存
↓
顧客 マイアカウント > ほしいものリスト で確認
↓
顧客 「カートに追加」または「削除」を選択

技術的基盤

技術的基盤

Save for Later と Wishlists は、どちらも同一の Shopper Lists バックエンドを土台にしている。Store API、Interactivity API ストア、共有データ構造の3層で構成されており、今後のリスト系機能追加を見据えた拡張性の高い設計だ。

共有 Store API エンドポイント

両機能のデータ操作は、すべて以下の共通エンドポイント群を通じて行われる。

/wc/store/v1/shopper-lists/

Store API は WooCommerce のブロックベースショッピング体験を支える REST API 層で、カートやチェックアウト、商品データの取得を担う。今回の Shopper Lists 実装により、この API 層にリスト操作の機能が追加された形だ。

Developer WooCommerce Blog の発表によると、この API 表面はメイン機能マージ(#65263)で導入され、Wishlist ボタンは Add to Cart with Options ブロックへのレンダリング時注入(#65765)によって復帰したとされている。

Interactivity API との統合

Interactivity API は WordPress 6.5 で導入された、ブロックにインタラクティブなフロントエンド動作を追加するための公式 API だ。Shopper Lists では、カートブロック内での「あとで買う」への移動や、商品ページでの「ほしいものリストに追加」といった操作が、ページ遷移なしで即座に反映される。

この API を利用することで、従来の WooCommerce で課題だった「操作のたびにページ全体がリロードされる」問題が解消され、顧客体験が大きく向上する。とくに商品数が多い店舗では、体感速度の差が顕著になるだろう。

機能の有効化手順

機能の有効化手順

これらの機能はカートの挙動、商品ページの表示、マイアカウント、ブロックテンプレート、ログイン顧客データ、Store API との通信と、多岐にわたる領域に影響を与える。そのため WooCommerce チームは「本番環境ではなく、ステージング環境かローカルテストサイトで検証してほしい」と呼びかけている。

有効化に必要な条件

  • WooCommerce 10.9.1 以降がインストールされていること
  • ステージング環境またはローカルのテストサイトであること
  • カートページが Cart ブロックで構築されていること
  • 商品詳細ページのテンプレートが Add to Cart with Options ブロックを使用していること
  • テスト用の顧客アカウントが用意されていること

設定手順

管理画面の WooCommerce > 設定 > 高度な設定 > 機能 に移動し、以下の2つの実験的機能を有効化するだけだ。

  • Save for Later in Cart(カート内のあとで買う)
  • Wishlists(ほしいものリスト)

テスト用の商品構成としては、単純商品を1点以上、選択式属性を持つバリエーション商品を1点以上用意しておくと、両機能の動作を網羅的に確認できる。

テストすべきポイント

テストすべきポイント

WooCommerce チームはデベロッパーや制作会社、店舗構築者に対し、実際の店舗構成に近い環境でのフィードバックを求めている。とくにカスタマイズされたブロックテンプレートや多数の拡張機能を導入したサイトでの動作報告が重視されている。

Save for Later のテスト項目

  • カート内の商品に対して「あとで買う」ボタンが表示されるか
  • ボタン押下後、商品が「あとで買う」セクションに正しく移動するか
  • バリエーション商品の選択属性(サイズや色)が保持されているか
  • 「カートに戻す」で商品がカートに復帰するか
  • 「削除」でリストから消えるか

Wishlists のテスト項目

  • 商品ページに「ほしいものリストに追加」ボタンが表示されるか
  • 単純商品とバリエーション商品の両方が保存できるか
  • マイアカウント > ほしいものリスト に保存商品が正しく表示されるか
  • ほしいものリストからカートへの移動が正常に動作するか
  • Wishlist ブロックを任意の固定ページに配置して表示できるか

無効化時のクリーンアップ確認

両方の実験的機能を無効化したあと、カート、商品ページ、マイアカウントを再訪問し、Shopper Lists の UI が完全に消えるかを確認する必要がある。無効なブロックが残ったり、テンプレート出力が崩れたりしないことが、安定版への移行条件のひとつになる。

テストフロー概要
STEP 1 ステージング環境に WooCommerce 10.9.1 以降をインストール
↓
STEP 2 両方の実験的機能を有効化し、テスト商品と顧客アカウントを準備
↓
STEP 3 Save for Later と Wishlists の全操作を顧客目線でテスト
↓
STEP 4 機能を無効化し、UI が完全に消えることを確認
■ STEP 1(青) ■ STEP 2(緑) ■ STEP 3(橙) ■ STEP 4(紫)

実務への影響と今後の展望

実務への影響と今後の展望

Shopper Lists の登場は、WooCommerce 店舗における顧客維持の選択肢を大きく広げる。従来の「その場で買うか、離脱するか」という二択から、「いったん保存して後日判断する」という選択肢が加わることで、カート放棄率の低減につながる可能性がある。

とくにアパレルや家具など、購入までに検討期間が長い商材を扱う店舗にとっては、ほしいものリスト機能の価値は高い。顧客が複数回にわたって同じ商品を閲覧する行動パターンがある場合、リスト保存によってコンバージョンまでの導線が短縮される。

ただし現時点では実験的機能であり、本番環境での利用は推奨されていない。カスタマイズされたブロックテーマや拡張機能との競合が発生する可能性があるためだ。WooCommerce チームが特に求めているのは、まさにそうした「実店舗に近い複雑な環境」でのテスト報告である。

フィードバックは Developer WooCommerce Blog の該当記事コメント欄、または GitHub ディスカッション(#66038)で受け付けている。制作会社やデベロッパーにとっては、正式リリース前に自社のクライアント店舗との相性を把握できる貴重な機会といえる。

この記事のポイント

  • WooCommerce 10.9 が Shopper Lists 機能を実験的に導入した
  • 「Save for Later」はカートブロックに商品を一時保存する機能
  • 「Wishlists」は Add to Cart with Options ブロックと連携するほしいものリスト
  • 両機能はデフォルト無効で、管理画面の「高度な設定 > 機能」から有効化する
  • 本番環境ではなくステージング環境でのテストが強く推奨されている
PayPal Standard終了、WooCommerce事業者が知るべき移行の全容

PayPal Standard終了、WooCommerce事業者が知るべき移行の全容

PayPal Standard終了がもたらすWooCommerce決済の転換点

PayPal Standard終了がもたらすWooCommerce決済の転換点

WooCommerceで長年使われてきたPayPal Standardが、2026年6月に正式に役目を終える。PayPal Payments 4.1.0のリリースに伴い、条件を満たすと自動的に無効化され、管理画面からも非表示になる仕組みだ。すでにPayPal Standardを使っている場合でも、すぐに決済が止まるわけではない。しかし移行計画を立てるべきタイミングが来たことは間違いない。

WooCommerce Developer Blogの記事によれば、この動きは突然の発表ではない。2021年から段階的に縮小されてきた流れの最終段階にあたる。今回のアップデートでは、事業者の操作ミスを防ぎつつ、定期購入(サブスクリプション)の継続性を守る配慮が組み込まれている。

本記事では、PayPal Standard終了の背景、PayPal Payments 4.1.0の具体的な動作、移行を安全に進めるツールの使い方、そしてなぜこの変更が事業者にとってプラスになるのかを整理する。

従来の決済体験(PayPal Standard)
外部サイトへ遷移 → 離脱リスク高
カスタマイズが難しく、最新機能に非対応
↓
新しい決済体験(PayPal Payments)
サイト内で完結 → 離脱防止
Pay Later・Venmo・カード入力に対応し、継続的に改善

上の図は、決済フローがどう変わるかの概念を示したものだ。外部サイトへの遷移がなくなるだけで、購入完了率は大きく変わる可能性がある。

これまでの経緯とPayPal Standard廃止の必然性

これまでの経緯とPayPal Standard廃止の必然性

2021年から始まった段階的縮小

WooCommerceがPayPal Standardを新規店舗向けに非表示にし始めたのは2021年7月のことだ。WooCommerce 5.5では、コアに同梱されていた決済ゲートウェイが新規インストール時にデフォルトで読み込まれなくなり、必要ならばフィルターで再有効化する形に切り替わった。

このフィルターと同梱ゲートウェイ自体が完全に削除されたのはWooCommerce 8.9(2024年5月リリース)である。これ以降、PayPal Standardは「古い設定が残っている店舗」か「回避策のプラグイン」でしか生き延びられなくなっていた。今回のPayPal Payments 4.1.0は、その残存ケースを安全にアップグレードへ誘導する最終段階だ。

なぜこのタイミングなのか

PayPal StandardはAPIの進化に追随できない状態が続いていた。PayPal側が提供する最新のコンバージョン向上施策(Pay Later、Venmo、カード直接入力フィールドなど)を利用するには、PayPal Paymentsへの移行が不可避だった。事業者の売上機会を損なわないためにも、古い統合方式を整理する判断は合理的といえる。

PayPal Payments 4.1.0が実際に行うこと

PayPal Payments 4.1.0が実際に行うこと
STEP 1 PayPal Payments 4.1.0へアップデートするだけでは何も変わらない
↓
STEP 2 事業者がPayPalアカウントをPayPal Paymentsに接続する(ここがトリガー)
↓
STEP 3 PayPal Standardが自動的に無効化され、チェックアウト画面から消える
↓
STEP 4 ただし有効な定期購入がある場合は、例外的にPayPal Standardが維持される

上記の流れで最も重要なのは、アップデート自体が自動的に何かを変えるわけではない点だ。事業者が自らアカウント接続を行うまでは、従来のPayPal Standardはそのまま動作し続ける。

サブスクリプション保護の設計

WooCommerceの開発チームは、特に継続課金への影響を慎重に設計している。店舗に「アクティブ」または「キャンセル保留中」の定期購入が存在し、それがPayPal Standardで稼働している場合、プラグインはそれを検知し、無効化をスキップする。購読者は引き続き請求を受け、事業者には「影響を受けるサブスクリプションの数と所在」が通知される仕組みだ。

この「まず守る、その後に通知する」という順序は、事業者の売上を止めないための実務的な配慮といえる。移行操作を急ぐあまり、課金が途切れるリスクを負う必要はない。

アップグレード準備ツールで事前確認を徹底する

アップグレード準備ツールで事前確認を徹底する
アップグレード準備ツールがチェックする項目
現在のPayPal統合方式 ← StandardかPaymentsか
バージョンの新しさ ← 古いままだと競合が発生する可能性
既知の競合 ← 他のプラグインとの相性問題
サブスクリプションの有無 ← 定期購入の追加注意が必要か
■ 統合方式 ■ バージョン ■ 競合 ■ 定期購入
↓
結果に基づく安心材料
読み取り専用でサイトに変更を加えない
問題があればサポートへ詳細を直接送信できる
自分で移行するか、サポートに任せるかを選べる

長期運用してきた店舗ほど、設定変更に対する不安は大きい。このツールはWordPress管理画面から操作でき、サイトには一切の変更を加えない読み取り専用設計だ。事前に「移行がどの程度スムーズに進むか」を把握してから行動に移せる点が最大の強みとなる。

なぜPayPal Paymentsへの完全移行が好機なのか

なぜPayPal Paymentsへの完全移行が好機なのか

現代のオンライン購入者は、決済ステップでのストレスにきわめて敏感だ。サイトから離れずに支払いを完了できるかどうかが、コンバージョン率を大きく左右する。PayPal Paymentsは、まさにこの「離脱させない体験」を軸に設計されている。

単一プラグインで得られる最新機能群

Pay Later(後払い)、Venmo(米国向け送金・支払いサービス)、カード情報の直接入力フィールドといった機能は、PayPal Standardでは利用できなかった。これらはすべて、単一のプラグインで管理できる。PayPalのAPI変更やWooCommerceのアップデートにも同期してメンテナンスされるため、事業者が個別に対応する手間は大幅に減る。

コアからの分離で保守性が向上

WooCommerce 8.9以降、PayPal Standardはコアに戻る道を完全に断たれた。これは一見すると制約に感じるが、実際には「今後改善されない古いコードに依存し続けるリスク」を取り除く意味がある。PayPal Paymentsに集約することで、決済まわりのコードベースはシンプルになり、トラブルシューティングもしやすくなる。

PayPal Standard利用者が今すぐ着手すべき3つのアクション

  • アップグレード準備ツールを実行し、現状のPayPal統合方式と注意点を把握する
  • WooCommerce用のPayPal Paymentsプラグインをインストールし、事業者アカウントを接続する
  • 定期購入を販売している場合、またはツールの結果に不明点があれば、WooCommerceサポートに相談する

アカウント接続が完了すれば、PayPal Standardからの移行はプラグインが安全に処理してくれる。人の手で設定を削除したり、手動で切り替えたりする必要はない。ツールの結果を踏まえて、確実に行動に移すことが重要だ。

この記事のポイント

  • PayPal Standardは2026年6月のPayPal Payments 4.1.0で役目を終え、条件を満たすと自動無効化される
  • アップデートだけでは何も変わらず、事業者が自らアカウントを接続するまでは安全に動作し続ける
  • 有効な定期購入がある場合は無効化がスキップされ、売上停止のリスクを回避する設計になっている
  • アップグレード準備ツールを使えば、サイトに変更を加えずに移行の準備状況を事前確認できる
  • PayPal Paymentsへの集約により、最新のコンバージョン機能と継続的なAPI同期の恩恵を受けられる