タグアーカイブ WordPress

Rank MathでWooCommerceモジュールが開けない時の原因と対処法

Rank MathでWooCommerceモジュールが開けない時の原因と対処法

Rank MathのWooCommerceモジュールがグレーアウトして切り替えられない場合、原因はプラグインのデータベースマイグレーションが完了していないことにある。管理画面に表示されるデータベースバージョンが初期値の1のままなら、まずキャッシュの全削除とメモリ上限の確認を行い、その上で不要オプションを削除して再マイグレーションを発生させる。

なぜWooCommerceモジュールだけがロックされるのか

なぜWooCommerceモジュールだけがロックされるのか

Rank Mathは各機能をモジュール単位で管理している。WooCommerceモジュールもその一つで、商品の構造化データや詳細設定をまとめて扱う。ところがこのモジュールは、プラグインのデータベーススキーマが特定のバージョン以上になった時だけ有効化できる仕組みだ。

管理画面のステータス情報で「database_version」がいつまでも初期値の1のままだと、WooCommerceモジュールを含む一部の機能が「未導入」と判断されたままになる。トグルにマウスを重ねると「Please activate WooCommerce to use this module」という趣旨のツールチップが表示されるが、WooCommerce本体が有効化されていてもこのエラーは出る。

つまり、WooCommerceの有効・無効が問題なのではなく、Rank Math側のデータベース情報が古いまま更新されていないことが本質のトラブルだ。

database_versionが1のまま進まない主な原因

database_versionが1のまま進まない主な原因

Rank Mathのインストール時やセットアップウィザード実行時、プラグイン内部でデータベーステーブルの作成とデータ移行が走る。この処理が最後まで到達しないと、バージョン情報が初期値の1から更新されない。具体的な原因は大きく三つに分けられる。

キャッシュプラグインが古いオプションを保持している

WP Super Cacheに代表されるキャッシュプラグインは、ページ表示を高速化するために一時データを保持する。まれにデータベースのオプション情報まで古い状態のまま配信することがあり、これが原因でRank Mathのバージョン情報が更新されないケースがある。

PHPメモリ上限が低くマイグレーションが途中で止まる

WooCommerceサイトは通常のWordPressサイトより管理画面のメモリ消費が大きい。Elementorや高機能テーマも動いている場合、PHPのメモリ上限を超えてRank Mathのデータベース処理が途中で終了してしまうことがある。具体的にはwp-config.phpで定義されたWP_MEMORY_LIMITが40M程度だと、重い環境では不足しやすい。

rank_math_db_versionオプションが破損している

WordPressのオプションテーブル(wp_options)には、Rank Mathが利用する複数のオプションが保存されている。このうち「rank_math_db_version」という値が破損したり、不正な状態で固定されたりすると、セットアップウィザードを再実行しても値が更新されない。

モジュールロックを解除する具体的な手順

モジュールロックを解除する具体的な手順

以下の手順は、データベースバージョンが初期値から更新されない場合に有効だ。順に実行することで、Rank Mathのマイグレーションが正常に走り、WooCommerceモジュールのロックが外れる。

STEP 1 キャッシュプラグインを停止し全キャッシュを削除する
↓
STEP 2 wp-config.phpでWP_MEMORY_LIMITを128M以上へ引き上げる
↓
STEP 3 rank_math_db_versionオプションをデータベースから削除する
↓
STEP 4 Rank Mathのセットアップウィザードを再度実行してWooCommerceモジュールを確認する
■ STEP 1  ■ STEP 2  ■ STEP 3  ■ STEP 4

このデモは、Rank Mathのデータベースバージョンを固定している原因を取り除き、マイグレーションを再実行させる流れを示している。

キャッシュを完全に無害化する

管理画面のプラグインページでWP Super Cacheを一時的に無効化する。次に「設定」→「WP Super Cache」からキャッシュの削除を実行し、サーバー上のwp-contentディレクトリにあるcacheディレクトリ内のファイルも手動で削除しておく。

共有サーバーで管理画面から操作できない場合は、FTPソフトでwp-content/cacheに入り、中身を空にする。キャッシュを消した後は、ブラウザのキャッシュも混ざらないようシークレットウィンドウで確認すると確実だ。

WP_MEMORY_LIMITを引き上げる

FTPまたはサーバーのファイルマネージャーでwp-config.phpを開き、WP_MEMORY_LIMITの定義を探す。設定されていなければ「/* That’s all, stop editing! */」の直前に以下の行を追加する。

define( 'WP_MEMORY_LIMIT', '128M' );

すでに40Mなど低い値が指定されている場合は、128Mまたは256Mに書き換える。変更後にWordPress管理画面の「ツール」→「サイトヘルス」からPHPのメモリ上限が更新されているか確認できる。

rank_math_db_versionオプションを直接削除する

サーバーのphpMyAdminにアクセスし、該当サイトのデータベースを選択する。wp_optionsテーブルを開き、option_nameが「rank_math_db_version」の行を探して削除する。

SQLを直接実行できる環境なら、次のようにしても同じ結果になる。

DELETE FROM wp_options WHERE option_name = 'rank_math_db_version';

テーブルの接頭辞がwp_以外の場合は、実際の接頭辞に置き換える。削除後、Rank Mathの管理画面を開くとマイグレーションが自動的に再実行され、正常ならデータベースバージョンが初期値より大きい値に更新される。

rank_math_modulesオプションも削除する

rank_math_db_versionを削除してもWooCommerceモジュールがロックされたままの場合、rank_math_modulesというオプションも同様に削除する。この値には有効化済みモジュールのリストが保存されており、破損しているとモジュールの出し分けが正常に機能しない。

DELETE FROM wp_options WHERE option_name IN ('rank_math_db_version', 'rank_math_modules');

この二つを削除した後、Rank Mathのセットアップウィザードを「詳細モード」で最後まで実行する。WooCommerceモジュールのトグルが青くなり、切り替え可能になっていれば成功だ。

それでも直らない場合の最終確認

それでも直らない場合の最終確認

データベースユーザーにテーブル作成権限があるか

Rank Mathのマイグレーションは、専用のテーブル(rank_math_analytics_objectsなど)を作成してデータを保存する。データベースユーザーに「CREATE TABLE」権限がないと、処理が裏側で失敗し続ける。レンタルサーバーの管理画面からデータベースユーザーの権限を確認し、不足していれば付与する。

重いプラグインを停止してからもう一度

ElementorやSlider Revolutionなど、管理画面の動作を重くするプラグインがマイグレーションを妨げている可能性がある。Health Check & Troubleshootingプラグインのトラブルシューティングモードを使い、Rank MathとWooCommerceだけを有効化した状態で手順をもう一度試す。

Rank Mathのデータベースツールでテーブルを作り直す

Rank Mathの管理画面から「ステータスとツール」→「データベースツール」を開く。「テーブルを作り直す」や「データベースを修復」といったボタンが用意されているので、順に実行してテーブルの再作成とデータの再構築を行う。

その後、もう一度セットアップウィザードを完了させ、データベースバージョンの値が更新されるかを確認する。それでも値が1のままなら、プラグインのアップデート待ちか、サーバー環境固有の制約が残っている可能性が高い。

よくある質問

トグルをクリックしても何も反応しないのはなぜ?

WooCommerceモジュールがロックされていると、トグル自体がグレーアウトした状態になる。クリックしても切り替わらず、ツールチップだけが表示される。これは操作ミスではなく、Rank Math内部でモジュールが使えない状態として認識されているためだ。

WooCommerce本体が壊れている可能性はある?

WooCommerceがプラグインページで有効化されており、商品管理やカートなど通常機能が動いているなら本体は正常だ。今回の問題はRank Math側のデータベース情報が古いことが原因なので、WooCommerceを再インストールしても解決しない。

Rank Mathを削除して入れ直しても直らないのはなぜ?

プラグインを削除しても、wp_optionsテーブルに保存されたオプションは残る。再インストール時に古いオプションを読み込んでしまい、同じ状態が再現される。必ずデータベースからrank_math_db_versionを削除してから再インストールする必要がある。

キャッシュプラグインは原因になりうる?

WP Super Cacheなどのキャッシュプラグインはページキャッシュが主体だが、環境によってはデータベースの一時情報も保持することがある。Rank Mathのバージョン情報が更新されない状態が続くなら、キャッシュプラグインを停止して切り分けるのが有効だ。

セットアップウィザードは毎回完了しているのに直らない

ウィザード自体は設定画面を進めるだけで、データベースのマイグレーションは別プロセスで走る。マイグレーションが裏側で失敗していると、ウィザード完了後もdatabase_versionが1のままになる。オプション削除とメモリ上限の引き上げを先に行うことが重要だ。

この記事のポイント

  • WooCommerceモジュールのロックはRank Mathのデータベースバージョンが原因
  • database_versionが1のままならマイグレーションが未完了
  • キャッシュ削除とWP_MEMORY_LIMITの引き上げを先に行う
  • rank_math_db_versionとrank_math_modulesオプションを直接削除して再実行
  • テーブル作成権限の確認と重いプラグインの停止も有効
WPLP Cookie Consent脆弱性を狙った攻撃からWordPressを守る3つの対策

WPLP Cookie Consent脆弱性を狙った攻撃からWordPressを守る3つの対策

Cookie同意プラグイン「WPLP Cookie Consent(スラッグ gdpr-cookie-consent)」のバージョン4.4.1以前には、未認証の攻撃者に任意のファイルをアップロードされる脆弱性がある。サイトを守るには、プラグインを4.4.2以上へ更新し、アップロードディレクトリ内でのPHP実行をサーバー側で拒否し、不正な管理者アカウントが作られていないか確認することが最優先だ。

なぜWPLP Cookie Consent 4.4.1が危険なのか

なぜWPLP Cookie Consent 4.4.1が危険なのか

この脆弱性は、プラグインのREST APIエンドポイントに認可の不備があることから発生する。攻撃者は誰でもアクセスできる2つのエンドポイントを悪用し、WordPressのオプション設定を書き換えたうえで、任意のファイルをサーバーに保存できる。特に問題なのが、保存先が通常のアップロードフォルダ(wp-content/uploads)であり、ファイル名や拡張子の検証がまったく行われていなかった点だ。

つまり攻撃者は「画像ファイルに見せかけたPHPプログラム」をサイトに置くだけで、その後の実行に成功すれば管理者権限を奪取できる。バージョン4.4.1は攻撃が確認された時点で最新版だったため、更新を怠っていたサイトだけでなく、常に最新にしていたサイトも危険にさらされた。修正版の4.4.2が公開されてからは、この経路は塞がれているが、攻撃キャンペーンがすでに自動化されて動いている以上、更新前のサイトは今も標的になる。

攻撃の流れと侵入の仕組み

攻撃の流れと侵入の仕組み

実際に確認された攻撃は、わずか20秒足らずで4段階のプロセスが自動実行される。最初にユーザー一覧を取得して管理者のユーザー名を特定し、次にプラグイン固有のオプションを毒して鍵をすり替え、最後にその鍵を使ってファイルを書き込む。下の図はその一連の流れを表している。

STEP 1 REST APIでユーザー一覧を取得される
↓
STEP 2 store-authエンドポイントでオプションを改ざん
↓
STEP 3 upload-logoエンドポイントでPHPファイルを書き込み
↓
STEP 4 書き込んだPHPを実行しようとするがサーバー側のルールでブロック
■ 攻撃者の操作 ■ 防御策が機能した部分

この攻撃チェーンのうち、最初の3段階は特定のプラグインがなければ成立しない。一方で、最後のPHP実行だけはサーバー側の設定次第でどのサイトでも防げる。ここが多層防御の要になる。

まず行う3つの緊急対応

まず行う3つの緊急対応

サイトがこの脆弱性の影響を受けるかどうかに関係なく、次の3つを優先して実行する。順番はプラグインの更新、サーバー設定の確認、不正アカウントの確認が推奨される。

プラグインを4.4.2以上へ更新する

WPLP Cookie Consent(gdpr-cookie-consent)を使っている場合、まず管理画面の「プラグイン」から更新が来ていないか確認する。更新が見つからない場合は、WordPress.orgのプラグインページから最新版を手動でダウンロードし、既存のプラグインを上書きする。バージョン4.4.2では、脆弱性の原因だったアップロード用エンドポイントが削除され、残ったREST APIにもHMAC-SHA256署名によるリクエスト検証が追加されている。

更新後は、キャッシュ系プラグインを使っている場合はキャッシュを削除しておく。古いRESTエンドポイントの応答がキャッシュに残っていると、攻撃者からまだ有効に見えることがあるためだ。

アップロードディレクトリ内でのPHP実行を拒否する

今回の攻撃では、脆弱なプラグインによって「wp-content/uploads」ディレクトリにPHPファイルが書き込まれた。しかし、そのディレクトリ内でのPHP実行がサーバー側で拒否されていたため、攻撃は最終段階で失敗している。この設定は多くのレンタルサーバーで最初から有効になっているが、そうでない環境もある。

Apacheサーバーの場合、wp-content/uploads ディレクトリに以下の内容の .htaccess ファイルを置くことで、PHPファイルの実行を拒否できる。

<FilesMatch "\.(php|php5|phtml)$">
  Require all denied
</FilesMatch>

Nginxの場合は、サーバー設定で該当ディレクトリに対するPHPの処理を除外する。レンタルサーバーを利用しているなら、管理パネルに「PHP実行の無効化」や「セキュリティ設定」が用意されているか確認する。設定を変更できない場合は、サーバー会社に問い合わせて、アップロードディレクトリ内のPHP実行がブロックされているか確認するのが確実だ。

修正前
wp-content/uploads 内で PHP ファイルが実行可能
→ アップロードされたPHPが実行され、サイトが乗っ取られる
↓
修正後
wp-content/uploads 内で PHP ファイルの実行を拒否
→ アップロードされても実行されず、攻撃が失敗する
■ 危険な状態 ■ 安全な状態

上の対比のように、ファイルが置かれても実行できなければウェブシェルとして機能しない。プラグインの更新とあわせて、このサーバー側の防御を必ず確認する。

不正な管理者アカウントを探す

今回確認されたマルウェアは、実行に成功すると管理者アカウントを自動生成する。しかも、登録日時を既存ユーザーの日時に合わせて改ざんするため、「新しく作られたユーザー」を探すだけでは見つからない。次の3つの兆候を手がかりに、phpMyAdminやWP-CLIで WordPress の wp_users テーブルを確認する。

  • ユーザー名が「サイトのドメイン名+ランダム3文字」になっている
  • 表示名が「Lucas Hayes」になっている
  • メールアドレスのドメインが ifuqpatr.com になっている

心当たりのない管理者アカウントを見つけたら、そのユーザーを削除し、全ユーザーのパスワードをリセットする。また、登録日時が既存ユーザーと完全に一致するアカウントがないかもあわせて確認する。

侵害を検知する具体的な手順

侵害を検知する具体的な手順

すでに攻撃を受けた形跡がないかは、ログとファイルの両面から確認する。攻撃が失敗していても、ファイルの残骸や不審なアクセスが残っていることが多い。

サーバーのアクセスログを精査する

攻撃者は決まったエンドポイントに順番にアクセスする。アクセスログで次のパターンを検索し、該当するリクエストが記録されていないか確認する。

  • GET /wp-json/wp/v2/users?per_page=100
  • POST /wp-json/wplp-react-gdpr/v1/store-auth
  • POST /wp-json/wplp-react-gdpr/v1/upload-logo

これらのリクエストがすべて記録されていれば、攻撃者がサイトに到達した証拠になる。アクセスログはサーバー会社の管理パネルや、レンタルサーバーのログ保存機能から取得できる。ログの保存期間が短いと痕跡が消えるため、普段から長めに保存する設定にしておくことが重要だ。

マルウェアスキャナーでファイルを検査する

サーバーに導入されているマルウェアスキャナーや、WordPress用のセキュリティプラグインを使って wp-content ディレクトリ全体をスキャンする。特に「*.jpg.php」のような二重拡張子のファイルや、最近改変されたPHPファイルが検出対象になる。

スキャナーは攻撃直後の未知のマルウェアを検出できないこともあるが、時間が経ってから見つかることも多い。複数のスキャナーを併用すると検出率が上がる。手動で確認する場合は、wp-content/uploads 以下のファイルで、画像に見せかけたPHPファイルが残っていないかを調べる。

テーマとプラグインの改ざんを確認する

攻撃者はすでに侵入に成功している場合、バックドアを別の場所に仕込んでいる可能性がある。アクティブなテーマの functions.php や、プラグインのディレクトリに不審なコードが追加されていないかを確認する。特に、難読化されたコードや、外部と通信する関数(file_get_contents、curl、eval など)が含まれている場合は注意が必要だ。

再発を防ぐための設定

再発を防ぐための設定

今回の攻撃は特定のプラグインに依存しているが、同種の攻撃は他のプラグインでも発生する。サイト全体の防御力を上げるために、次の設定を検討する。

REST APIのユーザー一覧取得をブロックする

攻撃の第一段階では、WordPress標準のREST APIからユーザー一覧を取得して管理者のユーザー名を特定している。このエンドポイントを無効化するか、ログイン済みユーザーに限定すれば、攻撃の難易度を上げられる。

子テーマの functions.php に次のコードを追加すると、未認証のユーザー一覧取得を防げる。

add_filter( 'rest_endpoints', function( $endpoints ) {
    if ( isset( $endpoints['/wp/v2/users'] ) ) {
        unset( $endpoints['/wp/v2/users'] );
    }
    return $endpoints;
} );

このコードはユーザー一覧のエンドポイントそのものを削除するため、ログイン中でも一覧を取得できなくなる。一部のプラグインがこの機能を使っている場合は影響を確認してから適用する。

アクセスログを長期間保存する

攻撃の痕跡は時間が経つと消える。サーバーのアクセスログを最低でも数週間、可能なら数ヶ月保存しておくと、侵害の調査や再発防止に役立つ。レンタルサーバーの標準設定では数日しか保存されないこともあるため、管理パネルやサーバー会社に確認して保存期間を延ばす。

プラグインの選定と更新ポリシーを見直す

Cookie同意プラグインに限らず、インストール数が少ないプラグインでも攻撃対象になる。更新が止まっているプラグインや、あまり知られていない開発元のプラグインを使い続ける場合は、代替手段を検討する。定期的にプラグインの更新を確認し、不要なプラグインは削除する。

よくある質問

WPLP Cookie Consentを使っていないが対策は必要か

今回の脆弱性はこのプラグイン固有のものだが、アップロードディレクトリでのPHP実行を拒否する設定や、REST APIのユーザー列挙対策はどのサイトでも有効な防御策になる。プラグインの更新とサーバー設定の見直しは、サイト全体のセキュリティを底上げする。

更新したのに攻撃された兆候が残っている場合はどうすればいいか

更新してもすでに設置されたマルウェアは消えない。不正な管理者アカウントの削除、マルウェアスキャン、テーマやプラグインの改ざん確認を行い、必要ならバックアップから復元する。確実なのは、クリーンなバックアップに置き換えて、全パスワードを再発行することだ。

アップロードディレクトリのPHP実行を拒否すると何か問題はあるか

通常のWordPressサイトでは、wp-content/uploads にPHPファイルを置く運用は推奨されていない。画像や文書の配信には影響しない。一部の特殊なプラグインやテーマがこの場所にPHPを置く場合は、事前に動作確認を行う。

REST APIを完全に無効化したほうがいいのか

完全な無効化は、ブロックエディタや一部の機能が動作しなくなるため現実的ではない。ユーザー一覧だけを狙ったエンドポイントを制限するか、認証を要求する設定が現実的な落とし所になる。

この記事のポイント

  • WPLP Cookie Consent 4.4.1以前には未認証でファイルをアップロードされる脆弱性がある
  • まずプラグインを4.4.2以上へ更新し、古いバージョンのままにしない
  • wp-content/uploads 内のPHP実行をサーバー側で拒否する
  • 不正な管理者アカウントがないか wp_users を確認する
  • アクセスログとマルウェアスキャナーで侵害の痕跡を調査する
WooCommerce 11.1でREST APIとStore APIが最大42%高速化。ブロック登録スキップの仕組み

WooCommerce 11.1でREST APIとStore APIが最大42%高速化。ブロック登録スキップの仕組み

WooCommerce 11.1がブロック登録の仕組みを大きく変更する。REST APIとStore APIのリクエストが従来より13〜18ミリ秒、割合で30〜42%速くなる見込みだ。

これまでWooCommerceはほぼすべてのリクエストでブロックタイプとパターンを登録していた。画面にブロックを描画しないAPIリクエストでも同じ準備処理が走り、無駄なコストになっていた。

この記事では変更の背景と仕組み、影響を受ける開発者の条件、具体的な対応方法を解説する。11.1は正式リリース前の段階のため、エクステンションを配布している開発者は事前テストが求められる。

なぜブロック登録をスキップするのか

なぜブロック登録をスキップするのか

ほぼ全リクエストで発生していた無駄な処理

WooCommerceはこれまで、ブロックタイプとパターンをほぼすべてのリクエストで登録していた。商品データを返すだけのREST APIリクエストでも、カート情報を返すStore APIリクエストでも、ブロックを描画しないのに登録処理が実行されていた。

ブロック登録にはファイル読み込みやメタデータ解析が伴う。1リクエストあたりの負荷は小さくても、APIを多用する店舗やヘッドレスコマース構成では応答速度に影響する。WooCommerceチームは「リクエストはブロックを描画または編集できる場合にのみ、ブロック登録のコストを支払うべき」という方針を取った。

従来のリクエスト処理(Before)
全リクエスト ブロック登録を実行 → ブロック登録 → 本来の処理
↓
改善後のリクエスト処理(After)
REST API リクエスト ブロック登録を実行しない → 登録スキップ → 本来の処理

Beforeではすべてのリクエストがブロック登録を経由していた。Afterではブロックを描画しないAPIリクエストが登録処理を飛ばし、その分だけレスポンスが速くなる。

描画しないリクエストに課されるコスト

従来の挙動は、ブロックを編集も描画もしないリクエストまでブロックエディタの準備をさせるものだった。この無駄はアクセス数に比例して増える。とくにモバイルアプリやフロントエンドを別システムで構築し、WooCommerceをAPI経由で使う構成では影響が大きい。

今回の最適化は、APIリクエスト全体に占めるブロック登録のコストが想定以上に大きかったことを示している。13〜18ミリ秒の改善は体感的には小さいが、ピーク時に多数のリクエストを処理する店舗では合計の短縮効果が積み上がる。

11.0から11.1へ段階的に進めた変更

11.0から11.1へ段階的に進めた変更

11.0で導入したパターンの遅延読み込み

第一段階はWooCommerce 11.0で実装された。パターンがファイルパスで登録され、エディタから要求されたときだけ内容が読み込まれるようになった。WordPressコアと同じ挙動だ。ブロックを登録するリクエストごとに5〜8ミリ秒の節約が確認されている。

11.1のBlockRegistrationContextガード

11.1では新しいBlockRegistrationContextガードが追加された。このガードがリクエストを判定し、ブロックを描画しない場面ではブロックタイプとパターンの登録をまとめてスキップする。

商品説明を守るオンデマンド登録の例外

1つだけ例外がある。商品説明やバリエーション説明にWooCommerceブロックが含まれる場合、woocommerce_short_descriptionフィルター経由で必要なときにブロックタイプが登録される。これにより商品REST API、Store API、バリエーションAJAXエンドポイント、商品のWebhookでも説明が正しく描画される。

STEP 1 11.0でパターンの遅延読み込みを導入
↓
STEP 2 11.1でブロック登録をスキップするガードを追加
↓
STEP 3 Store APIとREST APIが13〜18ミリ秒、30〜42%高速化

2段階の変更により、パターン読み込みとブロック登録という2つの重い処理がAPIリクエストから外れた。完成した最適化の効果が30〜42%という数字に表れている。

対象リクエストと安全性の設計

対象リクエストと安全性の設計

スキップ対象と従来どおりのリクエスト

スキップされるのはブロックを描画しないリクエストのみだ。フロントエンド、管理画面、ブロックエディタ、サイトエディタのリクエストは従来どおりブロックを登録する。

見落としがあっても表示は壊れない

ガードは自身が認識したコンテキストだけをスキップする。認識できない場面では登録を継続するため、分類に漏れがあったとしても描画の後退にはつながらない。性能が少し落ちるだけで済む設計だ。

登録をスキップするリクエスト
REST API、Store APIなどブロックを描画・編集しない場面
従来どおり登録するリクエスト
フロントエンド、管理画面、ブロックエディタ、サイトエディタ
認識できないコンテキスト
登録を継続するため、表示が壊れることはない

この設計は保守性の面でも合理的だ。未知のリクエストに対して安全側に倒すため、WooCommerceの内部判断が変わっても既存サイトの表示が突然崩れるリスクを抑えられる。

開発者が確認すべき影響範囲

開発者が確認すべき影響範囲

影響を受けるエクステンションの条件

この変更はWooCommerce 11.1.0から適用される。スキップされるリクエスト中にWooCommerceブロックを描画するエクステンション、またはWooCommerceのブロックタイプ、パターン、ブロックごとのアセット登録に依存するエクステンションが影響を受ける。

スキップされた場面では、WooCommerceブロックは生のブロックマークアップか、動的出力のない静的なHTMLとして返る。テンプレートに直接ブロックを組み込んでいるエクステンションは、表示内容が変わらないか確認が必要だ。

コードで確認する方法

影響の有無はコードで確認できる。以下のコードはWooCommerce 11.1以降のスキップ対象リクエストでfalseを返す。

// WooCommerce 11.1以降、スキップされた場面では false を返す。
WP_Block_Type_Registry::get_instance()->is_registered( 'woocommerce/mini-cart' );

商品説明と自前ブロックは影響なし

商品説明とバリエーション説明はオンデマンドで処理されるため対応は不要だ。register_block_type()で自前登録しているブロックも影響を受けない。今回の変更はWooCommerce自身が行う登録だけが対象になる。

実務では「自前でブロックを登録しているか」「WooCommerceのブロック登録に依存しているか」の切り分けが重要になる。前者は今回の変更を意識する必要がなく、後者だけが対応を検討すればよい。

開発者が取るべき対応と正しいブロック作成

開発者が取るべき対応と正しいブロック作成

woocommerce_should_register_blocksフィルターで復帰

影響を受けるエクステンションは、新しいwoocommerce_should_register_blocksフィルターを使い、実際にブロックを描画するリクエストのときだけtrueを返す。

add_filter(
    'woocommerce_should_register_blocks',
    function ( $should_register ) {
        return my_context_renders_blocks() ? true : $should_register;
    }
);

フィルターはプラグイン読み込み時に実行され、メインクエリが解析される前の段階で呼ばれる。そのため条件には$_SERVERや$_GETなど、この初期段階で利用できる情報だけを使うことになる。

復帰させる範囲を絞りすぎるとブロックが見つからず表示が変わることがある。逆に広げすぎると今回の性能改善が失われる。描画が実際に発生するリクエストを正確に判定する条件を書くのが開発者の作業になる。

内部クラスAbstractBlockを避ける

WooCommerceはブロックをAbstractBlockという内部クラスの上に構築しないよう推奨している。内部クラスを継承すると、WooCommerceが下すすべての登録判断、今回のスキップも含めて引き継ぐことになる。

登録の最適化が進むにつれ、内部クラスのライフサイクルは今後も変わり続ける。依存すると将来のアップデートで予期しない挙動になる可能性が高い。

標準のWordPress Block APIを使う

サポートされる方法は標準のWordPress Block APIだ。ブロックをblock.jsonに定義し、init時にregister_block_type()で登録する。カートやチェックアウトの内部ブロックには@woocommerce/extend-cart-checkout-blockテンプレートがある。

WooCommerceの公式ドキュメントにあるスキャフォールディングとサンプルストアデータ、@wordpress/create-blockも出発点として適している。標準APIに沿って作れば、今後の最適化に追随しやすい。

正式リリース前の段階で、WooCommerceはエクステンション開発者に11.1へのテストを呼びかけている。とくに商品データやカート情報をAPIで扱う拡張を配布している場合は、早めの動作確認が安全だ。

この記事のポイント

  • WooCommerce 11.1はブロックを描画しないリクエストでブロック登録をスキップする
  • Store APIとREST APIは13〜18ミリ秒、割合で30〜42%高速化する
  • 商品説明や自前登録ブロックは影響を受けず対応不要
  • 影響を受ける場合のみ woocommerce_should_register_blocks フィルターで復帰させる
  • 内部クラスAbstractBlockではなく標準のWordPress Block APIでブロックを作る
カートページで数量を変更すると違う数になる時の対処法

カートページで数量を変更すると違う数になる時の対処法

WooCommerceのカートページで数量を1から2に変更したのに3が表示される不具合は、テーマまたはプラグインの古いJavaScriptが原因で数量更新のイベントが二重に処理されるケースが多い。まずテーマとWordPress本体・WooCommerceを更新し、それでも直らなければプラグインの競合を切り分けるのが最短の解決手順だ。

なぜカートページの数量変更で数がずれるのか

なぜカートページの数量変更で数がずれるのか

カートページで数量を変更すると、WooCommerceはAjax通信でサーバーに更新を送り、その結果を画面に反映する。このときブラウザ側のJavaScriptが「変更前の数量」と「変更後の数量」を正しく引き算して表示する仕組みになっている。

ところがテーマやプラグインが古いjQueryや独自のAjax処理を持っていると、同じクリックや入力イベントに対して数量加算の処理が2回走ることがある。たとえば「1を2に変更」が「1を3に変更」として解釈され、画面に3が表示される。

特に数量に小数を許可するプラグイン(WooCommerce Decimal Productなど)が有効な場合、数量フィールドの値の扱いが標準と変わるため、テーマ側のJavaScriptとの相性問題が表面化しやすい。プラグインを無効化すると正常になることから、原因がプラグイン単体でなく「プラグインとテーマの組み合わせ」にあると判断できる。

テーマとWordPressを最新版に更新する手順

テーマとWordPressを最新版に更新する手順

この不具合は、テーマ・WordPress・WooCommerceのいずれかが古いことで、最近のブラウザやプラグインとの間でJavaScriptの仕様差が生じるために起きることがある。まずは更新作業から始める。

STEP 1 サイト全体のバックアップを取る
↓
STEP 2 WordPress本体・テーマ・WooCommerce・全プラグインを更新する
↓
STEP 3 キャッシュプラグインのキャッシュを全削除する
↓
STEP 4 カートページで数量を変更して動作確認する

更新後はシークレットウィンドウや別ブラウザでテストする。通常のブラウザに古いCookieやキャッシュが残っていると、修正後も古いJavaScriptが動いてしまうためだ。

JavaScriptの競合を切り分ける手順

JavaScriptの競合を切り分ける手順

更新しても症状が変わらない場合、特定のプラグインやテーマのJavaScriptがWooCommerceの数量更新イベントと競合している。原因を特定するには「無効化テスト」が確実だ。

プラグインを1つずつ無効化して原因を特定する

まずプラグイン一覧から、数量に関係するプラグイン(小数プラグイン・カスタム数量プラグイン・Ajaxカートプラグインなど)を候補として絞り込む。それぞれ無効化してカートページを再読み込みし、数量が正しく更新されるか確認する。

もし特定のプラグインを無効化したときだけ正常になるなら、そのプラグインが原因だ。プラグインの更新版が出ていないか確認し、出ていなければ代替プラグインへの乗り換えを検討する。

ブラウザのコンソールでJavaScriptエラーを確認する

ブラウザのデベロッパーツール(ChromeではF12キー)を開き、「Console」タブを確認する。カートページで数量を変更したときに赤いエラーが表示される場合、エラーのファイル名から競合元を特定できる。

エラーメッセージが「jQuery is not defined」や「$ is not a function」なら、テーマのJavaScriptがjQueryを正しく読み込んでいない。wp_enqueue_script の順序や依存関係の問題なので、テーマ制作者に修正を依頼するか、子テーマ側で読み込みを調整する。

「cart-fragments」や「wc-cart-fragments」に関するエラーなら、WooCommerceのAjaxカート更新機能が別のプラグインと衝突している。該当プラグインを特定して無効化すれば症状は収まる。

キャッシュとCookieの影響を排除する

キャッシュとCookieの影響を排除する

修正後も古い表示が続く場合は、サーバー側のキャッシュとブラウザ側のCookieが原因で古いJavaScriptが読み込まれている可能性がある。キャッシュプラグイン(WP Super Cache、W3 Total Cache、LiteSpeed Cacheなど)のキャッシュを全削除し、ブラウザのCookieとキャッシュも消去してから再テストする。

また、CDN(Cloudflareなど)を利用している場合は、CDN側のキャッシュもクリアする。CDNが古いJavaScriptファイルを配信し続けると、サーバー上では更新済みでもブラウザには古いコードが届く。

よくある質問

数量が正しく更新されるか確認する方法は?

カートページで数量を複数回変更し、そのたびにカート内の小計と合計が正しく再計算されるかを確認する。加えて管理画面の「WooCommerce→ステータス→ログ」にJavaScript関連のエラーが記録されていないか確認するとよい。

テーマを更新しても大丈夫?

更新前にバックアップを取っていれば問題ない。カスタマイズをテーマ本体に直接書いている場合は、更新で消える可能性があるので、子テーマや独自プラグインに移してから更新するのが安全だ。

小数プラグインを使い続けながら直す方法は?

プラグイン自体に更新版がない場合は、テーマ側のJavaScriptを修正して競合を回避する必要がある。具体的にはカートページの数量更新をWooCommerce標準のAjax処理に任せるよう、テーマのcustom.jsやmain.jsから数量関連のコードを除去する。

テストサイトを作るべき?

本番サイトに影響を与えずに原因を切り分けたい場合は、ステージング環境(多くのレンタルサーバーに標準搭載)か、ローカル環境(LocalやXAMPPなど)で同じテーマとプラグインを再現するのが有効だ。テストサイトで症状が再現できれば、切り分け作業を安全に進められる。

PHPのバージョンは関係ある?

PHPのバージョンが極端に古い(7.4未満など)場合、WooCommerceの最新版が正しく動作しないことがある。サーバー管理画面でPHP 8.0以上に更新できるか確認するのも有効な切り分けのひとつだ。

この記事のポイント

  • カートの数量が「1→2」で「3」になるのはJavaScriptの二重処理が主因
  • テーマ・WordPress・WooCommerceの更新で解決するケースが多い
  • 直らない場合はプラグインを1つずつ無効化して競合元を特定する
  • ブラウザとサーバーのキャッシュ・Cookie削除を忘れない
  • 小数プラグインを使うならテーマ側のJavaScript競合を重点確認する
Rank Mathプラグインが管理者権限を無断取得か。WordPressセキュリティ問題

Rank Mathプラグインが管理者権限を無断取得か。WordPressセキュリティ問題

Rank Mathプラグインに重大なセキュリティ懸念が持ち上がっている。無料アカウントに連携した状態で「ヘルプ&サポート」セクションを開くと、管理者権限を持つアプリケーションパスワードが無断で生成されるという指摘が、開発者コミュニティからあがった。

指摘したのは、競合するThe SEO Frameworkプラグインの開発者Sybre Waaijer氏だ。Rank Mathは400万以上のサイトで利用される人気プラグインであり、影響範囲は極めて広い。今回はこの問題の仕組みと、サイト運営者が取るべき対処法を整理する。

Rank Mathの方式(Bad・無承認)
Rank Math ヘルプ&サポートを開く → 無断でパスワード生成 → 外部サーバーへ送信
※ユーザーに承認を求めない。規約ボックスは表示されるが生成は止まらない。
↓
WordPress公式の方式(Good・承認プロセス)
プラグイン 接続要求を表示 → ユーザーが承認 → パスワード生成
※承認画面で許可してから初めてパスワードが渡される。

このデモは、Rank Mathが取っているとされる方式と、WordPress公式が定める方式の違いを図式化したものだ。無承認での生成が問題の核となっている。

Rank Mathプラグインに何が起きているのか

Rank Mathプラグインに何が起きているのか

指摘の発端と具体的な動作

2026年8月30日、Search Engine JournalはRank Mathプラグインに関する新たな疑惑を報じた。The SEO Frameworkの開発者Sybre Waaijer氏が、Rank Mathの「ヘルプ&サポート」セクションを開くだけで管理者権限が外部に渡ると指摘したのだ。

Waaijer氏によれば、Rank Mathは1.0.277へのアップデートでセキュリティ問題を修正した。しかし同じアップデートに、group.one(WP Rocketの所有者でもある企業)がサイトの管理者権限を取得できる機能が含まれていたという。

対象となるファイルは vendor/groupone/wap-client/includes/class-app-password-manager.php だ。無料のrankmath.comアカウントに接続されたサイトで、管理者が「ヘルプ&サポート」を開くと、プラグインが即座に「WAP – Rank Math Support Agent」という名前のアプリケーションパスワードを生成する。そのパスワードはgroup.oneのサーバーへ送信され、同社のAIエージェントがユーザーに代わってサイトを操作できる状態になる。

許可なき権限委譲という問題

Waaijer氏は「プラグインは最初にユーザーへ確認しない。「利用規約」ボックスは表示されるが、パスワードの生成と送信を止めることはできない。送信はボックスが表示される前に始まっている」と説明している。

つまりユーザーは、何の操作もしないうちに、自分のサイトの管理者権限を第三者へ委譲してしまう。しかも、その事実を知らされることはない。ヘルプ&サポートを閉じてもパスワードは失効せず、無期限に有効なままだ。

影響範囲と深刻度

Rank Mathは400万以上のサイトで利用されている。管理者権限があれば、プラグインの更新、テーマの変更、投稿の削除、ユーザー情報の閲覧といった、サイト運営の中核的な操作が可能になる。これはSEOプラグインの枠を超えた、サイト全体の安全性に関わる問題だ。

問題の中核にあるアプリケーションパスワードとは

問題の中核にあるアプリケーションパスワードとは

WordPress標準の正当な仕組み

WordPressアプリケーションパスワードは、WordPressコアに含まれる正規の機能である。外部アプリケーションがWordPressサイトへ安全に接続するための仕組みで、ユーザーはいつでも個別に取り消せる。プラグインがこの仕組みを利用すること自体は、公式に認められている。

重要なのは、公式の仕様ではアプリケーションパスワードを発行する前に、必ず承認画面が表示されることだ。ユーザーがプラグインの身元を確認し、接続を許可するか拒否するかを選べる。パスワードがプラグインに渡るのは、ユーザーが承認した後でなければならない。

Rank Mathがガイドラインから外れている点

Rank Mathの動作は、この公式プロセスを完全に飛ばしている。承認画面は表示されず、ユーザーが何かをクリックする前にパスワードが生成され、外部サーバーへ送信される。Waaijer氏が指摘する通り、過去に同氏が「バックドア」と分類したものと構造が似ている。

WordPress.orgのプラグインガイドラインでは、外部サーバーと通信する際にはユーザーの明示的な同意が必要だと定められている。オプトインのチェックボックスや、サービスへの登録を経た同意が求められるのだ。Rank Mathの実装は、この原則に真っ向から反している。

取り消し方法が明示されない

アプリケーションパスワードは本来、ユーザーが確認して取り消せることを前提にしている。しかしRank Mathの場合、「ヘルプ&サポート」を開いただけでは、パスワードが発行された事実に気づく手がかりがない。プロフィール画面に「WAP – Rank Math Support Agent」という名前で表示されるため、知っていれば探せるが、知らなければ発見は難しい。

ユーザーコミュニティの反応

ユーザーコミュニティの反応

ソーシャルメディア上の反応は、一貫して否定的だった。一部のユーザーはWordPressコアにSEO機能を統合すべきだと主張し、別のユーザーはRank Mathから別のSEOプラグインへ移行する意思を示した。

フォーラムスレッド削除の疑惑

議論の中で、Rank Mathの公式フォーラムに大きなスレッドが立っていたが、その後削除されたという報告もあった。ユーザーの一人は「数日前にフォーラムで大きなスレッドが立っていたが、今日削除通知が来た。ユーザーフォーラムが大荒れになった後に削除されたようだ」と述べている。

もし事実なら、これはコミュニティの懸念を正面から受け止めていない姿勢と映る。透明性を求める声に対して、静かな対処を選んでいるように見えるからだ。

ユーザーが感じている不信感

「管理者アクセスが無断で?」という短い反応に、多くのユーザーの驚きが凝縮されている。SEOプラグインは検索順位を改善するための道具であって、サイトの制御権を委譲するものではない。誰もがそう考えていたからこそ、今回の発覚は衝撃を持って受け止められた。

Rank Mathの過去の脆弱性と信頼性

Rank Mathの過去の脆弱性と信頼性

脆弱性の履歴

Rank Mathは2024年に7件、2025年に4件、2026年に入って3件の脆弱性が発見されている。直近では、認証されていない状態で保存型クロスサイトスクリプティング(XSS)を実行される脆弱性も報告されていた。

1つのプラグインにこれだけの脆弱性が続くこと自体が、セキュリティ管理の甘さを示す。その上に今回の無断権限取得が加われば、信頼はさらに揺らぐ。

Search Engine Journalの推奨リストから外れている

Search Engine Journalは、自社の推奨WordPressプラグインリストにRank Mathを含めていない。推奨条件の1つが「脆弱性の履歴がないこと」であり、Rank Mathはこの基準を満たせていないためだ。

プラグインの選択では、機能の豊富さだけでなく、セキュリティ面の信頼性を確認することが重要になる。今回の件は、その判断基準を改めて浮き彫りにした。

WordPressサイト運営者が取るべき対処法

WordPressサイト運営者が取るべき対処法

まずはパスワードを取り消す

Rank Mathを利用していて、無料アカウントに接続した状態で「ヘルプ&サポート」を開いたことがあるなら、すぐにアプリケーションパスワードを取り消すべきだ。Waaijer氏が具体的な手順を示している。

  • WordPress管理画面の「ユーザー」から「プロフィール」を開く
  • 「アプリケーションパスワード」セクションを確認する
  • 「WAP -」で始まるパスワードをすべて取り消す

この操作により、Rank Mathのサポートエージェントが保持している管理者権限を無効化できる。手順は数分で済むが、放置すればリスクは残り続ける。

接続解除と設定の見直し

Rank Mathアカウントとの接続を解除することも有効な対策だ。接続していなければ、ヘルプ&サポートを開いてもパスワードは生成されない。必要になるまで無料アカウントへの接続を切っておくのが無難だ。

また、プラグインの権限設計そのものを見直す機会にしてほしい。管理者以外のユーザーがプラグイン設定を触れるようになっていないか、不要なプラグインが残っていないかを確認する。サイトのセキュリティは、積み重ねた小さな確認で守られる。

他プラグインの移行を検討する

今回の件を受けて、別のSEOプラグインへの移行を検討するユーザーも増えている。The SEO FrameworkやYoast SEOなど、信頼性の高い選択肢は複数ある。重要なのは、移行前に既存の設定やリダイレクト情報をバックアップしておくことだ。

取るべきステップ
STEP 1 アプリケーションパスワードを確認して「WAP -」をすべて取り消す
↓
STEP 2 Rank Mathアカウントとの接続を解除する
↓
STEP 3 プラグインの権限設定とユーザー権限を見直す
↓
STEP 4 別のSEOプラグインへの移行を検討する

上記のステップを順に実行することで、無断で付与された権限を無効化し、今後のリスクを低減できる。最初のステップが最も緊急性が高い。

この記事のポイント

  • Rank Mathはヘルプ&サポートを開くと管理者権限のアプリケーションパスワードを無断生成すると指摘された
  • 承認画面なしでパスワードが外部サーバーへ送信される仕組みはWordPress公式ガイドラインに違反する
  • Rank Mathは2024年から2026年にかけて合計14件の脆弱性が報告されている
  • 利用者は「ユーザー → プロフィール → アプリケーションパスワード」から「WAP -」をすべて取り消すべき
  • アカウント接続の解除と他SEOプラグインへの移行も有効な対策になる
WP to Hootsuite 3.xで予約投稿が失敗するCronエラーの対処法

WP to Hootsuite 3.xで予約投稿が失敗するCronエラーの対処法

WP to Hootsuite を 3.x 系へ更新したあと、予約投稿が Hootsuite に公開されない場合は、Cron クラスの reschedule_refresh_token_event メソッドが未定義のままになっている可能性が高い。プラグインを 3.1.4 以降へ更新すれば、この致命的エラーは解消する。

なぜWP to Hootsuite 3.xで予約投稿が失敗するのか

なぜWP to Hootsuite 3.xで予約投稿が失敗するのか

この不具合は、プラグインの更新時に必要なメソッド定義がファイルへ正しく反映されず、呼び出しだけが先に組み込まれた状態で発生する。3.x 系では WPZinc 製プラグイン共通の Social ライブラリへ構成が変わったため、一部のファイルに古いコードと新しいコードが混在しやすくなっている。

具体的には、includes/functions.php が Cron クラスの reschedule_refresh_token_event メソッドを呼ぶ一方、lib/social/includes/class-cron.php にそのメソッド定義がない。存在しないメソッドへの呼び出しは PHP の致命的エラーを引き起こし、その後の処理が止まる。

WPZinc\Social\Cron::reschedule_refresh_token_event()

予約投稿の実行は WP-Cron(WordPress の予約実行システム)を経由する。ここで致命的エラーが起きると画面には何も表示されず、プラグイン自身のログ画面にも記録が残らない。管理画面からの手動更新はトークン再スケジュール処理を通らないため成功するので、問題の特定が遅れやすい。

予約投稿が公開されない流れ
予約時刻 WP-Cron が予約投稿を実行する
↓
処理 functions.php が reschedule_refresh_token_event を呼ぶ
↓
エラー class-cron.php に該当メソッドがない
↓
結果 致命的エラーで処理停止、Hootsuite に公開されない
■ エラー発生箇所 ■ 正常な入り口

上の図は、予約投稿が致命的エラーで止まるまでの流れを示している。

プラグインのログ画面が空のままなのは、致命エラーが起きた時点で PHP の処理が停止し、ログを書き込むコードまで到達しないためだ。管理画面からの手動更新ではトークン再スケジュール処理が呼ばれないため、問題なく成功する。

3.1.4以降への更新で解消する手順

3.1.4以降への更新で解消する手順

この不具合はプラグイン側のコード不整合なので、特別な設定変更は不要だ。WP to Hootsuite を 3.1.4 以上へ更新すると、未定義だったメソッドが class-cron.php に追加され、予約投稿の処理が最後まで走るようになる。

更新作業の前に、必ずサイト全体のバックアップを取る。プラグイン更新そのものは数分で終わるが、万一テーマや他プラグインと競合した場合に戻せる状態にしておくことが重要だ。

STEP 1 サイト全体のバックアップを取得する
↓
STEP 2 管理画面のプラグイン一覧で WP to Hootsuite を更新する
↓
STEP 3 バージョンが 3.1.4 以上であることを確認する
↓
STEP 4 失敗した予約投稿を再スケジュールして動作確認する

上のステップは、更新から動作確認までの一連の流れを示している。

更新後はキャッシュ系プラグインの全削除も忘れずに行う。そのうえで、以前に失敗した投稿を一度下書きへ戻すか、公開予定日時を再設定して様子を見ると確実だ。

すぐに更新できない場合はどう対処するか

すぐに更新できない場合はどう対処するか

2.x系へ巻き戻して様子を見る

何らかの事情ですぐに 3.1.4 へ更新できない場合は、動作していた 2.x 系へ巻き戻すのが安全だ。WP Rollback などのプラグインを使うか、FTP で該当プラグインのフォルダを旧バージョンに差し替える。ただし、旧バージョンには以降のセキュリティ修正が含まれない点には注意が要る。

手動公開に切り替えて一時運用する

致命的エラーは予約投稿の実行時に発生するため、更新が終わるまで予約投稿を避け、公開したいタイミングで管理画面から手動で公開する運用も現実的な選択だ。下書きのまま用意しておき、公開直前に「公開」ボタンを押す流れにすると、サイト運営を止めずに済む。

ステージング環境で先に検証する

本番サイトへの更新が不安な場合は、ステージング環境(本番と同構成の検証用サイト)で先に 3.1.4 を適用し、予約投稿のテストを行う。これにより、他プラグインとの競合や認証トークンの再連携が必要かどうかを事前に確認できる。

デバッグログで原因を特定する手順

デバッグログで原因を特定する手順

プラグインのログ画面に何も残らない場合、PHP のデバッグログを有効にすると致命的エラーの内容が確認できる。本番サイトでは通常エラー表示が無効化されているため、管理画面にも何も出ない。

wp-config.php に次の記述を追加すると、エラー内容が wp-content/debug.log に書き込まれる。あらかじめ FTP または管理画面のテーマファイルエディタから wp-config.php を開いておく。

define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);

設定後にテスト用の予約投稿を実行し、wp-content/debug.log を確認する。未定義メソッドの場合、「Call to undefined method」(未定義メソッドの呼び出し)という趣旨のエラーが残る。日本語環境でも PHP の内部エラーは英語で記録される。確認後は、WP_DEBUG を false に戻してログ出力を止める。

よくある質問

3.1.4に更新しても予約投稿が失敗する場合は?

まずバージョン表記を確認し、本当に 3.1.4 以上へ置き換わったかを確かめる。そのうえでキャッシュを全削除し、Hootsuite との認証を一度解除して再接続する。それでも改善しない場合は、他プラグインとの競合を切り分ける。

更新ボタンが出てこない場合は?

プロ版や一括購入版では、管理画面の自動更新が効かないことがある。WPZinc の配布ページから最新版をダウンロードし、FTP で該当フォルダを上書きする。上書き前には必ずバックアップを取る。

WP-Cronが正しく動いているか確認するには?

WP Crontrol などのプラグインで予約イベントの一覧を確認し、投稿公開のイベントが登録されているかをチェックする。WP-Cron 自体が停止している場合は、サーバー側の cron 設定や wp-config.php の ALTERNATE_WP_CRON 設定を見直す必要がある。

デバッグログが出力されない場合は?

wp-content フォルダの書き込み権限が不足している可能性がある。FTP で wp-content のパーミッションを確認し、debug.log が作成できる状態か確かめる。あわせて、キャッシュ系プラグインやセキュリティプラグインが wp-config.php の変更をブロックしていないかも確認する。

2.xへ戻してもいいか?

一時的な回避として 2.x 系へ戻すのは有効だが、セキュリティ更新が含まれないため恒久対応にはならない。できるだけ早期に 3.1.4 以降へ更新し、検証のうえで運用を戻すのが望ましい。

この記事のポイント

  • 3.x 更新後に予約投稿が止まる原因は、呼び出しだけ存在する未定義メソッドによる致命的エラー
  • プラグインのログが空でも、PHP のデバッグログを有効にすれば原因が見える
  • 更新版 3.1.4 以降では Cron クラスのメソッド定義が揃い、予約投稿が正常に動く
  • すぐ更新できない場合は 2.x へ巻き戻すか、手動公開で一時運用する
  • 更新前のバックアップと、ステージング環境での事前検証が再発防止につながる
WooCommerce 11.2のライフサイクルフック変更。保存と並び替えでSQL最大45%削減

WooCommerce 11.2のライフサイクルフック変更。保存と並び替えでSQL最大45%削減

WooCommerce 11.1と11.2で、商品保存と商品並び替えの内部処理が大きく変わった。商品保存時のSQLクエリ数は最大45%削減され、並び替えアルゴリズムは大規模カタログ向けに再設計された。

プラグインやカスタムコードで商品データを操作している場合、レガシーフックの移行が必要になる。本記事では変更の全体像、技術的な詳細、そして移行の具体的な手順を解説する。

WooCommerce 11.1と11.2の変更点を俯瞰する

WooCommerce 11.1と11.2の変更点を俯瞰する
今回の変更点の全体像
変更1 商品保存処理の最適化
不要なAPI呼び出しをスキップしてSQL数を最大45%削減
↓
変更2 商品並び替えアルゴリズムの刷新
レガシーフックを非推奨化して範囲ベースの再インデックスに移行
■ 保存処理(キャッシュ無効化の調整) ■ 並び替え処理(アルゴリズムとフック)

2つの変更はいずれも、後方互換性を優先しつつ、大規模な商品カタログでパフォーマンスを改善することを目的としている。

大規模カタログ向けのパフォーマンス改善

WooCommerceチームは、商品数が数千・数万を超えるストアで発生する管理画面の遅延やデータベース負荷を問題視していた。特に商品保存と並び替えは、カタログ全体に影響が及ぶ処理であり、これまでの実装ではカタログが大きくなるほど処理時間が線形に悪化する構造だった。

今回の変更は、商品データストアが不要な書き込みを行わないようにし、並び替えでは全カタログの再インデックスを避ける設計へと置き換えるものだ。これにより、大規模ストアの管理画面レスポンスが大幅に改善される見込みである。

後方互換性の優先とレガシーフックの扱い

重要なのは、非推奨になったフックを使い続けた場合、自動的に旧アルゴリズムへフォールバックする点だ。互換性は保たれるが、その分パフォーマンス改善の恩恵は受けられない。

プラグイン開発者にとっては、古いフックへの依存を解消し、新しいフックへ移行するかどうかの判断が必要になる。次のセクションから、各変更の詳細を見ていく。

商品保存処理の最適化でSQL数を45%削減

商品保存処理の最適化でSQL数を45%削減
従来の商品保存処理(Before)
商品を保存するたびに、値が変わっていなくても以下の処理を実行していた。
ターム関連APIの呼び出し(毎回)
メタデータ削除APIの呼び出し(毎回)
SQLクエリ数が多い
↓
最適化後の商品保存処理(After)
保存前の値と比較して、同じ値ならAPI呼び出しをスキップする。
ターム関連APIの呼び出し(変更時のみ)
メタデータ削除APIの呼び出し(変更時のみ)
SQLクエリ数が最大45%削減

商品保存時の動作が変わり、値に変更がない場合はAPI呼び出しをスキップする。この最適化により、保存1回あたりのSQLクエリ数が最大45%削減される。

no-op書き込みの削減がもたらす効果

今回の最適化は、wp_set_object_terms() と delete_post_meta() というWordPressの関数に着目したものだ。これらの関数は、データが変わっていない場合でも呼び出されるとキャッシュを無効化する動作をしていた。いわば「変更がないのに掃除をする」ような無駄が毎回発生していた。

WooCommerce 11.1以降では、保存前の値と保存後の値を比較し、同じ値であればこれらのAPIを呼び出さない。この小さな変更が、商品保存を頻繁に行う大規模ストアでは大きなDB負荷の削減につながる。

フック発火頻度の変化による副作用

ただし注意点がある。set_object_terms フックは、これまで商品保存のたびに発火していた。最適化後は、値が変わった場合のみ発火するようになる。このフックに依存して何らかの処理を実行しているカスタムコードがある場合、想定よりも発火回数が減る可能性がある。

具体的には、商品タイプが変わっていなくても毎回の保存で処理を行うことを前提としたコールバックは、移行が必要だ。次のセクションで確認手順を詳しく解説する。

商品並び替えアルゴリズムの刷新とフック移行

商品並び替えアルゴリズムの刷新とフック移行
商品並び替えフックの移行マップ
非推奨 woocommerce_after_single_product_ordering
カタログ再インデックス中に商品ごとに発火していた
↓
新フック woocommerce_product_ordering_process_reindexed_products
フルカタログ再インデックス後に発火
非推奨 woocommerce_after_product_ordering
並び替え完了後に一度だけ発火していた
↓
新フック woocommerce_product_ordering_process_moved_products
商品が再配置された後に発火
■ 非推奨フック(旧アルゴリズムへフォールバック) ■ 新フック(高速パス) ■ clean_post_cacheは変更なし

並び替えに関わるフックは2つが非推奨になり、2つの新しいフックが追加された。非推奨フックを使うと旧アルゴリズムにフォールバックする。

旧アルゴリズムから新アルゴリズムへ

従来の商品並び替えは、管理画面の「商品 → すべての商品 → 並び替え」で操作するたびに、カタログ全体を再インデックスしていた。商品数が1万件を超えると、この処理は数十秒かかることもあり、実用に耐えないケースがあった。

新しいアルゴリズムは、大規模カタログを前提に設計されている。再インデックスを高速化し、範囲ベースの並び替えを採用することで、変更された範囲だけを効率的に処理する。これにより、大規模ストアでも並び替え操作が快適になる。

非推奨フックと新フックの対応表

以下の表が、今回変更されたフックの全体像だ。非推奨になったフックを今も使っている場合、対応する新しいフックへの移行を検討する必要がある。

  • woocommerce_after_single_product_ordering は非推奨。カタログ再インデックス中に商品ごとに発火していた
  • woocommerce_after_product_ordering は非推奨。並び替え完了後に一度だけ発火していた
  • clean_post_cache は変更なし。レガシーと高速パスの両方で影響を受けた商品ごとに発火する
  • woocommerce_product_ordering_process_reindexed_products は新設。フルカタログ再インデックス後に発火する
  • woocommerce_product_ordering_process_moved_products は新設。商品が再配置された後に発火する

元の動作を再現するには、clean_post_cache、wp_ajax_woocommerce_product_ordering、woocommerce_product_ordering_process_reindexed_products、woocommerce_product_ordering_process_moved_products をプリミティブとして組み合わせる方法が公式に案内されている。

既存サイトが受ける影響と確認手順

既存サイトが受ける影響と確認手順
AIツールを使った確認手順
STEP 1 アクティブなプラグインとテーマの functions.php を対象に検索
↓
STEP 2 add_action(‘set_object_terms’, …) のコールバックを探す
↓
STEP 3 商品タイプが変わっていなくても毎回発火する前提かチェック
↓
STEP 4 該当する場合は woocommerce_update_product や save_post_product への移行を検討

公式ブログでは、AIツールを使ってカスタムコードを確認する方法が提示されている。上の手順で、フックへの依存を洗い出せる。

カスタムコードの確認方法

まず、アクティブなプラグイン、MUプラグイン、テーマの functions.php を対象に、add_action('set_object_terms', ...) というコールバックを検索する。該当があれば、そのコールバックが「商品タイプが変わっていなくても毎回発火すること」を前提にしていないかを確認する。

もし前提にしていた場合、そのコールバックは woocommerce_update_product や save_post_product など、より適切なフックへ移動する必要がある。

移行が必要なケースと不要なケース

移行が必要なのは、set_object_terms フックが毎回発火することを前提にしたコードが存在する場合だ。逆に、商品タイプの変更やカテゴリの変更など、実際に値が変わる場合のみ処理を行いたいというコードは、そのままでも問題ない。

並び替え関連では、woocommerce_after_single_product_ordering と woocommerce_after_product_ordering を使っているコードは、新しいフックへの移行を検討する。非推奨フックを使い続けても動作はするが、旧アルゴリズムにフォールバックするため、パフォーマンス改善の効果を得られない。

この記事のポイント

  • 商品保存処理は、値が変わらない場合はAPI呼び出しをスキップしてSQL数を最大45%削減する
  • 商品並び替えは、全カタログ再インデックスから範囲ベースの新アルゴリズムへ刷新された
  • set_object_terms フックの発火頻度が変わるため、毎回発火を前提としたコードは移行が必要
  • 並び替えの旧フック2つは非推奨になり、新フック2つが追加された
  • 非推奨フックを使い続けると旧アルゴリズムにフォールバックし、高速化の恩恵を受けられない
WordPress 7.1でサイトエディターが真っ白になる原因と直し方

WordPress 7.1でサイトエディターが真っ白になる原因と直し方

WordPress 7.1に更新した後、サイトエディター(wp-admin/site-editor.php)だけが真っ白になる場合は、ブラウザの互換性とJavaScriptエラーを最初に確認し、それでも解決しなければサーバーエラーログとREST APIの応答を調べる。サイトエディターは投稿編集画面と比べてJavaScriptとREST APIへの依存度が高く、原因はこの2系統に集中している。

なぜサイトエディターだけが真っ白になるのか

なぜサイトエディターだけが真っ白になるのか

サイトエディターは、テンプレートやテンプレートパーツ、グローバルスタイルと呼ばれるデザイン設定を、REST API経由でサーバーから取得してJavaScriptで描画する。投稿編集画面が正常でも、サイトエディターだけが真っ白になるのは、この特殊な描画経路のどこかでエラーが起きているためだ。

主な原因は次の4つに分けられる。

  • 古いブラウザが最新JavaScript機能に対応していない
  • JavaScriptファイルの読み込み失敗や例外が起きている
  • REST APIが内部エラーを返してテンプレート情報を取得できない
  • PHPのメモリ不足で致命的エラーが発生している
STEP 1 別のブラウザと端末で開いて確認する
↓
STEP 2 デベロッパーツールでJavaScriptエラーを確認する
↓
STEP 3 サーバーエラーログを直後の時刻で確認する
↓
STEP 4 REST APIの応答を直接チェックする

真っ白な画面の原因切り分けは、この4ステップの順で行うと効率的だ。

古いブラウザが原因かどうかを確認する手順

古いブラウザが原因かどうかを確認する手順

最初に確認するのはブラウザの互換性だ。サイトエディターはブロックエディターと同じく、最新のJavaScript機能をフルに使って動作する。Firefox ESRや数世代前のSafari、旧バージョンのChromeでは、これらの機能に対応できずに画面全体が真っ白になることがある。特に長期的にブラウザをアップデートしていない業務用端末や古いノートPCで起こりやすい。

確認方法はシンプルで、同じサイトを別の端末や別のブラウザで開いてみる。もし最新版のChrome、Edge、Firefoxのいずれかで正常に表示されるなら、使用中のブラウザが古いことが原因だ。その場合はブラウザのアップデートを行うか、対応ブラウザに切り替える。どうしても古いブラウザで作業しなければならない場合は、サイトエディターの使用を避け、投稿編集画面から個別のテンプレートを編集するという回避策もある。

デベロッパーツールでJavaScriptエラーを確認する

デベロッパーツールでJavaScriptエラーを確認する

最新ブラウザでも真っ白になる場合は、デベロッパーツール(開発者ツール)を開いてJavaScriptエラーを調べる。画面が真っ白になる症状の多くは、レンダリングを途中で止めるJavaScriptの例外や、重要なファイルの読み込み失敗が直接の原因になっている。

ChromeやEdgeではF12キー、MacではCommand+Option+Iキーでデベロッパーツールが開く。Firefoxでは右クリックから「要素を調査」を選ぶとよい。開いたら「コンソール」タブに切り替え、ページを再読み込みする。コンソールに赤い文字で表示されるエラーを上から順に確認する。

TypeErrorやReferenceError、SyntaxErrorの表示があれば、それが画面描画を止めている例外だ。また「Failed to load resource」のようなエラーは、必要なJavaScriptファイルが読み込めていないことを示す。この場合は更新時にファイルが欠損した可能性が高いため、後述するWordPress本体の再インストールで解決することが多い。

サーバーエラーログとREST APIを確認する

サーバーエラーログとREST APIを確認する

ブラウザ側に明確なJavaScriptエラーが見つからない場合、次にサーバー側の状態を確認する。サイトエディターはREST API経由でテンプレート情報を取得するため、サーバーでエラーが発生していても画面上には何も表示されず、真っ白なままになる。

サーバーのエラーログを確認するときは、サイトエディターを開いた直後の時刻に注目する。エラーログには過去のボットスキャンや他のリクエストも大量に記録されている。AH01276のようなDirectoryIndex関連のエラーは、多くの場合ボットがディレクトリを直接スキャンした痕跡であり、エディターの真っ白とは無関係だ。ログを上から眺めるのではなく、症状が起きた時刻に新しいエントリが追加されたかどうかを確認する。

サーバーログと並行して、REST APIが正しく応答するかを直接チェックする。ブラウザのアドレスバーに自分のサイトURLに続けて wp-json/wp/v2/templates と入力して開いてみる。正常ならテンプレート一覧の入ったJSONデータが表示される。ここでエラーページやHTTP 500系のエラーが返るなら、REST API側に問題がある。

PHPメモリ上限と再インストールで直す

PHPメモリ上限と再インストールで直す

確認した内容に応じて対処する。PHPのメモリ不足を示すエラー(Allowed memory size of から始まるFatal error)がログに記録されている場合は、メモリ上限を引き上げる。デフォルトの128Mでは、テンプレートの多いサイトや高機能テーマでサイトエディターの読み込み中に不足することがある。wp-config.phpに次の1行を追加するか、レンタルサーバーの管理画面からメモリ上限を変更する。

define('WP_MEMORY_LIMIT', '256M');

エラーログにメモリ不足が出ていない場合や、ブラウザのコンソールにファイル読み込みエラーが出ている場合は、WordPress本体の再インストールが有効だ。ダッシュボードの「更新」メニューを開き、「WordPressを再インストールする」ボタンを押す。wp-admin、wp-includes、ルートのコアファイルが最新版で上書きされ、更新時に欠損したファイルが復元される。テーマやプラグイン、投稿データには影響しない。

再インストール後も症状が続く場合は、一度標準テーマ(Twenty Twenty-Fiveなど)に切り替えてサイトエディターが開くか確認する。標準テーマで開くなら使用中のテーマ側に原因があり、標準テーマでも開かないならサーバー設定やREST APIの応答に原因が残っている可能性が高い。

よくある質問

プラグインをすべて無効化しても直らないのはなぜか

サイトエディターの真っ白はプラグインの競合だけでなく、ブラウザ、JavaScript、REST API、PHPメモリなど複数の要因が絡む。特にREST API経由のデータ取得に失敗している場合はプラグイン無効化だけでは切り分けが不十分だ。ブラウザのコンソールとサーバーログの両方を確認する必要がある。

同じブラウザなのにサイトによって動作が違うのはなぜか

サイトごとに使用中のテンプレートやブロック、グローバルスタイルの構成が異なる。古いブラウザが対応していないJavaScript機能を使うブロックや設定が含まれているサイトだけが真っ白になる。また、サイトごとのメモリ上限やサーバー設定の違いも影響する。

WordPress 7.0に戻した方がよいか

セキュリティ修正を含む更新を戻すのは推奨しない。WordPress 7.1のまま原因を特定して解決する方が安全だ。原因を切り分ける手順を踏めば、ロールバックせずに直せるケースがほとんど。

デベロッパーツールが使えない端末ではどうすればいいか

別の端末やブラウザで同じサイトを開いて症状を再現し、そこからデベロッパーツールやサーバーログを確認する。どうしても別端末が用意できない場合は、サーバーエラーログを症状発生直後の時刻で確認し、PHPの致命的エラーやREST APIの応答を調べるとよい。

この記事のポイント

  • サイトエディターの真っ白はブラウザ互換性を最初に疑う
  • デベロッパーツールでJavaScriptエラーを特定する
  • サーバーエラーログは症状が起きた直後の時刻で確認する
  • REST APIの応答を直接チェックして切り分ける
  • PHPメモリ不足なら上限を引き上げる
  • ファイル欠損が疑わしい場合はWordPress本体を再インストールする
WooPaymentsでカード追加ページが真っ白になる原因と解消手順

WooPaymentsでカード追加ページが真っ白になる原因と解消手順

WooCommerceでWooPaymentsを使っているサイトで、購入時のカード保存は正常に動くのにマイアカウントのカード追加ページだけが真っ白になる場合、多くはJavaScriptエラーかプラグインによるテンプレート競合が原因だ。開発者ツールでエラーの実体を特定し、プラグインとテーマの切り分けを順に行うと短時間で解消できる。

なぜカード追加ページだけが真っ白になるのか

なぜカード追加ページだけが真っ白になるのか

WooPaymentsのカード入力フォームは、チェックアウト画面でもマイアカウント内でもJavaScriptで動的に描画される。特にカード追加ページでは、WooPaymentsが提供するStripe Elementsという入力部品を読み込んでフォームを生成する仕組みだ。

このとき、他のプラグインが読み込むスクリプトと衝突したり、テーマがマイアカウントのテンプレートを上書きしてフォームの置き場所が消えたりすると、ページが真っ白に見える。PHPの致命的エラーが起きている場合も同様の症状になる。

保存済みカードの一覧表示は正常なのにカード追加だけが空になるのは、表示に異なる読み込み経路が使われるためだ。一覧はすでにデータベースへ保存された情報をPHPだけで描画できるが、カード追加フォームはJavaScriptの実行が必須になる。だからこそ、スクリプトエラーが症状としてそのページだけに出やすい。

また、WooPaymentsのアップデート時にファイルの一部が欠けた場合もフォームが表示されない。エラーがどこにも出ないまま空白だけになるケースでは、プラグイン本体の再インストールも選択肢に入る。

ブラウザの開発者ツールでエラーを特定する手順

ブラウザの開発者ツールでエラーを特定する手順

まず最初に、ブラウザの開発者ツールを使って実際に何が止まっているのかを確認する。エラーが特定できれば、その後の切り分けが大幅に短くなる。

STEP 1 カード追加ページをブラウザで開く
↓
STEP 2 F12キーを押して開発者ツールを開く
↓
STEP 3 コンソールタブで赤いJavaScriptエラーを確認する
↓
STEP 4 ネットワークタブで読み込み失敗したファイルを探す

このデモは、エラー特定までの基本フローを示している。コンソールとネットワークの両方を確認すると原因ファイルが見つかりやすい。

コンソールでJavaScriptエラーを確認する

カード追加ページを開いた状態でF12キーを押し、「コンソール」タブを開く。赤い文字で表示されるエラーが1件以上あれば、その内容を控えておく。英語表示の場合は「Uncaught TypeError」や「Failed to load resource」のような記述が手がかりになる。

エラーの右側に表示されるファイル名も重要だ。どのプラグインのスクリプトが失敗しているかが分かれば、無効化の対象を特定できる。たとえば `woocommerce.js` や `stripe.js` が読み込めていなければ、キャッシュやプラグイン本体の問題を疑う。

ネットワークタブで読み込み失敗を確認する

同じく開発者ツールの「ネットワーク」タブを開き、ページを再読み込みする。ステータスが「404」や「500」になっているファイルがないかを確認する。404はファイルが存在しない、500はサーバー処理の失敗を意味する。

とくにカードフォームの描画に必要なJavaScriptファイルが404になっていると、ページが白いまま何も表示されない。この場合はWooPaymentsのファイルが不完全な可能性が高い。

プラグインとテーマの競合を切り分ける手順

プラグインとテーマの競合を切り分ける手順

開発者ツールで原因が特定できない場合は、定番の切り分け作業を順に行う。目的は、どのプラグインまたはテーマがカード追加ページの表示を妨げているかを絞り込むことだ。

切り分け前

全プラグインが有効のまま「カード追加」を開くと

ページが真っ白でフォームが表示されない

どのプラグインが影響しているか不明

↓

切り分け後

WooCommerceとWooPaymentsだけを有効にすると

カード入力フォームが正常に表示される

原因プラグインをひとつずつ有効化して特定できる

■ 競合発生状態 ■ 競合解消状態

このデモは、プラグイン競合の切り分け前後で何が変わるかを示している。競合元を特定しなければ恒久的な解決にはならない。

全プラグインを無効化してWooCommerce系だけ有効化する

管理画面の「プラグイン」へ移動し、(WooCommerceとWooPayments以外の)すべてのプラグインを無効化する。この状態でカード追加ページを開いてフォームが表示されるか確認する。

フォームが表示された場合は、無効化したプラグインをひとつずつ有効化して、どのプラグインを有効にした時点で再発するかを確認する。マイアカウントの表示をカスタマイズするプラグインや、管理画面用のスクリプトを全ページに読み込むプラグインが原因になりやすい。

この作業で一時的にサイト機能が変わるため、アクセスの少ない時間帯に行うか、ステージング環境があればそちらで再現させる。WooCommerceとWooPaymentsは必ず有効のままにして検証する。

標準テーマに切り替えてテーマの影響を除外する

プラグインをすべて無効化しても症状が続く場合は、テーマが原因の可能性がある。管理画面の「外観」→「テーマ」で、Twenty Twenty-FourなどのWordPress標準テーマへ一時的に切り替える。

標準テーマでカード追加フォームが表示されるなら、元のテーマがマイアカウントのテンプレートを上書きしていることになる。テーマに含まれる `woocommerce` フォルダの `myaccount` 関連ファイルが、カード追加ページの表示を妨げているケースが多い。

テーマを切り替えるとウィジェットやカスタマイズ設定が変わることがあるため、検証後は必ず元のテーマへ戻す。できればステージング環境での検証を推奨する。

WooPaymentsの設定とパーマリンクを再確認する

WooPaymentsの設定とパーマリンクを再確認する

切り分けを行っても原因が見つからない場合、WooCommerceの設定とパーマリンクを再確認する。設定が正しくても保存し直すだけで直るケースがある。

カード追加エンドポイントの設定を保存し直す

管理画面の「WooCommerce」→「設定」→「詳細設定」タブを開き、「アカウントエンドポイント」欄を確認する。カード追加の項目が正しく入力されていることを確認し、入力内容そのものに変更がなくても一度「変更を保存」を押す。

パーマリンクの内部マップがずれていると、ページ自体は存在してもWooCommerceがエンドポイントを認識できないことがある。保存し直すだけでマップが再構築されるため、手軽に試せる。

保存済みカード決済の設定を確認する

「WooCommerce」→「設定」→「決済」タブでWooPaymentsを開き、「カード決済」が有効であることと「保存済みカードによる支払いを有効にする」にチェックが入っていることを確認する。購入時のカード保存は正常でも、この設定が外れるとマイアカウントからの追加だけが動作しないことがある。

パーマリンクを更新してエンドポイントを再マップする

管理画面の「設定」→「パーマリンク」へ移動し、設定を変更せずそのまま「変更を保存」を押す。これでリライトルールが再生成され、マイアカウントの各エンドポイントが正しく認識されるようになる。

パーマリンク更新後は必ずキャッシュプラグインのキャッシュを全削除する。キャッシュが残っていると、古い状態のページが配信されて症状が続いているように見える。

再発を防ぐための更新前チェックとログ確認

再発を防ぐための更新前チェックとログ確認

根本解決できたら、次回のアップデートで同じ問題が起きないように更新前チェックの習慣をつけておく。WooPaymentsは更新頻度が高いプラグインのため、更新後に特定のページだけが壊れるリスクは常にある。

WooCommerceのログでPHPエラーを確認する

管理画面の「WooCommerce」→「ステータス」→「ログ」タブを開き、直近のエラーログに「fatal-errors」のようなファイルがないかを確認する。PHPの致命的エラーが記録されていれば、その内容から原因ファイルを特定できる。

ログが存在しない場合は、WooPaymentsの「ログ」タブから決済関連の動作記録を確認する。カード追加フォームの読み込みに失敗した形跡がないかを探る。

WooPaymentsのファイルを再アップロードする

アップデート時にファイルの一部が欠けた疑いがある場合は、管理画面からプラグインを削除して再インストールする。その際、決済データはサーバー側に保存されているため、プラグインの削除で売上情報や顧客情報が消えることはない。

FTP接続でWooPaymentsのフォルダだけを最新版のファイルで上書きする方法もある。管理画面に入れる状態なら「プラグイン」→「プラグインの新規追加」からWooPaymentsを検索して入れ直す方が確実だ。

マイアカウント系ページをキャッシュ対象から除外する

キャッシュプラグインの設定で、マイアカウント関連のURLをキャッシュ対象から除外しておく。具体的には `/my-account/` で始まるパスを除外リストへ追加する。これにより、カードフォームや認証情報が古いキャッシュで表示される問題を防げる。

よくある質問

カード追加ページだけが真っ白になるのはなぜ?

そのページだけテンプレートやJavaScriptが干渉されている可能性が高い。WooPaymentsのカード入力フォームはJavaScriptで描画されるため、他のプラグインのスクリプトが衝突するとフォームが生成されず真っ白に見える。

開発者ツールにエラーが表示されない場合は?

コンソールにエラーが出ない場合、PHPの処理途中で止まっている可能性を疑う。wp-config.phpでデバッグを有効にしてエラーを可視化するか、WooCommerceのログを確認する。あわせてテーマのマイアカウント用テンプレートが正しいかも調べる。

WooPaymentsのバージョンを一つ前へ戻すと直る?

互換性が問題の場合は直ることがある。バージョン固定のダウングレードは応急処置として有効だが、セキュリティ更新を含む場合は推奨しない。まず競合の特定を優先し、どうしても手がかりがない場合に実施する。

キャッシュプラグインが原因になることはある?

ある。特にマイアカウント系のページをキャッシュしてしまう設定だと、カードフォームの読み込みだけが古い状態で配信されることがある。キャッシュ対象からマイアカウントを除外する設定も併せて確認する。

マイアカウントの表示をカスタマイズするプラグインは原因になりやすい?

なりやすい。カード追加ページのテンプレートやフックを書き換えるタイプのプラグインは、WooPaymentsのフォーム表示に直接影響する。無効化して症状が消えるかどうかを最初の切り分けで確認する。

この記事のポイント

  • 開発者ツールのコンソールでJavaScriptエラーを特定する
  • 全プラグインを無効化してWooCommerce系だけ有効化して切り分ける
  • 標準テーマに切り替えてテーマ競合を除外する
  • パーマリンクとエンドポイント設定を保存し直す
  • WooPaymentsを再インストールしてファイルの健全性を回復する
  • マイアカウント系ページをキャッシュ対象から除外する
hCaptcha 5.2.0更新後にログインできない時の対処法とダウングレード手順

hCaptcha 5.2.0更新後にログインできない時の対処法とダウングレード手順

hCaptcha プラグインを 5.2.0 に更新した直後からログイン画面に「Bad hCaptcha signature!」と表示され、管理画面へ入れない場合は、5.1.0 へのダウングレードと全キャッシュの削除で解決する。この不具合は 5.2.0 の署名検証リグレッションが原因で、サイトキーやシークレットキーの設定ミスではない。

なぜhCaptcha 5.2.0への更新後にログインエラーが起きるのか

なぜhCaptcha 5.2.0への更新後にログインエラーが起きるのか

hCaptcha 5.2.0 はログイン時の署名形式を変更している。署名とは、データが改ざんされていないことを証明する値のことだ。この変更が原因で署名検証フローにリグレッション(回帰不具合、以前は正常だった機能が更新によって壊れること)が混入した。

WordPress のログイン統合と別のログイン統合が、同じ wp-login.php エンドポイントを通じて送信される際に署名の検証が失敗する。複数のプラグインがログイン画面に同時に作用する構成で、この問題が顕著に現れる。

「Bad hCaptcha signature!」というエラーは、プラグインがローカルで生成している。hCaptcha API にリクエストを送る前の段階で発生するため、サイトキーとシークレットキーの検証が成功していてもエラーが消えない。この点が原因の切り分けを難しくしている。

「ログイン試行前のhCaptcha」の設定値を 0 にしている場合、この不具合はすべてのログイン試行で発生する。0 に設定すると署名検証を回避する余地がなくなり、毎回エラーに遭遇する。

ログイン不能な状態から管理画面へ入る手順

ログイン不能な状態から管理画面へ入る手順

管理画面に入れない状態でも、FTP や SSH でサーバーへ接続すれば hCaptcha プラグインを一時停止できる。プラグインを停止するとログイン経路が確保されるため、その後は通常どおり管理画面へアクセスできる。

STEP 1 FTPまたはSSHでサーバーへ接続する
↓
STEP 2 プラグインフォルダの名前を変更して一時停止する
↓
STEP 3 管理画面にログインしてプラグイン一覧を確認する
↓
STEP 4 hCaptcha 5.2.0を削除して5.1.0をインストールする

この手順で管理画面へ入り、ダウングレードの準備を整える。

FTPまたはSSHでプラグインを停止する

FTP クライアントでサーバーへ接続し、wp-content/plugins ディレクトリへ移動する。hcaptcha というフォルダを見つけたら、フォルダ名を「hcaptcha-disabled」のように変更する。WordPress はプラグインを読み込まなくなるため、ログイン画面からキャプチャが消えて通常のログインフォームが表示される。

SSH を使える環境なら、wp-content/plugins ディレクトリで mv コマンドを実行する方法が速い。コマンドラインでの操作に慣れている場合は、この選択肢が確実だ。

管理画面に入ったらhCaptcha設定を確認する

プラグインを停止してログインできたら、WordPress 管理画面の「プラグイン」を開く。hCaptcha が停止状態になっていることを確認し、これから行うダウングレードに備えて現在の設定メモを残しておくとスムーズだ。

hCaptcha 5.2.0を5.1.0へダウングレードする手順

hCaptcha 5.2.0を5.1.0へダウングレードする手順

管理画面へ入れるようになったら、hCaptcha 5.2.0 を削除して 5.1.0 をインストールする。設定データは削除しても保持されるため、サイトキーとシークレットキーを再入力する必要はない。

Before(5.2.0)
ログイン画面に「Bad hCaptcha signature!」と表示される
キャプチャテストに合格してもエラーが消えない
管理画面に入れない
↓
After(5.1.0)
ログインが正常に完了する
キャッシュ削除後にエラーが消える
管理画面に問題なく入れる
■ エラー状態 ■ 修正後

5.1.0 へ戻すと署名検証の不具合が解消され、ログインできるようになる。

5.2.0を削除して5.1.0をインストールする

WordPress 管理画面の「プラグイン」から hCaptcha 5.2.0 を削除する。削除しても設定はデータベースのオプションテーブル(デフォルトでは wp_options)に残るため、サイトキーやシークレットキーが消えることはない。

次に 5.1.0 の ZIP ファイルを公式リポジトリなどから入手する。「プラグイン」メニューの「新規追加」を開き、「プラグインのアップロード」から ZIP ファイルを選択してインストールする。インストール完了後に有効化する。

サイトキーとシークレットキーを再確認する

インストール後、hCaptcha の設定画面を開き、サイトキーとシークレットキーに値が入っていることを目視で確認する。5.2.0 から戻しても設定は残っているはずだが、念のため両方のフィールドをチェックしておく。

キーの検証ボタンを押して成功すれば、API との通信自体は正常ということだ。ただしこの不具合は通信前にローカルで発生するため、検証成功の表示が出ても油断はできない。あくまでキーの有効性を確認するだけの操作だと理解しておく。

モードをLiveに設定して保存する

設定画面でモードが Live になっていることを確認し、変更があれば保存する。サイズが invisible になっているかも確認する。設定を保存したら、次のキャッシュ削除の手順へ進む。

キャッシュを削除してエラーを完全に解消する

キャッシュを削除してエラーを完全に解消する

バージョンを 5.1.0 に戻しただけではエラーが残ることがある。5.2.0 が署名形式を変更した影響で、以前のバージョンが生成したログイン HTML が各種キャッシュに残っていると、同じエラーが引き続き表示される。

ページキャッシュとサーバーキャッシュを削除する

使用しているキャッシュプラグイン(WP Super Cache や W3 Total Cache など)の管理画面を開き、ページキャッシュとオブジェクトキャッシュを削除する。サーバー側のキャッシュ機能(Varnish や LiteSpeed Cache など)が有効な場合も、同じく削除操作を行う。

CDNのキャッシュを削除する

Cloudflare やその他の CDN を利用している場合、CDN の管理画面からキャッシュをパージする。ログインページの HTML がエッジサーバーに残っていると、WordPress 側の設定が正しくても古い署名形式のページが配信され続ける。

プライベートウィンドウで動作確認する

キャッシュ削除後、通常のブラウザタブではなくプライベートウィンドウ(シークレットウィンドウ)でログインページを開く。ブラウザのローカルキャッシュや Cookie も残っていると、修正後のページを正しく読み込めないことがある。

プライベートウィンドウでログインを試み、キャプチャを通過して管理画面に入れればダウングレードは成功だ。通常のブラウザタブでまだエラーが出る場合は、ブラウザのキャッシュと Cookie を個別に削除して再試行する。

自動更新を止めて再発を防ぐ

自動更新を止めて再発を防ぐ

修正版がリリースされるまで、自動更新で 5.2.0 に戻らないようにしておく。プラグインの自動更新は個別に無効化できるため、hCaptcha だけ更新を止めておくのが安全だ。

hCaptchaの自動更新を無効化する

WordPress 管理画面の「プラグイン」一覧で hCaptcha の行を確認し、自動更新を無効にする。プラグインごとの自動更新設定はプラグイン一覧画面から切り替えられる。WordPress 本体の自動更新とは別の設定なので、本体は更新を継続したまま hCaptcha だけを固定できる。

修正版のリリースを確認する方法

プラグインの公式ページやリポジトリを定期的に確認し、5.2.1 以降の修正版がリリースされたかをチェックする。修正版が出るまでは 5.1.0 のまま運用し、更新前には必ずテスト環境でログイン動作を確認する。

本番環境へ修正版を適用する際も、まずステージング環境でログイン、キャプチャ表示、ユーザー登録、パスワードリセットの一連の動作を検証してからリリースするのが安全だ。

よくある質問

プラグインを削除するとhCaptchaの設定は消えますか

いいえ、消えない。プラグインを削除しても設定はデータベースに保持される。アンインストール時にデータを削除するクリーンアップ設定を事前に有効化していた場合のみ、削除される仕組みだ。ダウングレードでサイトキーを再入力する必要はない。

ダウングレード後に「インストールが不正です」と表示されます

5.2.0 から 5.1.0 へ手動で戻す際、WordPress が古いバージョンのインストールを「不正」と判定することがある。この場合は一度 5.2.0 を完全に削除してから 5.1.0 を新規インストールする。設定が残っているため、再設定の手間はかからない。

サイトキーとシークレットキーの検証は成功するのにエラーが続きます

「Bad hCaptcha signature!」は、プラグインが API へリクエストを送る前のローカル段階で生成される。キーの検証は API との通信が正常であることを示すだけで、署名検証の不具合とは無関係だ。そのためキーが正しくてもエラーは消えない。

ログイン時にキャプチャテストが表示されるのは正常ですか

「サイズ」を「invisible」に設定しているにもかかわらず画像選択テストが表示される場合、設定が正しく反映されていない可能性がある。ダウングレード後にキャッシュを削除し、プライベートウィンドウで再度確認するとよい。それでも表示される場合は、ログイン試行前の設定値や他のログイン系プラグインとの競合を調べる。

自動更新で勝手に5.2.0に上がるのを防げますか

防げる。WordPress 管理画面の「プラグイン」一覧から hCaptcha の自動更新を個別に無効化できる。また、複数のプラグインを一元管理している場合は、更新ポリシーで hCaptcha を除外する設定を行う。

この記事のポイント

  • 5.2.0 の署名検証リグレッションがログインエラーの原因
  • エラーはAPI通信前のローカル処理で発生する
  • 5.1.0 へのダウングレードが確実な対処法
  • プラグイン削除後も設定データは保持される
  • 全キャッシュ削除とプライベートウィンドウでの確認が必須