タグアーカイブ PHPエラー

WP Offload Mediaでサイトに重大なエラーが発生した時の原因と対処法

WP Offload Media(S3/CloudFrontにメディアを転送するプラグイン)でサイトに「このサイトで重大なエラーが発生しました」と表示され、画面が表示されなくなる場合、PHP 8.xではプラグイン内部のsprintf()呼び出しに引数が1つ足りないのが原因だ。最新版へのアップデートで解消する。

なぜWP Offload MediaでArgumentCountErrorが起きるのか

なぜWP Offload MediaでArgumentCountErrorが起きるのか

このエラーの直接の原因は、WP Offload Mediaの remove-local-handler.php 内にある sprintf() 呼び出しだ。メディアをS3へ転送(オフロード)した後、ローカルファイルを削除しようとして失敗すると、エラーメッセージを整形する処理が走る。その際、翻訳文字列にファイルパス用の %s が含まれているのに、実際のファイルパスが渡されていない。

PHP 7.xまでは引数不足の sprintf() は警告で済んでいた。ところが PHP 8.0 以降では ArgumentCountError という致命的エラーになり、未処理の例外としてサイト全体が停止する。本来なら所有権やパーミッションの警告で済むはずの内部メッセージ生成が、フロントエンド全体を落とす事態になる。

発火のきっかけは特定の操作に限らない。Yoast SEO のスキーマ生成が wp_head 内で wp_get_attachment_image_url() を呼ぶケースもある。カスタム投稿やギャラリー、商品ページのサムネイル取得など、アップロード済みメディアの URL を取得する場所ならどこでも起こり得る。

Before(エラー状態)
sprintf() にフォーマット文字列だけを渡し、%s 用のファイルパスが無い。PHP 8が ArgumentCountError を投げ、サイト全体が停止する。
After(修正後)
sprintf() の第2引数に $file を渡す。エラーは警告として記録されるだけで、サイトは稼働を続ける。
エラー状態  修正後

修正版では sprintf() の第2引数として $file(実際のファイルパス)が追加される。未処理の例外がなくなるため、フロントエンドの停止を防げる。

エラーログから原因の関数名を確認する手順

エラーログから原因の関数名を確認する手順

画面上では「このサイトで重大なエラーが発生しました」とだけ表示され、詳細はわからない。管理者宛のメールやサーバーのPHPエラーログにスタックトレースが残っている場合もあるが、WordPress の debug.log を有効にするのが最も確実だ。

  • wp-config.php をテキストエディタかFTPで開く
  • WP_DEBUG と WP_DEBUG_LOG を true にして保存する
  • エラーが起きたページを再読み込みする
  • wp-content/debug.log を開き、ArgumentCountError と Remove_Local_Handler を探す

スタックトレースに「2 arguments are required, 1 given」という記述があれば、この症状と一致する。Yoast SEO が呼び出し元に含まれる場合もあるが、他のプラグインやテーマ由来でも発火するため、関数名の確認を優先する。

WP Offload Mediaをアップデートして修正する手順

WP Offload Mediaをアップデートして修正する手順

修正が取り込まれたバージョンがリリースされていれば、管理画面からプラグインを更新するのが最短の対応だ。WP Offload Media はサブスクリプション型のライセンスで更新が配布されるため、ライセンスが有効かどうかも確認しておく。

STEP 1 管理画面の「プラグイン」を開く
STEP 2 WP Offload Media に更新があるか確認する
STEP 3 プラグインを更新する
STEP 4 キャッシュを削除し、ページの復旧を確認する

更新後はサーバーキャッシュとブラウザキャッシュを削除してから、エラーが出ていたページを開き直す。WP CLI を使える環境では wp plugin update コマンドでも更新できる。

すぐに更新できない場合の一時的な対処

すぐに更新できない場合の一時的な対処

サブスクリプションの期限切れなどで更新が受けられない場合は、remove-local-handler.php に直接修正を加える方法がある。管理画面の「プラグイン」メニューにある「プラグインファイルエディター」からWP Offload Media を選び、remove-local-handler.php を開く。

sprintf() に $file を追加して回避する

修正箇所は2つある。remove-local-handler.php の180行付近と185行付近だ。どちらも sprintf() の閉じ括弧の前に、カンマと $file を追加する。このファイルはプラグイン本体のため、次回のアップデートで上書きされるが、修正版が配布されるまでの時間稼ぎにはなる。

// 修正前(180行付近)
$file_to_remove['remove_result']['message'] = sprintf(
    __( "Error removing local file. Couldn't find the file at %s", 'amazon-s3-and-cloudfront' )
);

// 修正後
$file_to_remove['remove_result']['message'] = sprintf(
    __( "Error removing local file. Couldn't find the file at %s", 'amazon-s3-and-cloudfront' ),
    $file
);

// 185行付近も同様に $file を追加する

プラグインを一時的に無効化する

管理画面に入れる場合は、WP Offload Media を一時的に無効化すればサイトは復旧する。ただし、メディアがすでにS3にオフロードされていると、無効化中はローカルに存在しない画像が表示されないことがある。緊急時の対応と割り切って使う。

PHPバージョンを7.4に戻す

サーバーの設定で PHP を 7.4系に戻せばエラーは出なくなる。ただし、PHP 7.4はセキュリティサポートが終了しているため、恒久対策にはならない。あくまで更新までの一時的な回避策だ。

所有権とパーミッションを見直して再発を防ぐ

所有権とパーミッションを見直して再発を防ぐ

このエラーが起きたということは、オフロード後に削除するはずのローカルファイルに削除権限がなかった可能性が高い。プラグインの修正後は、アップロードディレクトリの所有権とパーミッションを確認し、Webサーバーユーザーが書き込める状態にしておく。

アップロードディレクトリ(wp-content/uploads)は、ディレクトリが755、ファイルが644であることが一般的だ。所有権がFTPユーザーになっていると、Webサーバープロセスが削除できず同じ状態になる。サーバー管理画面やシェルから、アップロードディレクトリの所有者をWebサーバーの実行ユーザーに合わせる。

# 所有者とグループをWebサーバー実行ユーザーに合わせる(www-data は環境により異なる)
sudo chown -R www-data:www-data wp-content/uploads

# ディレクトリとファイルの権限を整える
find wp-content/uploads -type d -exec chmod 755 {} \;
find wp-content/uploads -type f -exec chmod 644 {} \;

実行ユーザーの名前はサーバー環境によって www-data、apache、nginx など異なる。レンタルサーバーでは管理画面のファイルマネージャーから所有者を変更できないこともあるため、その場合はカスタマーサポートに依頼するか、PHP を実行ユーザーと同じ権限で動かす設定を検討する。

よくある質問

管理画面にも入れないほど真っ白になった場合はどうする?

FTPやサーバーのファイルマネージャーから wp-content/plugins/ に入り、WP Offload Media のフォルダ名を「WP Offload Media_backup」のように変更して無効化する。WordPress はプラグインが存在しないと認識し、サイトを復旧できる。その後、原因を修正してからフォルダ名を元に戻す。

プラグインを更新したのにまだエラーが出るのはなぜ?

キャッシュが残っている可能性が高い。サーバーキャッシュとブラウザキャッシュを削除してから再確認する。それでも出る場合は、別のプラグインが同様の sprintf() 引数不足を起こしている。デバッグログのスタックトレースを再確認する。

ArgumentCountError は WP Offload Media 以外でも起きる?

起きる。PHP 8.0以降では、翻訳文字列に %s を含む sprintf() で引数を渡し忘れると同様の致命的エラーになる。古いテーマやプラグインで潜伏していることが多い。PHP 8.x へ移行する際は事前にステージング環境でテストするのが基本だ。

所有権の問題を放置するとどうなる?

ローカルファイルの削除が失敗し続け、アップロードディレクトリに同じファイルが重複して残る。ディスク容量やバックアップサイズにも影響する。プラグイン自体は修正されても、警告ログが出続けるため、所有権は合わせて直しておくべきだ。

この記事のポイント

  • WP Offload Media の sprintf() 引数不足が PHP 8.x で致命的エラーになる
  • 「このサイトで重大なエラーが発生しました」の裏で ArgumentCountError が起きている
  • 修正版への更新が最短の解決策
  • 更新できない間は sprintf() の第2引数に $file を追加する
  • 所有権とパーミッションを整えて同じ失敗が起きないようにする
PHP Warning Undefined array key value エラーの原因と直し方

PHP Warning Undefined array key value エラーの原因と直し方

WordPress で PHP 8.x 環境に移行した後、サーバーのエラーログに「Warning: Undefined array key」という警告が大量に記録されるようになった場合、最も確実な解決策は原因となっているプラグインを最新バージョンに更新することだ。この警告はいわゆる「Notice」より深刻度が一つ上の「Warning」だが、サイトの表面的な表示や動作が完全に停止する致命的なエラーではない。

PHP 8.x 環境で「Undefined array key」が頻発する根本的な原因とは

PHP 8.x 環境で「Undefined array key」が頻発する根本的な原因とは

PHP 8.0 以降、コードの実行エンジンが大幅に厳格化された。以前の PHP 7.x 系では配列に存在しないキーを参照しても警告が出ずにスルーされたが、PHP 8.x では「Undefined array key」という警告が発生する。WordPress のプラグインを一手に引き受ける制作会社や個人開発者の視点では、これは「昔のコードの書き方が許されなくなった」状態といえる。

具体的には、配列のキーを直接参照するコードが原因だ。例えば、$field['value'] のように配列のキーを直接指定すると、そのキーが存在しない限り例外や警告が出る。今回の「lib-widget-fields.php」のように、ウィジェット側で「value」キーを出力する仕様になっていないのに、テンプレート側でそれを読み込もうとすると、PHP の厳格な構文チェックに引っかかる。

PHP 7.x と PHP 8.x のコード解釈の違い
PHP 7.x(寛容)
$value = $field['value'];
キー ‘value’ がなくても、null が入るだけで警告は発生しない。
PHP 8.x(厳格)
$value = $field['value'];
キー ‘value’ がないと「Warning: Undefined array key “value”」が発生する。
PHP 7.x まで通っていたコード  PHP 8.x でエラーになるコード

エラーログを止める最も確実な方法「プラグインのアップデート」

エラーログを止める最も確実な方法「プラグインのアップデート」

WordPress で「Undefined array key」が特定のプラグイン(たとえば Directorist のようなディレクトリ系テーマ・プラグイン)で発生する場合、最優先で行うべきはそのプラグインのアップデートだ。成熟したプラグインであれば、開発チームがすでにコードを修正し、PHP 8.x 向けに配列キーの存在チェックを追加した新しいバージョンをリリースしている可能性が高い。

管理画面の「ダッシュボード」→「更新」画面から手動で更新するか、利用しているプラグインの公式サイトで最新バージョンがリリースされていないか確認する。自動更新が無効になっていると、修正パッチが適用されずにいつまでもエラーログが肥大化し続ける。サイトヘルス画面やサーバーのディスク容量を圧迫する前に手を打つべきだ。

すぐに警告を非表示にする「wp-config.php」の設定変更

すぐに警告を非表示にする「wp-config.php」の設定変更

プラグインの更新がまだ提供されていない、または何らかの理由で更新できない事情がある場合、サーバー設定ファイル wp-config.php を調整して警告を非表示にできる。ただしこれはあくまで対症療法であり、根本的なコードの修正ではないことを理解しておきたい。本番環境では、エラーを画面に表示させず、ログだけに記録する設定が原則だ。

wp-config.php 編集手順
STEP 1 FTP またはサーバーのファイルマネージャーで WordPress インストールディレクトリにアクセスする
STEP 2 wp-config.php をダウンロードし、テキストエディタで開く
STEP 3 以下のコードを記述し、本番環境では debug display を徹底的に false にする
define('WP_DEBUG', true);
define('WP_DEBUG_LOG', true);
define('WP_DEBUG_DISPLAY', false);
@ini_set('display_errors', 0);
STEP 4 上書き保存してサーバーにアップロードする

上記の設定により、PHP の警告は画面に表示されなくなるが、/wp-content/debug.log には引き続き記録される。完全にログ出力自体をやめたい場合は WP_DEBUG を false にするが、別の問題が起きたときに原因究明が遅れるため、ログへの記録は有効にしたまま画面への表示を切る方法が現実的だ。

緊急時の応急処置としてコードを直接修正する

緊急時の応急処置としてコードを直接修正する

プラグインのアップデートがいつになるかわからず、かつデバッグ表示オフではカスタマイザー上での操作に支障が出るなどワークフロー上の問題がある場合、最終手段としてプラグインのソースコードを直接修正する手がある。

具体的には、配列のキーを読み込む前に、そのキーが存在するかチェックするか、PHP 7.0 から導入された Null 合体演算子(??)を使ってデフォルト値を与える。先の例でいえば、$field['value'] という部分を $field['value'] ?? '' に書き換えれば、キーが存在しない場合は空文字が代入され、警告は出なくなる。

暫定コード修正の Before/After
Before(エラー)
value=""
After(安全)
value=""
キー未定義時のWarning発生  Null合体演算子で空文字を代入

この作業は必ず「FTP を使えるか」「バックアップが取れるか」という前提の下で行う。くれぐれも子テーマで上書きできる範囲の関数であれば function.php に記述するべきだが、プラグインのコアファイルは直接触らざるを得ない。修正後はそのプラグインの自動更新を一旦停止し、公式の修正版がリリースされたら必ず元に戻してアップデートする手順を徹底する必要がある。

よくある質問

このエラーはサイトを完全に停止させる致命的なエラーですか

多くの場合、これは「Warning(警告)」であり、サイトの表示が真っ白になるような「Fatal error(致命的エラー)」とは性質が異なる。サイトは表示され続けるが、サーバーのエラーログファイルが短期間で肥大化する原因になる。また、管理画面のウィジェット設定画面やカスタマイザーでレイアウトが崩れたり、意図しない文字列が出力される可能性はある。

WP_DEBUG を false にすれば解決しますか

WP_DEBUG を false にすれば、エラーメッセージが実際のサイト画面やログファイルにすら出力されなくなる。しかしこれは「警告を見えなくした」だけであり、コードの潜在的な問題が解決したわけではない。PHP 8.x における動作が保証されていないコードを放置することになるため、開発環境ではログを取りつつ、本番環境では画面表示を切るという運用が基本になる。

エラーログの場所がわかりません

WP_DEBUG_LOG が true の場合、通常は /wp-content/debug.log に出力される。サーバーのコントロールパネル(cPanel など)に「エラーログ」機能がある場合はそちらにも記録される。FTP でアクセスしても見つからない場合は、wp-config.php で WP_DEBUG_LOG が正しく定義されているか、ファイルの書き込み権限があるかを確認する。

さくらインターネットやエックスサーバーで PHP 8.3 に変更したらこのエラーが出ました

国内の主要レンタルサーバーでは、管理画面から PHP のバージョンを簡単に切り替えられる。PHP 7.4 から 8.3 へ一気に上げると、旧式のコードを抱えたプラグインやテーマが一斉に警告を出すことがある。切り替え前にローカルやステージング環境で動作確認を行うのが理想だが、もし本番環境で出てしまった場合は、まずプラグインの一括更新を試し、それでも直らないものだけ個別に開発元へ報告するのが現実的な対処法だ。

functions.php でエラーの轍を消せませんか

残念ながら、特定のプラグインが内部で無造作に配列を直接参照している場合、テーマの functions.php からその挙動を直接上書きしてなかったことにはできない場合が多い。プラグインのコードに isset() などが欠如しているならば、前述の通りプラグインファイル自体を修正するか、プラグインのフックが用意されていればそれで値を事前に定義するなどの手段を取る必要がある。

この記事のポイント

  • 「Undefined array key」は PHP 8.x で厳格化された構文チェックが原因
  • プラグインを最新バージョンに更新することで根本解決する
  • 一時しのぎには wp-config.php で WP_DEBUG_DISPLAY を false に設定する
  • Null 合体演算子(??)を用いたコード修正は応急処置であり、アップデートで上書きされる前提で行う
  • エラーログの肥大化を防ぎつつ、開発元へ報告することで結果的にエコシステム全体が改善される
WordPressエディタが真っ白になる原因と直し方

WordPressエディタが真っ白になる原因と直し方

管理画面のブロックエディタを開いた際に編集エリアが完全に白紙になる主な原因は、プラグインやテーマの競合、または PHP の致命的エラーだ。まず標準テーマへの切り替えと全プラグインの無効化で原因を特定し、それでも解決しない場合はデバッグモードでエラーログを確認する。

エディタ画面が真っ白になる根本的な原因

エディタ画面が真っ白になる根本的な原因

WordPress のブロックエディタ(Gutenberg)で編集画面を開いたときに真っ白なページしか表示されない現象は、大きく分けて 2 つの原因で発生する。1 つはプラグインやテーマの競合、もう 1 つは PHP の致命的エラー(「このサイトで重大なエラーが発生しました」と表示される類のもの)だ。

ブロックエディタは JavaScript を多用する高度な画面であり、複数のプラグインが読み込むスクリプト同士で競合が起きると、画面の描画が完全に停止してしまう。またテーマが古い jQuery や独自のエディタ拡張をロードしている場合も、エディタの初期化処理と衝突して空白画面を引き起こす。

PHP の致命的エラーが原因の場合は、エディタ画面そのものが生成される前に処理が中断されている状態だ。たとえばメモリ不足や、特定のプラグインが要求する PHP 拡張機能の不足、あるいは functions.php に記述された独自コードの文法ミスなどが該当する。こうしたエラーは管理画面全体に影響する場合もあるが、投稿編集画面だけが重い処理を要求するタイミングで発覚することも多い。

■ 白紙エディタの主な原因
JavaScript の競合
複数のプラグインやテーマが読み込むスクリプトが衝突し、エディタの初期化が止まる
PHP の致命的エラー
メモリ不足・プラグインの不具合・functions.php の記述ミスなどで画面生成前に停止
REST API の障害
セキュリティプラグインやサーバー設定が WordPress の REST API 通信を遮断している

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

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

まず最初に試すべきは、プラグインの全無効化と標準テーマへの切り替えだ。この手順だけで多くの白紙エディタ問題は解決する。管理画面にアクセスできる状態であれば、以下の流れで原因を特定できる。

STEP 1 管理画面の「プラグイン」→「インストール済みプラグイン」で全プラグインを一括無効化する
STEP 2 「外観」→「テーマ」で Twenty Twenty-Five などの標準テーマを有効化する
STEP 3 エディタを再度開き、正常に表示されるか確認する
STEP 4 正常化したらプラグインを 1 つずつ再有効化し、問題が再発するタイミングで原因を特定する
STEP 1〜2 でほとんどの問題が解決する

Health Check プラグインで訪問者に影響を与えずに調査する

本番サイトでプラグインを一括無効化すると、訪問者に見えているサイトのレイアウトが一時的に崩れるリスクがある。プラグイン「Health Check & Troubleshooting」を導入すれば、自分がログインしている間だけプラグイン無効化とテーマ切り替えが適用され、一般の訪問者には通常通りの表示が保たれる。

「Health Check & Troubleshooting」は WordPress.org の公式プラグインディレクトリから無料でインストールできる。有効化後に「トラブルシューティング」タブを開き「トラブルシューティングモードを有効にする」ボタンを押すだけで、安全に調査を開始できる。特定のプラグインだけを個別に再有効化しながら編集画面の挙動を確認できるため、競合元の絞り込みに非常に有効だ。

テーマの functions.php が原因になるケース

標準テーマに切り替えた途端にエディタが正常化した場合、それまで使っていたテーマ(あるいは子テーマ)の functions.php に問題がある可能性が高い。よくあるのは、エディタ向けのカスタムスタイルやブロック追加のコードが WordPress のバージョンアップ後に非推奨の関数を使い続けているケースだ。

functions.php の中で add_action('enqueue_block_editor_assets', ...)add_filter('block_editor_settings_all', ...) を使ってエディタに介入している箇所があれば、それらを一旦コメントアウトして様子を見ると原因の切り分けになる。

デバッグモードでエラーログを取得する

デバッグモードでエラーログを取得する

プラグインとテーマの切り分けでも解決しない場合、PHP の致命的エラーが発生している可能性が高い。画面には何も表示されないが、裏側でエラーが起きている。そこで WordPress のデバッグモードを有効にして、エラーログをファイルに記録させる。

wp-config.php にデバッグ定数を追加する

FTP やレンタルサーバーのファイルマネージャーでサーバーに接続し、WordPress のルートディレクトリにある wp-config.php を編集する。ファイル末尾の /* That's all, stop editing! */ よりも手前に、以下の 3 行を追加または上書きする。

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

WP_DEBUG を true にするとデバッグモードが有効になる。WP_DEBUG_LOG を true にすると、エラーの内容が /wp-content/debug.log ファイルに出力される。WP_DEBUG_DISPLAY を false にしておけば、エラーが画面に表示されず、訪問者にも影響が出ない。

設定後に問題のエディタ画面を再度開き、その後 /wp-content/debug.log をテキストエディタで開く。PHP のエラーメッセージが記録されていれば、どのファイルの何行目で問題が起きているかが具体的にわかる。たとえば「Allowed memory size of 〜 bytes exhausted」ならメモリ不足、「Call to undefined function 〜」なら関数の未定義が原因だと絞り込める。

debug.log でよく見られるエラーと対処
メモリ不足
「Allowed memory size of 〜 bytes exhausted」→ wp-config.php で define('WP_MEMORY_LIMIT', '256M'); を追加
未定義の関数
「Call to undefined function 〜」→ 該当のプラグイン/テーマを最新版に更新するか無効化
正常な場合
debug.log が空、または Notice/Warning のみ → PHP エラーは原因ではない

ブラウザの開発者ツールで JavaScript エラーを確認する

ブラウザの開発者ツールで JavaScript エラーを確認する

PHP のエラーログに何も記録されていない場合、JavaScript の実行時エラーが原因でエディタが空白になっている可能性が高い。この場合はブラウザの開発者ツールを使う。

Chrome の場合、編集画面を開いた状態でキーボードの F12 キーを押して開発者ツールを起動し、「Console」タブを選択する。赤いエラーメッセージが表示されていれば、それがエディタの読み込みを止めている原因だ。Uncaught TypeErrorUncaught ReferenceError のようなエラーが出ていれば、特定のスクリプトが正しく動作していないことを示している。

エラーの内容にプラグイン名やテーマ名が含まれていることが多いため、そのプラグインを無効化すれば問題が解決する。コンソールにエラーが一切出ていない場合は、REST API の通信が遮断されているケースが疑われる。開発者ツールの「Network」タブで、wp-json を含むリクエストが赤く表示されていないか確認する。401(認証エラー)や 403(禁止)が返っている場合は、セキュリティプラグインやサーバー側の WAF(Web アプリケーションファイアウォール)が REST API をブロックしている可能性が高い。

よくある質問

プラグインを無効化する管理画面すら真っ白で開けない場合はどうするのか

FTP またはレンタルサーバーのファイルマネージャーで /wp-content/plugins/ ディレクトリにアクセスし、プラグインフォルダを一時的に別の名前にリネームする。たとえば plugin-name_plugin-name に変更すれば、WordPress はそのプラグインを認識しなくなり、管理画面にアクセスできるようになる。

特定のページだけエディタが真っ白になるのはなぜか

特定のページに埋め込まれたショートコードやブロックが、対応するプラグインの JavaScript エラーを引き起こしている可能性が高い。またページのリビジョン数が極端に多い場合も、エディタの読み込みが重くなりタイムアウトすることがある。リビジョンを整理するか、該当ページを複製して編集し直すと改善する場合がある。

ブラウザを変えても同じ症状か確認したほうがよいか

確認する価値はある。まれにブラウザの拡張機能(特に広告ブロッカーやセキュリティ系)がブロックエディタのスクリプトを遮断しているケースがある。シークレットウィンドウや別のブラウザでログインして編集画面を開き、同じ症状が出るかどうかを見ると、ブラウザ側の要因かどうかを切り分けられる。

WordPress 本体の再インストールは効果があるか

コアファイルの破損が疑われる場合に限り効果がある。管理画面の「ダッシュボード」→「更新」から「WordPress を再インストール」を選ぶと、コアファイルだけがクリーンな状態に置き換わる。テーマやプラグイン、データベースには影響しないため、手軽に試せる。ただしプラグインの競合や PHP エラーが原因の場合は再インストールしても改善しない。

編集画面が真っ白な状態で記事を更新する応急的な方法はあるか

ブロックエディタが使えない場合の回避策として、クラシックエディタプラグインを有効化する方法がある。旧式の編集画面に切り替わるため、JavaScript の競合の影響を受けにくい。根本解決ではないが、急ぎの更新作業が必要な場合の一時的な回避策として使える。また「QuickPost」のような外部ツールを使う方法もあるが、環境に依存するため万能ではない。

この記事のポイント

  • エディタの白紙はプラグイン/テーマ競合か PHP エラーが主因
  • 全プラグイン無効化と標準テーマ有効化で原因を切り分ける
  • Health Check プラグインで訪問者に影響なく調査できる
  • wp-config.php のデバッグ設定でエラーログを取得する
  • ブラウザの開発者ツールで JavaScript エラーも確認する
WordPressでPHP致命的エラーがobject-cache.phpに発生した時の直し方

WordPressでPHP致命的エラーがobject-cache.phpに発生した時の直し方

WordPress で「Call to a member function get() on null」という PHP の致命的エラーが object-cache.php で発生する場合、原因はオブジェクトキャッシュプラグイン(SQLite Object Cache)の初期化失敗にある。PHP バージョンアップグレード後に必要な PHP 拡張機能(sqlite3、igbinary、apcu 等)が有効でないことが主な引き金だ。緊急復旧にはプラグインの無効化とキャッシュファイルの削除を、恒久対策には拡張機能の有効化とプラグインの再設定を行う。

このエラーが起きる根本的な原因

このエラーが起きる根本的な原因

対象のエラーは WordPress の起動シーケンスのごく初期段階で発生する。wp-settings.php が wp_start_object_cache() を呼び出す際、SQLite Object Cache プラグインが WP_Object_Cache クラスのインスタンスを生成しようとする。ここで PHP の sqlite3 拡張がロードされていない、あるいはデータベースファイルへの書き込み権限がないなどの理由でコンストラクタが失敗すると、null が返る。その後の処理で null に対して get() メソッドを呼び出そうとして致命的エラーに至る。

スタックトレースを見ると wp_cache_get → wp_load_alloptions → get_option → wp_check_invalid_utf8 → esc_html とエスカレーションしている。これはオブジェクトキャッシュが機能しない状態で、WordPress が初期設定値(blog_charset 等)を取得しようとする過程で表面化した二次的なエラーだ。根はあくまでキャッシュ層の初期化失敗にある。

とくに PHP を手動またはホスティング側でアップグレードした直後に顕在化しやすい。新しい PHP バージョンでは過去に有効だった拡張機能がデフォルト無効になっていたり、パスが変わっていたりするため、プラグインの前提条件が崩れる。

サイトを即時に復旧させる手順

サイトを即時に復旧させる手順

まずは管理画面にアクセスできない状態を脱する必要がある。エラーが object-cache.php の読み込み時に起きて WordPress 全体が停止するため、管理画面経由でのプラグイン停止は不可能だ。FTP またはサーバーのファイルマネージャーを使う。

STEP 1 FTP で /wp-content/ にアクセスする
STEP 2 object-cache.php を削除する
STEP 3 /wp-content/plugins/sqlite-object-cache/ フォルダを削除する
STEP 4 サイトにアクセスし復旧を確認する

上記の手順でキャッシュ関連ファイルが除去され、WordPress はデフォルトのキャッシュ機構にフォールバックして起動する。この状態では速度面での最適化は失われるが、少なくともサイトは表示され管理画面にも入れる。緊急避難として有効な手段だ。

恒久的にエラーを解決する方法

恒久的にエラーを解決する方法

一時しのぎで復旧したあとは、SQLite Object Cache プラグインを正常に動作させるための根本対応を行う。PHP 8.4 で必要な拡張機能を確認し、サーバー設定を見直す。

PHP 拡張機能が有効か確認する

レンタルサーバーの管理パネルから PHP 設定を開き、sqlite3 拡張にチェックが入っているか確認する。多くのサーバーでは PHP バージョンごとに拡張のオンオフを切り替えられる。バージョンアップ時にデフォルト設定がリセットされ、sqlite3 が外れていることがよくある。

さらにパフォーマンスを引き出すために igbinary と apcu も有効にしておくと良い。igbinary はデータをバイナリ形式でシリアライズしてキャッシュ容量を節約し、apcu は PHP のユーザーキャッシュとしてメモリ上にデータを保持する。いずれも SQLite Object Cache プラグインが内部的に使用する。

プラグインを再インストールして設定する

先の手順でプラグインフォルダを削除した場合は、WordPress 管理画面から「プラグイン」→「新規追加」で SQLite Object Cache を検索し、再インストールする。有効化すると自動的に object-cache.php が wp-content 直下に再生成される。

有効化後、プラグインのステータス画面で「接続が確立されている」旨の表示が出れば正常だ。もしエラーが再発するようなら、wp-content ディレクトリのパーミッションが適切か(通常 755 または 775)も確認する。

自動読み込みオプションを整理する

質問の状況では自動読み込みオプション(autoloaded options)が 10MB に達していた。これは標準の数百 KB に比べるとかなり大きく、キャッシュ構築時にメモリを圧迫してエラーを誘発する一因になりうる。不要なオプションを整理することで、オブジェクトキャッシュの初期化負荷を下げられる。

長期運営サイトでは、過去にインストールして削除したプラグインの設定値が wp_options テーブルに残り、自動読み込みフラグがオンのまま放置されていることが多い。WP-CLI が使える環境なら wp option list --autoload=yes --format=table で一覧を取得し、不要なものを wp option delete で削除する。あるいは Advanced Database Cleaner のようなプラグインで掃除する方法もある。

再発を防ぐための設定ポイント

再発を防ぐための設定ポイント

PHP バージョンアップ時には事前にステージング環境でプラグイン互換性をテストしておくのが理想だ。しかし実際には共有サーバーで本番一発のバージョンアップが行われるケースも多い。そうした環境では、少なくとも次の3点をルーティン化しておくと安全だ。

  • PHP 拡張機能の有効リストをバージョンアップ前後で比較する
  • object-cache.php の存在とプラグイン状態をアップグレード直後に確認する
  • 自動読み込みオプションのサイズを定期的に監視し肥大化を防ぐ
エラー状態(PHPアップグレード直後)
sqlite3 拡張 無効 → オブジェクトキャッシュ初期化失敗 → サイト全体停止
正常状態(修正後)
sqlite3 拡張 有効 → キャッシュ正常稼働 → サイト表示速度も改善
エラー状態  修正後

このデモのとおり、PHP アップグレード直後は拡張機能の設定がリセットされてエラー状態に陥りやすい。事前に必要な拡張機能リストを控えておき、アップグレード後に同じ設定を復元する手順を習慣化することで再発を防げる。

よくある質問

管理画面にも入れず FTP も使えない場合はどうすればよいか

レンタルサーバーのファイルマネージャー(cPanel 等)から直接 wp-content にアクセスし、object-cache.php とプラグインフォルダを削除する。これで WordPress が起動できるようになる。どうしても操作できない場合はサーバー会社のサポートに依頼して該当ファイルの除去を代行してもらう。

SQLite Object Cache をやめて別のキャッシュプラグインに移行してもよいか

もちろん問題ない。Redis Object Cache や Memcached など、サーバーが対応している別の永続オブジェクトキャッシュを使う選択肢もある。ただし Redis や Memcached はサーバー側でデーモンを起動する必要があるため、共有サーバーでは使えないことも多い。その点 SQLite Object Cache はファイルベースで動くため導入障壁が低い。

object-cache.php だけ削除してプラグインは残しても大丈夫か

一時的な復旧としては有効だが、プラグインを再有効化すると object-cache.php が自動再生成され、拡張機能の問題が解決していなければ同じエラーが再発する。恒久対応としては必ず PHP 拡張機能を有効にしてから再インストールする必要がある。

自動読み込みオプションが 10MB を超えるのは異常なのか

かなり大きい部類に入る。通常のサイトでは数百 KB から高くても 2〜3MB 程度だ。10MB になるとキャッシュ初期化時のクエリ負荷が無視できず、メモリ制限の低い環境ではエラーの遠因になる。定期的な整理が推奨される。

SQLite Object Cache プラグインの代替手段はあるか

同プラグインはファイルベースの永続キャッシュとして優秀だが、もし拡張機能周りで繰り返し問題が起きるなら、WP Super Cache や W3 Total Cache のようなページキャッシュ系プラグインと、Transients のデータベース管理を組み合わせて代替する手もある。ただしオブジェクトキャッシュのパフォーマンスメリットは一部犠牲になる。

この記事のポイント

  • PHP の致命的エラーは object-cache.php の初期化失敗が原因で起きている
  • sqlite3 拡張機能が無効になっていることが最大の引き金
  • 緊急復旧には object-cache.php とプラグインフォルダの削除が有効
  • 恒久対策では PHP 拡張機能の再有効化とプラグイン再インストールを行う
  • 自動読み込みオプションの肥大化もエラーを誘発するため定期的な整理が必要
WooCommerceバリエーション商品のカート追加で重大エラーが出る時の修正方法

WooCommerceバリエーション商品のカート追加で重大エラーが出る時の修正方法

WooCommerce のブロックベースカートでバリエーション商品を追加した際に「woo-min-max-quantity-step-control-single」プラグインが原因で「このサイトで重大なエラーが発生しました」と表示される場合、原因はプラグインが商品オブジェクトの取得失敗を考慮していないことだ。該当ファイルの PHP コードに数行の修正を加えればエラーを回避できる。

なぜブロックカートでバリエーション商品だけエラーになるのか

エラーログを確認すると、問題はプラグインの min-max-controller.php 872行目付近で発生している。この行では wc_get_product() で商品情報を取得した直後に ->get_id() を呼んでいるが、wc_get_product() は対象の商品が見つからなかった場合に false を返す。ブロックベースのカート(Store API)経由でバリエーション商品が追加されると、この関数がまれに false を返す状況が発生する。プラグインのコードはその可能性をまったく想定しておらず、結果として「Call to a member function get_id() on false」という致命的な PHP エラーに直結している。

エラーを根本解決するためのコード修正手順

エラーを根本解決するためのコード修正手順
STEP 1 FTP や管理画面から該当ファイルを探す
STEP 2 872 行目付近のコードを確認し false チェックを追加する
STEP 3 修正したファイルをサーバーにアップロードする

該当ファイルを開き 872 行目周辺を特定する

FTP クライアント、またはレンタルサーバーのファイルマネージャーで、以下のパスにあるファイルを開く。WordPress 管理画面の「プラグイン」→「プラグインファイルエディター」から編集するのはできるだけ避ける。エディター画面で編集ミスをするとサイト全体が停止するリスクがあるためだ。

/wp-content/plugins/woo-min-max-quantity-step-control-single/includes/min-max-controller.php

使用しているエディタで行番号表示を有効にし、872 行目付近まで移動する。エラーログに表示されているとおり、->get_id() を直接呼んでいる箇所を探そう。

修正前と修正後のコードを比較する

修正前(エラー) Before
$product = wc_get_product( $product_id );
$min = $product->get_id();
修正後(安全) After
$product = wc_get_product( $product_id );
if ( ! $product || ! is_a( $product, ‘WC_Product’ ) ) {
    return;
}
$min = $product->get_id();
エラー状態  修正後

PHP コード修正の内容と意味

修正の核心は、$product が有効なオブジェクトかどうかを事前に検証することだ。

! $productwc_get_product()false を返した場合を検出する。is_a( $product, 'WC_Product' ) は、取得できたとしてもそれが WooCommerce の正規の商品オブジェクトであることを確認する。どちらかの条件を満たさなければ return で処理を中断し、以降の ->get_id() が呼ばれないようにする仕組みだ。

このガード節を入れることで、ブロックカート経由でどういった商品情報が渡ってきても、致命的なエラーにはならなくなる。

修正してもエラーが直らない場合の確認点

まれに、修正だけでは根本解決しないケースがある。以下の点も確認してみてほしい。

WooCommerce データベースのクリーンアップを実行する

「WooCommerce」→「ステータス」→「ツール」タブに移動し、「WooCommerce トランジェントをクリア」と「期限切れのトランジェントを削除」を実行する。キャッシュが原因で商品情報が正しく取得できていない場合に効果がある。

最小最大数量プラグインのバージョンと WooCommerce のバージョンを確認する

プラグインが最新の WooCommerce や Store API に対応していない可能性がある。プラグインの公式ページで対応バージョンを確認し、場合によっては別の数量制御プラグインを検討する必要がある。修正を加えても根本的な設計の問題で他の不具合が発生する場合は、開発者に修正リクエストを送りつつ、一時的に従来のショートコードカート([woocommerce_cart])へ切り戻すことも視野に入れる。

よくある質問

この問題はブロックカートだけに発生するのか

主にブロックベースのカートとチェックアウト(Store API)で発生する。従来のショートコードカートではエラーが出ないことも多いが、プラグインコードに潜在的な問題があるため、修正しておく方が安全だ。

プラグインがアップデートされたら修正は消えるか

消える。今回の修正はプラグインのコアファイルを直接編集しているため、プラグインにアップデートが配信されると編集内容は上書きされる。アップデート後に同様のエラーが再発した場合は、再び同じ手順で修正するか、開発者が修正を取り込むまでアップデートを控える必要がある。

子テーマの functions.php でこのエラーを回避できるか

難しい。今回のエラーはプラグイン内部の特定の行で発生しており、かつ商品取得のロジック周辺にフックが用意されていない限り、テーマファイル側から割り込んで防御することはできない。直接ファイルを編集する今回の方法が最も確実な対処法になる。

修正中にサイトが壊れてしまった場合の直し方は

FTP でサーバーにアクセスし、修正前にバックアップしておいた min-max-controller.php を上書きアップロードする。バックアップがない場合は、プラグインを一度削除して再インストールするのが早い。ただし、プラグインの設定内容はあらかじめメモしておく必要がある。

この記事のポイント

  • エラー原因はプラグイン内での get_id() 呼び出し前に false チェックがないこと
  • 修正対象は min-max-controller.php の 872 行目付近
  • wc_get_product()false を返す状況を考慮したガード節を追加する
  • ブロックカート(Store API)利用時に特に発生しやすい PHP エラーへの対処法
  • 直接ファイルを修正するため、プラグインのアップデートで編集が上書きされる点に注意
Booking Calendar更新後にサイトが壊れた時の原因と直し方

Booking Calendar更新後にサイトが壊れた時の原因と直し方

Booking Calendar プラグインを 11.4.1 から 11.4.2 へ更新した直後にサイトが壊れた場合、無料版(Booking Calendar)と有料版(Booking Calendar Pro または Booking Manager)のバージョン不一致が主要因だ。手動で両方を同一の最新バージョンに揃え、かつ Pro 版のライセンスを再適用すれば復旧できる。

なぜバージョン 11.4.2 への更新でサイトが壊れたのか

なぜバージョン 11.4.2 への更新でサイトが壊れたのか

Booking Calendar は無料版(WordPress.org 配布)と、追加機能を提供する Pro 版(開発元サイトで購入)が連携して動作する設計になっている。無料版は管理画面の「プラグイン」から自動更新される一方、Pro 版は手動で更新する必要がある。両者のバージョンが食い違うと、共有する関数やデータベース構造に不整合が生じ、PHP の致命的エラーを引き起こして画面が表示されなくなる。

とくに 11.4.2 では内部 API の変更が加えられており、Pro 版が旧バージョンのまま無料版だけを更新すると競合が起きやすい。この状態で WordPress の「このサイトで重大なエラーが発生しました」というメッセージが表示されたり、管理画面にアクセスできなくなったりする。

サイトを元に戻す具体的な手順

サイトを元に戻す具体的な手順

以下の手順で、無料版と Pro 版を安全に最新へ揃える。作業前に必ずサイト全体のバックアップを取得しておく。

STEP 1 FTP またはホスティングのファイルマネージャで /wp-content/plugins/ にアクセスする
STEP 2 無料版と Pro 版の両方のフォルダを一時的にリネームして無効化する(例: bookingbooking_old
STEP 3 無料版を WordPress.org から最新版(11.4.2)で再インストールし有効化する
STEP 4 開発元サイトから Pro 版の最新をダウンロードし、管理画面からアップロードして有効化、ライセンスキーを再入力する

プラグインフォルダを特定して無効化する

サイトが壊れて管理画面に入れない場合は、FTP(File Transfer Protocol)クライアントやレンタルサーバーのファイルマネージャを使う。/wp-content/plugins/ ディレクトリ内に、無料版(通常は booking または booking-calendar)と Pro 版(booking-calendar-prowpdev-booking など)のフォルダが存在する。両方をリネームすれば、WordPress はプラグインを強制的に無効化し、サイトが最低限の状態で表示されるようになる。リネーム後のフォルダ名は削除せず控えておく。

無料版を最新にして Pro 版を再適用する

管理画面にアクセスできる状態になったら、プラグイン一覧画面で一度 Booking Calendar を削除する。削除しても予約データはデータベースに保持されるため、消えることはない。その後「新規追加」から再度 Booking Calendar 11.4.2 をインストールし有効化する。

続いて開発元サイト(wpbookingcalendar.com)のアカウントページから、無料版と同一バージョン(11.4.2)に対応した Pro 版の ZIP ファイルをダウンロードする。管理画面の「プラグイン」→「新規追加」→「プラグインのアップロード」から ZIP を投入し、有効化後にライセンスキーを入力すれば復旧が完了する。Pro 版の最新ファイルが入手できない場合は、開発元のサポートへ直接更新ファイルを依頼する。

どうしても復旧できない場合の最終手段

Pro 版の最新 ZIP が手元になく、サイトのダウンタイムが許容できない状況では、無料版を旧バージョン(11.4.1)にダウングレードする選択肢もある。WordPress.org のプラグインページにある「以前のバージョン」から 11.4.1 の ZIP を入手し、FTP で手動上書きすれば以前の動作に戻せる。ただしセキュリティ修正が含まれている可能性があるため、この状態は恒久的な対策にはならず、早期に Pro 版を最新化する必要がある。

再発を防ぐための運用ルール

再発を防ぐための運用ルール

Booking Calendar のように無料版と有料版が連動するプラグインは、無料版の自動更新をオフにするか、更新前に必ず Pro 版の対応バージョンがリリースされているかを確認する習慣をつける。開発元のチェンジログやメーリングリストを購読しておくと、更新のタイミングを逃さない。

また本番環境に直接適用する前に、ステージング環境(本番と同一構成のテストサイト)で無料版と Pro 版の同時更新を試すのが最も確実な予防策になる。レンタルサーバーのステージング機能を使うか、WP Staging のようなプラグインで簡易的なテスト環境を用意できる。

よくある質問

Pro 版の最新ファイルがアカウントページに見当たらない場合はどうすればよいか

開発元の公式サイトにある問い合わせフォームまたはサポートチケットから、Pro 版の最新 ZIP ファイルを直接依頼する。購入時のメールアドレスやライセンスキーを記載すれば、通常は数営業日以内にダウンロードリンクが提供される。

フォルダをリネームしたがサイトがまだ壊れている

キャッシュ系プラグインや CDN(コンテンツデリバリネットワーク / 配信網)が古いエラー画面を配信し続けている可能性がある。サーバー側のキャッシュをすべてクリアし、ブラウザのシークレットモードで確認する。また wp-content/mu-plugins/ に手動で入れたファイルが競合していないかも調べる。

ライセンスキーを入力しても Pro 版の機能が有効にならない

ライセンスキーが旧バージョン向けのまま失効している可能性がある。開発元のマイページでキーを再発行するか、サポートにキーのリセットを依頼する。ドメインを変更した場合もライセンスの再割り当てが必要になる場合がある。

この記事のポイント

  • Booking Calendar 11.4.1 から 11.4.2 への更新障害は無料版と Pro 版のバージョン競合が原因
  • FTP で両方のプラグインフォルダをリネームし強制無効化して管理画面へ復帰
  • 無料版は削除後に 11.4.2 を再インストール、Pro 版は開発元から同一バージョンを入手
  • Pro 版がすぐ用意できない場合は無料版のみ旧バージョン 11.4.1 に戻す応急処置も可能
  • 再発防止には無料版の自動更新を止め、Pro 版のリリース確認後に揃えて更新する
myCred Toolkit Pro アップデート後の致命的エラーと復旧手順

myCred Toolkit Pro アップデート後の致命的エラーと復旧手順

WordPress サイトで myCred Toolkit Pro をアップデートした直後に「Class MWP_Module not found」という致命的エラーが発生し管理画面にもアクセスできなくなった場合は、最新バージョンで修正済みの可能性が高い。修正がまだ提供されていない場合でも、クラスファイルの読み込み順序を確認し手動で修正すれば復旧できる。

MWP_Module クラスが見つからない致命的エラーはなぜ起こるのか

MWP_Module クラスが見つからない致命的エラーはなぜ起こるのか

このエラーは、myCred Toolkit Pro 内の WooCommerce Plus 改修版アドオンが読み込まれる際、ベースクラス(親クラス)である MWP_Module がまだ定義されていない状態で、子クラスが呼び出されるために発生する。具体的には class-mwp-module-coupons.phpMWP_Module を継承しようとするが、その元となる抽象クラスファイルが先に読み込まれていないのだ。

本来なら abstract/class-mwp-abstract-module.php が先にロードされるべきところ、プラグインのアップデート時にファイルの欠落が起きたり、オートローダーの設定不備で読み込み順序が狂ったりすると、このエラーが表面化する。PHP は未定義クラスへの継承を許さないため、サイト全体が致命的エラーで停止してしまう。

アップデート直後にサイトがダウンした場合の緊急復旧手順

アップデート直後にサイトがダウンした場合の緊急復旧手順

エラーによって WordPress 管理画面にも入れなくなった状態では、FTP クライアントやサーバーのファイルマネージャを使ってプラグインを強制的に無効化する必要がある。データベースを直接操作する方法もあるが、ファイル名の変更がもっとも手軽で確実だ。

STEP 1 FTP クライアントでサーバーに接続し、/wp-content/plugins/ ディレクトリへ移動する
STEP 2 mycred-toolkit-pro フォルダを右クリックし、「名前の変更」で末尾に _disabled を付ける
STEP 3 ブラウザでサイトにアクセスし、管理画面 /wp-admin/ へログインできるか確認する
STEP 4 管理画面に入れたら、プラグイン一覧で Toolkit Pro が「無効」になっていることを確認し、旧バージョンへ差し替える準備をする

上の手順でプラグインを無効化すれば、サイトは正常に表示されるようになる。続いて、動作していた旧バージョン(例として 1.0.4)を再インストールして有効化するか、修正版が配布されているかを確認する。

手動でクラスファイルの読み込み順序を確認し修正する方法

手動でクラスファイルの読み込み順序を確認し修正する方法

開発元の修正版がまだ提供されていない、あるいは修正を待てない場合は、プラグインのファイルを手動で編集してクラスの読み込み順序を修正できる。修正の要点は、class-mwp-module-coupons.php に到達する前にベースクラスを確実に読み込ませることだ。

問題のファイルと修正箇所を特定する

エラーログに出力されたパスをもとに、wp-content/plugins/mycred-toolkit-pro/includes/addons/mycred-woocommerce-plus/mycred-woocommerce-plus-revamped/modules/class-mwp-module-coupons.php を開く。7 行目付近で MWP_Module を継承しているクラス定義があるはずだ。

ベースクラスのファイルは wp-content/plugins/mycred-toolkit-pro/includes/addons/mycred-woocommerce-plus/mycred-woocommerce-plus-revamped/abstract/class-mwp-abstract-module.php に存在する。これが読み込まれていないことが原因なので、子クラスのファイルの先頭で明示的に require_once を追加する。

修正前(エラー発生)
1 <?php
2
3 // エラー: 親クラスが不明
4 class MWP_Module_Coupons extends MWP_Module {
5
修正後(正常動作)
1 <?php
2 require_once plugin_dir_path( __FILE__ ) .
3 ../abstract/class-mwp-abstract-module.php‘;
4
5 class MWP_Module_Coupons extends MWP_Module {
6
修正前(親クラス未定義のまま実行)  修正後(require_once で事前に読み込み)

上記のように require_once を追加することで、クラス定義より前にベースクラスを確実に読み込める。ただし、この修正は自作テーマの functions.php に書くような一時しのぎとは異なり、プラグインのコアファイルを直接編集するため、アップデートで上書きされる可能性がある点を理解しておく必要がある。

オートローダーの確認と修正

モダンなプラグインは PHP のオートローダー(Composer の autoload など)を使ってクラスを動的に読み込む仕組みを採用している。myCred Toolkit Pro も Composer ベースのオートロードを利用している可能性が高く、composer.json の autoload 設定や名前空間のマッピングが正しいかを確認すると根本的な解決につながる。

プラグインディレクトリで composer dump-autoload -o を実行し、クラスマップを再生成するのも有効な手だ。ただし、サーバーに Composer がインストールされている必要があるため、ローカル環境で再生成してからファイルをアップロードする方法が現実的だ。

修正版がリリースされている場合の安全なアップデート手順

修正版がリリースされている場合の安全なアップデート手順

開発元から修正版が提供された場合、本番環境にいきなり適用するのは避け、最初にステージング環境で動作確認を行うのが鉄則だ。致命的エラーはサイト全体を巻き込むため、万が一のときに備えて必ずバックアップを取る。

STEP 1 本番サイトのデータベースと全ファイルをバックアップする(プラグイン「UpdraftPlus」やサーバー側のスナップショット機能を使う)
STEP 2 ステージング環境にバックアップを復元し、Toolkit Pro を最新版へアップデートする
STEP 3 WooCommerce のポイント付与やクーポン連携が正常に動くか、テスト注文を行って検証する
STEP 4 問題なければメンテナンス時間帯を設け、本番環境でも同様にアップデートする

ステージング環境がない場合は、本番環境の深夜帯などアクセスが少ない時間にメンテナンスモードへ切り替えてから実施する。アップデート後すぐに管理画面へアクセスできるか、フロントエンドにエラーが出ていないかを確認し、問題があればすぐに旧バージョンへロールバックできるよう、ファイルのバックアップを手元に残しておく。

よくある質問

myCred 本体をアップデートしていないと同様のエラーは起きるか

プラグインによっては、本体(myCred コア)とアドオン(Toolkit Pro)のバージョンに互換性が要求される。MWP_Module クラスは Toolkit Pro 内部の抽象クラスなので myCred コアのバージョンに直接は依存しないが、コアが古すぎると別の非互換エラーを引き起こす可能性がある。常に両方を最新に保つことが望ましい。

修正版が出るまでサイトを止めておくべきか

致命的エラーでサイトが完全に停止しているなら、前述の緊急復旧手順でプラグインを無効化するか旧バージョンへ巻き戻し、通常運用を再開してよい。ポイント機能が止まる影響を考慮し、必要なら代替手段を顧客に案内する。

エラーログはどこで確認できるか

WordPress のデバッグモードを有効にしていれば /wp-content/debug.log にエラー詳細が出力される。有効でない場合は wp-config.phpdefine( 'WP_DEBUG', true );define( 'WP_DEBUG_LOG', true ); を記述する。レンタルサーバーによってはエラーログが管理画面から閲覧できる場合もある。

子テーマの functions.php で読み込み順序を修正できるか

テーマの functions.php はプラグインより後に読み込まれるため、この方法では MWP_Module クラスを事前に定義することはできない。プラグインファイルの直接編集が必須になる。

この記事のポイント

  • myCred Toolkit Pro アップデート後の MWP_Module クラス欠落エラーは、読み込み順序の不備が主因
  • 緊急復旧は FTP でプラグインフォルダをリネームし、旧バージョンへ差し替える
  • 手動修正では子クラスのファイル冒頭に require_once を追加する
  • 開発元修正版を適用する際は必ずバックアップとステージング検証を行う
  • PHP のオートローダー設定や Composer のクラスマップ再生成も有効なアプローチ
GTranslateで重大エラーが発生した時の原因と復旧手順

GTranslateで重大エラーが発生した時の原因と復旧手順

複数サイトで突然「このサイトで重大なエラーが発生しました」と表示され管理画面にアクセスできなくなった場合、GTranslate プラグインの翻訳ファイル(.po / .mo)に含まれる誤ったフォーマット指定子が原因である可能性が高い。

エラーログに “Unknown format specifier” と出ていれば、特定の言語ファイルに壊れた翻訳文字列が混入している。管理画面を復旧するには、問題のプラグインフォルダを一時的にリネームして無効化し、誤った翻訳文字列を修正したうえで再有効化する手順を踏む。

なぜ GTranslate で突然重大エラーが発生するのか

なぜ GTranslate で突然重大エラーが発生するのか

エラーの直接原因は翻訳ファイルの壊れた sprintf 指定子

WordPress でプラグインの翻訳を担うのは .po(翻訳テンプレート)と、それをコンパイルした .mo(機械可読ファイル)だ。プラグイン開発者が sprintf() で動的に文字列を組み立てている箇所に、翻訳者が誤って不完全な置換指定子(例:"%1$t" など)を入れてしまうと、PHP が文字列フォーマットを解釈できず E_ERROR(致命的エラー)を投げる。

とくに、GTranslate の無料版では管理画面の上部に「ニューラルネット翻訳へのアップグレードを促す通知バナー」を表示している。この通知文のスペイン語(es_ES)翻訳に、%1$s と書くべきところを %1$t とタイプミスした翻訳が混入し、スペイン語ロケールのサイトだけでなく、他の言語設定のサイトでも GTranslate が管理画面を読み込むたびにクラッシュする事象が確認されている。

なぜ他言語サイトまで影響を受けるのか

一見すると日本語や英語のサイトには無関係に思える。しかし GTranslate の管理画面通知は、サイトの表示言語に関係なく、プラグインに同梱された全翻訳ファイルを読み込んだうえで表示言語に合致する文字列を選択する実装になっている。この読み込み段階で誤った .mo ファイルがパースされると、sprintf() が例外をスローし、管理画面全体が停止する。

問題 スペイン語翻訳ファイルに %1$t が混入
結果 管理画面がすべての言語で「重大なエラー」停止
対処 プラグイン無効化 → 翻訳ファイル修正 → 再有効化
エラー発生箇所  修正後の流れ

管理画面にアクセスできない状態からの復旧手順

管理画面にアクセスできない状態からの復旧手順

FTP またはホスティングのファイルマネージャーでプラグインを強制無効化する

管理画面に入れないため、通常の「プラグイン」メニューからの無効化は使えない。FTP クライアント(FileZilla や Cyberduck など)、または契約しているレンタルサーバーのファイルマネージャー機能を使い、サーバー上のディレクトリを直接操作する。

STEP 1 FTP で /wp-content/plugins/ に移動
STEP 2 フォルダ名 gtranslate を右クリック → 「名前の変更」
STEP 3 gtranslategtranslate_deactivated に変更する
STEP 4 管理画面にアクセスできるか確認する

WordPress は指定されたフォルダ名のプラグインが存在しないと判断し、自動的に無効化する。管理画面にログインできたら、プラグイン一覧に GTranslate が「無効」と表示されていることを確認する。

壊れた翻訳ファイルを特定して修正する

問題の翻訳ファイルは /wp-content/languages/plugins/gtranslate-es_ES.po だ。この .po ファイルをテキストエディタで開き、誤ったフォーマット指定子を修正する。

  • 当該行を検索:msgstr "Puedes disfrutar de %1$t で始まる行を探す
  • %1$t%1$s に修正する(”t” の直後に “s” を足す)
  • ファイルを保存し、同名の .mo コンパイル済みファイルが存在する場合はいったん削除またはリネームする

.mo ファイルを削除せずに .po だけ修正しても、WordPress は既存の .mo ファイルを優先して読み込む。そのため修正が反映されず、再度エラーになるケースがある。必ず .mo ファイルを削除するか、Poedit などの専用ツールで新たにコンパイルし直す必要がある。

代替策として該当翻訳ファイルごと一時的に退避させる

.po ファイルの直接編集が難しい場合や、修正しても .mo が再生成されてエラーが戻ってしまう場合は、問題の言語ファイル一式を一時的に別フォルダへ退避させる手もある。

  • /wp-content/languages/plugins/ から gtranslate-es_ES.pogtranslate-es_ES.mo の両方を、サイト外のローカルフォルダに移動する
  • GTranslate プラグインフォルダを元の名前(gtranslate)に戻し、管理画面から再有効化する
  • 管理画面が正常に動作することを確認できたら、プラグイン作者のアップデートを待つ

これは根本解決ではないが、「とにかく今すぐ管理画面を復旧させたい」という状況では有効な暫定策になる。日本語サイトでの管理画面表示にはスペイン語翻訳ファイルは使用されないため、削除しても翻訳機能に影響は出ない。

再発を防ぐためにできること

再発を防ぐためにできること

プラグインの自動更新を一時停止して様子を見る

翻訳ファイルの自動更新は WordPress 本体の仕組みで行われ、プラグイン開発者が意図しないタイミングで新しい翻訳が配信されることがある。GTranslate のように多言語対応が複雑なプラグインは、管理画面から該当プラグインの自動更新をオフにし、公式のアップデート告知を確認してから手動更新する運用が安全だ。

エラーログを定期的にチェックする習慣をつける

今回のエラーは /wp-content/debug.log に記録されていた。WordPress のデバッグモード(wp-config.phpdefine('WP_DEBUG', true);define('WP_DEBUG_LOG', true); を記述)を有効にしておけば、管理画面が停止する前にエラーの予兆をログでキャッチできる。本番運用時は WP_DEBUG_DISPLAYfalse にして、エラーを画面に表示せずログだけに留める設定が推奨される。

よくある質問

他プラグインでも同じエラーは起きるのか

起きる。翻訳ファイルに不完全な sprintf() 指定子が混入する不具合は、どのプラグインでも発生しうる。管理画面が突然停止した場合、エラーログに “Unknown format specifier” と書かれていれば翻訳ファイルを疑うとよい。

FTP が使えない場合はどうすればいいか

契約しているレンタルサーバーの管理パネル(cPanel やコンパネ)にログインし、ファイルマネージャーを使う。GTranslate プラグインフォルダのリネーム操作はブラウザ上で完結する。

GTranslate の代わりに別の翻訳プラグインに乗り換えるべきか

このエラーは翻訳ファイルの一時的な不備であり、プラグイン自体の根本的な欠陥ではない。公式の修正が配信されれば再発リスクは下がる。すでに設定済みの翻訳データがあるなら、急いで乗り換える必要はない。

エラーが解消したあと、古い翻訳ファイルを戻す必要はあるか

退避しただけの場合は、GTranslate の次回アップデート時に正しい翻訳ファイルが再配信される。手動で戻す必要はない。削除した場合も同様に、アップデートや翻訳の再読み込みで自動的に復元される。

この記事のポイント

  • GTranslate の翻訳ファイル破損が原因で管理画面が重大エラー停止する
  • 復旧には FTP でプラグインフォルダをリネームし強制無効化する
  • 誤った sprintf 指定子を修正し .mo ファイルを削除または再生成する
  • 暫定策として問題の言語ファイルを退避させる方法も有効
  • エラーログの定期チェックと自動更新の一時停止で再発を予防できる
WordPressのAllowed memory size exhaustedエラーの原因と直し方

WordPressのAllowed memory size exhaustedエラーの原因と直し方

WordPressの「Allowed memory size exhausted」エラーは、サーバーに十分な物理メモリがあっても発生する。64GBの専用サーバーで起こるのは、PHPのメモリ上限設定が実際の要求量を下回っているか、特定のプラグインやテーマがバグで際限なくメモリを消費し続けているからだ。まずは設定値の引き上げを試み、それで直らなければログから原因箇所を特定し対処する。

十分な物理メモリがあるのにエラーが起こる仕組み

十分な物理メモリがあるのにエラーが起こる仕組み

多くのレンタルサーバーはPHPのmemory_limitを128MBや256MBに設定している。WordPress本体や軽量なプラグインだけであればこの値で動作するが、WooCommerceの大規模ショップやページビルダー、画像処理、バックアップ系の処理が走ると一瞬で上限を突破する。コンソールに表示される「PHP Fatal error」の文言は、まさにその設定上限を突破したという意味だ。

さらに問題をややこしくしているのが、専用サーバーやVPSと「PHPの設定」の関係だ。64GBの物理メモリを搭載していても、PHPが使えるメモリ上限はOS全体の値ではなく、あくまでphp.iniwp-config.phpなどで個別に定義された数値が優先される。ハードウェアとソフトウェアの上限は別物だと理解しておく必要がある。

具体的なメモリ上限の引き上げ手順

具体的なメモリ上限の引き上げ手順

最も確実で直接的な方法はwp-config.phpファイルに一行追記することだ。FTPソフトやサーバーのファイルマネージャーでWordPressをインストールしたルートディレクトリにあるwp-config.phpを開き、次のコードを追記する。記述する場所は「/* 編集が必要なのはここまでです ! WordPress でブログをお楽しみください。 */」という行の直前が望ましい。

Before(修正前)
/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');
After(修正後)
define('WP_MEMORY_LIMIT', '512M');
/** Sets up WordPress vars and included files. */
require_once(ABSPATH . 'wp-settings.php');

ここでは512MBを指定している。256MBで発生したエラーへの対応としては、まず256MBの2倍にあたる512MBを設定するのがセオリーだ。どうしても足りなければ1024M(1GB)や2048M(2GB)といった思い切った値も試して問題ないが、上限を上げすぎるとプログラムの暴走時にサーバー全体が重くなるリスクもある点は覚えておきたい。

サーバー側のphp.iniや.htaccessで設定を上書きする

共用サーバーではwp-config.phpへの追記だけで解決するケースがほとんどだが、VPSや専用サーバーではもっと根本の設定を見直したほうがいい。php.iniファイルを直接編集できる環境なら、memory_limit = 512Mと指定する。編集権限がない場合は.htaccessphp_value memory_limit 512Mを追記する方法もあるが、最近のPHPハンドラではこの形式が無効化されている場合がある。

メモリ上限を上げても直らない時の根本原因特定

メモリ上限を上げても直らない時の根本原因特定

メモリ上限を1GBなど潤沢な値に変更してもなお同じエラーが出るなら、特定のプラグインかテーマが無限ループやメモリリークを引き起こしている可能性が高い。質問の事例のように「worker」プラグイン(管理用バックアップツールの類)が409MBものメモリ割り当てに失敗しているなら、それはプラグインが実質的に処理不可能な大規模データを扱っているか、プラグイン自体のバグだ。

管理画面に入れなくても全プラグインを安全に止める方法

エラーが深刻でWordPress管理画面にアクセスできない時は、FTPやSSHで/wp-content/plugins/ディレクトリのフォルダ名を一時的に変更する。例えば「plugins」を「plugins_deactivate」にリネームすると、全プラグインが強制停止されて管理画面にアクセスできる状態に戻せる。エラーがこのタイミングで消えたのなら、停止したプラグイン群に原因がある。

STEP 1 FTPでサーバーに接続し、/wp-content/へ移動する
STEP 2 「plugins」フォルダを「plugins_deactivate」にリネームする
STEP 3 管理画面へアクセスし「プラグイン」を見ると、すべて停止を確認できる
STEP 4 原因の心当たりがあるプラグインだけフォルダ名を元に戻し、有効化して検証する
安全な停止手順

エラーログに記録された具体的なファイル名を手がかりにする

エラーログには「/wp-content/plugins/worker/src/MWP/Http/JsonResponse.php on line 21」のように、エラーを起こしているファイルと行番号が出力される。これはまさに問題のプラグインの内部コードだ。この情報を元に該当プラグインだけを停止し、それでも状況が変わらなければそのプラグインの公式サポートに報告するか、代替のプラグインを検討する。

またWordPressには「サイトヘルス」機能が標準搭載されており、管理画面にアクセスできれば「ツール」→「サイトヘルス」→「情報」タブ内でメモリ上限の現在値が確認できる。FTPで原因プラグインを停止させたら、ここで上限値が意図した通りに変更されているかも併せてチェックしておくと確実だ。

よくある質問

256MBで運用していたが、なぜ急にこのエラーが出たのか

プラグインやテーマのアップデートでコードの処理方式が変わり、消費メモリが増えた可能性が高い。またWooCommerceの商品登録数が増えたり、データベースの肥大化によって1回のクエリで扱うデータ量が閾値を超えたことも原因に挙げられる。

メモリ上限の設定が反映されているか確認する方法は

管理画面の「サイトヘルス」で確認するのが最も簡単だ。あるいは、ルートディレクトリにinfo.phpを作成しphp phpinfo();と記述してブラウザでアクセスする。表示された一覧の中の「memory_limit」の値を見れば、現在の上限が分かる。

プラグイン停止でデータは消えないのか

プラグインのフォルダ名を変更して停止するだけでは、データベースに保存された設定やコンテンツは一切消失しない。単にWordPressがそのプラグインを読み込まなくなるだけなので、フォルダ名を元に戻せば全く同じ状態で再開できる。

512MBまで上げたが足りるか心配だ

一般的なWordPressサイトであれば512MBで十分だが、複数の重量級プラグインが稼働する大規模サイトでは1GBを超える設定が必要になることもある。ただし上限が高すぎるとPHPプロセスがメモリを解放しないまま滞留するリスクもあるため、原因プラグインの特定を優先するのが安全だ。

この記事のポイント

  • PHPのメモリ不足エラーは物理メモリとは別の設定値で起こる
  • まずはwp-config.phpにWP_MEMORY_LIMITを定義して上限を引き上げる
  • 512MBに引き上げても直らないなら、プラグインのバグを疑う
  • 管理画面に入れない時はFTPでプラグインフォルダをリネームして強制停止する
  • エラーログに書かれたファイルパスから原因のプラグインを狙い撃ちする
GiveWPアップデート後にStripeの寄付が完了しない原因と直し方

GiveWPアップデート後にStripeの寄付が完了しない原因と直し方

Stripeの決済は成功しているのにGiveWPで寄付が「完了」にならない。管理画面に寄付データが作成されず、Webhookだけが延々と失敗し続ける。この症状は、GiveWP 4.16のアップデート後にStripeから送られてくるWebhookの中身が空(null)になっていることが原因だ。PHPの致命的エラー「array_keys(): Argument #1 ($array) must be of type array, null given」が記録されているならなおさらで、GiveWPがイベントデータを正しく読み取れていない。

対処の核心はGiveWPとStripeの接続を完全に再確立し、Webhookの登録から正しくやり直すことにある。加えて、サーバー側のキャッシュがWebhookの受信を阻害しているケースも多いため、キャッシュの全削除とWebhookエンドポイントの除外設定が必要だ。

なぜStripeの決済は成功するのにGiveWPの寄付は未完了になるのか

なぜStripeの決済は成功するのにGiveWPの寄付は未完了になるのか

この問題のややこしい点は、Stripe上では決済が正常に完了して見えることだ。PaymentIntentのステータスは「succeeded」になり、クレジットカードの引き落としも問題なく行われる。しかしGiveWP側では寄付レコードが作成されず、寄付者にも完了メールが届かない。

仕組みをたどると、GiveWPは次の流れで寄付を確定させている。

① 寄付者がフォームで決済を実行
Stripeがクレジットカード情報を処理し、PaymentIntentが作成される
② StripeがWebhookをGiveWPのエンドポイントに送信
エンドポイントURLの例 https://example.com/?give-listener=stripe
③ GiveWPがWebhookを受け取り、署名を検証
署名検証に成功するとイベントデータを内部処理に回す
④ GiveWPが寄付レコードを作成し、ステータスを「完了」に変更
寄付者に完了メールが送信される

この流れのうち、手順③の段階でコケているのが今回の症状だ。StripeからのWebhookはGiveWPのエンドポイントに届いているのに、GiveWPがその中身を処理できない。結果として手順④に進めず、寄付は永遠に「処理中」のまま取り残される。

「array_keys null given」エラーが示す根本原因

「array_keys null given」エラーが示す根本原因

GiveWPのデバッグログに次のような致命的エラーが記録されている場合、原因の特定はかなり絞り込める。

Uncaught TypeError: array_keys(): Argument #1 ($array) must be of type array, null given
in vendor/stripe/stripe-php/lib/StripeObject.php

このエラーは、GiveWPがStripeの公式PHPライブラリ(stripe-php)を使ってWebhookイベントのデータを読み取ろうとしたとき、肝心のイベントオブジェクトの中身がnullになっていることを意味する。本来なら配列として渡されるべきデータが空っぽなのだ。

なぜデータが空になるのか。主な原因は次の3つに集約される。

  • GiveWPのアップデートで内部のWebhook処理ロジックが変わり、既存の接続設定との整合性が崩れた
  • サーバーレベルのキャッシュ(LiteSpeedやホスティング側のキャッシュ)がWebhookリクエストを変形させている
  • StripeダッシュボードのWebhook設定とGiveWPが自動管理する署名シークレットとの間にずれが生じている

4.16より前のバージョンではWebhookのデータ取得方法が異なっていた可能性があり、アップデートによって従来の接続状態に不整合が発生したと見るのが自然だ。事実、GiveWP 4.16がリリースされる直前の6月23日までは正常に動作していたという報告は、この仮説を裏付けている。

GiveWPとStripeの接続を完全に再確立する手順

GiveWPとStripeの接続を完全に再確立する手順

部分的な修正では直らない。GiveWPとStripeの間の信頼関係をゼロから組み直すつもりで、以下の手順を上から順に実行する。

STEP 1 GiveWPを最新バージョンに更新する
4.16.0で問題が発生した場合も、まず4.16.1以降への更新を試みる。GiveWPは不具合修正を迅速にリリースすることが多い。
STEP 2 GiveWP管理画面でStripeとの接続を解除する
「寄付」→「設定」→「支払いゲートウェイ」→「Stripe」から「接続を解除」を実行する。
STEP 3 StripeダッシュボードのWebhookを完全に削除する
Stripeダッシュボードの「開発者」→「Webhook」から、GiveWP用のエンドポイントをすべて削除する。古いものや重複しているものも含めて、すべて消す。
STEP 4 WordPressのキャッシュをすべて削除する
プラグインキャッシュ、サーバーキャッシュ(LiteSpeed等)、ホスティングキャッシュの3層すべてをクリアする。キャッシュ系プラグインを一時的に無効化してもよい。
STEP 5 GiveWPでStripeに再接続する
「寄付」→「設定」→「支払いゲートウェイ」→「Stripe」から「Stripeと接続」を実行し、Stripeの認証画面で許可する。
STEP 6 Webhookが自動再作成されるのを確認する
GiveWPが再接続時にStripeへWebhookエンドポイントを自動登録する。StripeダッシュボードのWebhook一覧を開き、新しいエンドポイントが作成されていること、必要なイベントが有効になっていることを確認する。

GiveWP管理画面でのStripe接続解除と再接続の落とし穴

接続解除ボタンを押しても、内部的に完全にクリーンアップされるとは限らない。GiveWPは接続情報をデータベースのoptionsテーブルに保存しているため、万が一解除がうまくいかない場合は、データベースを直接確認する方法も検討する。

再接続時は必ず本番モードで認証を通すこと。テストモードで接続したあとに本番モードに切り替えても、Webhookエンドポイントはテスト用のものが残ったままになり、本番決済のWebhookが正しく処理されない原因になる。

Stripe Webhookエンドポイントに必要なイベントを確認する

GiveWPが自動登録するWebhookには、以下の8つのイベントが最低限有効になっている必要がある。Stripeダッシュボードでエンドポイントを開き、「受信イベント」欄を目視で確認する。

  • charge.refunded(返金処理)
  • checkout.session.completed(チェックアウトセッション完了)
  • customer.subscription.created(定期寄付の作成)
  • customer.subscription.deleted(定期寄付の削除)
  • invoice.payment_failed(請求書の支払い失敗)
  • invoice.payment_succeeded(請求書の支払い成功)
  • payment_intent.payment_failed(支払い意図の失敗)
  • payment_intent.succeeded(支払い意図の成功)

いずれかが欠けている場合は手動で追加する。GiveWPがイベントを自動追加する仕様はバージョンによって変わるため、再接続後に必ず確認する習慣をつけるとよい。

キャッシュがWebhookを壊す仕組みと確実な対処

キャッシュがWebhookを壊す仕組みと確実な対処

Webhookはサーバー間のHTTP POSTリクエストだ。ところが一部のキャッシュプラグインやホスティング側のキャッシュ機構は、このPOSTリクエストに対して予期せぬ挙動を示す。具体的には、リクエストボディを空にしたり、ヘッダー情報を削除したり、レスポンスをキャッシュしてしまったりする。

GiveWPが正しく署名を検証し、イベントデータを読み取るためには、StripeからのPOSTリクエストが一切加工されずに届かなければならない。次の対応を必ず実施する。

Before(キャッシュがWebhookを加工している状態)
Stripe → キャッシュを通過リクエストボディが変形・空になる → GiveWPが処理失敗
After(キャッシュからWebhookエンドポイントを除外した状態)
Stripe → キャッシュをバイパスリクエストボディが完全なまま届く → GiveWPが正常に処理
キャッシュがリクエストを加工している状態  キャッシュから除外した状態

LiteSpeedキャッシュが原因のケース

LiteSpeedサーバー環境では、LiteSpeed Cacheプラグインの設定画面から「キャッシュ」→「除外」タブを開き、「URLの除外」にGiveWPのWebhookエンドポイントパスを追加する。具体的には「give-listener=stripe」を含むURLパターンを指定する。正規表現が使える場合は次のように記述する。

give-listener=stripe

また、LiteSpeedの「オブジェクトキャッシュ」や「ブラウザキャッシュ」も合わせて無効化した状態でテストすることを推奨する。テストが終わったら再度有効化しても問題はないが、少なくともWebhookエンドポイントだけは常にキャッシュの対象外にしておく。

ホスティング側のキャッシュが原因のケース

一部の共用サーバーやマネージドホスティングでは、サーバーレベルでリバースプロキシキャッシュが動作している。管理パネルからキャッシュを手動でクリアしたあと、一時的にキャッシュ機能を停止してWebhookが正常に処理されるかテストする。

恒常的な解決策としては、ホスティングのサポートに依頼して「https://example.com/?give-listener=stripe」をキャッシュの除外リストに追加してもらう必要がある。

署名シークレットの誤設定が引き起こす症状と修正

署名シークレットの誤設定が引き起こす症状と修正

GiveWP 4.16以降、署名シークレットの管理方法が変わり、手動での設定が不要になった。GiveWPがStripeに接続する際、自動的にWebhookエンドポイントを作成し、署名シークレットもGiveWP内部で管理する。そのため、Stripeダッシュボードから取得した署名シークレットをGiveWPの設定画面に入力する欄は存在しない。

もし過去に手動でWebhookを作成し、その署名シークレットを何らかの方法でGiveWPに設定していた場合、バージョンアップ後にその情報が無視されるか、あるいは競合を起こす可能性がある。そのため、手順としては次のように徹底する。

  1. Stripeダッシュボードから古いWebhookをすべて削除する(手動で作成したものも含む)
  2. GiveWP管理画面でStripeとの接続を完全に解除する
  3. GiveWP管理画面でStripeに再接続する(このとき新しいWebhookと署名シークレットが自動作成される)

署名シークレットに関するエラーがStripeダッシュボードに表示されている場合、ほぼ間違いなく新旧のWebhookが混在しているか、手動設定の名残が残っている。上記の手順で完全にリセットすれば、署名検証エラーは解消する。

それでも直らないときの最終確認リスト

それでも直らないときの最終確認リスト

上記の手順をすべて実行しても症状が改善しない場合、以下のポイントを順に再チェックする。

チェック1 サーバーの時刻が大幅にずれていないか
SSL証明書の評価がAランクでもNTPの同期が外れていると署名検証に失敗する。ホスティングに確認する。
チェック2 .htaccessやNginx設定にWebhookを妨害するルールが入っていないか
特定のクエリ文字列をブロックする設定や、POSTリクエストをGETに変換するリダイレクトルールがないか確認する。
チェック3 セキュリティプラグインがWebhookエンドポイントをブロックしていないか
WordfenceやSucuriなどのWAFがStripeのIPを遮断しているケースがある。一時的に無効化してテストする。
チェック4 StripeのAPIバージョンが極端に新しくなっていないか
Stripeダッシュボードの「開発者」→「APIのバージョン管理」で、使用中のAPIバージョンがGiveWPの対応範囲内か確認する。

よくある質問

GiveWPを最新版に更新したあとにStripeのWebhookが失敗し始めた。ロールバックするべきか

ロールバックは推奨しない。4.16系にはWebhook処理まわりの重要な変更が含まれており、古いバージョンに戻すと将来的にStripe APIの更新に追随できず、より深刻な不具合を引き起こす。まずは本記事の再接続手順を試し、それでも解決しない場合はGiveWPのサポートにシステムレポートを送って調査を依頼するほうが安全だ。

StripeのダッシュボードでWebhookが「失敗」と表示されるが、GiveWP側にエラーログが出ない

GiveWPのデバッグモードが有効になっていない可能性が高い。「寄付」→「設定」→「詳細」→「デバッグモード」を有効にすると、Webhook処理のエラーログが記録されるようになる。ログは「寄付」→「ツール」→「ログ」で確認できる。

再接続してもWebhookがStripeダッシュボードに自動作成されない

GiveWPの接続プロセスの中で、WordPressのREST APIが正しく動作していない可能性がある。パーマリンク設定を「基本」以外に変更して保存し直す。また、セキュリティプラグインがREST APIを制限していないか確認する。

WebhookエンドポイントのURLは手動で変更してもよいか

原則として不要であり、変更すべきではない。GiveWPが自動生成するエンドポイントURLは「https://(サイトURL)/?give-listener=stripe」で固定されており、これをStripeに正しく登録している。URLを手動で変更すると、署名の不一致が発生してすべてのWebhookが失敗する。

GiveWPのシステムレポートはどこで確認できるか

WordPress管理画面の「寄付」→「ツール」→「システム情報」タブを開き、「システムレポートを取得」ボタンをクリックすると、サーバー環境やGiveWPの設定情報がテキスト形式で表示される。サポートに問い合わせる際はこのレポートを添付するとスムーズに調査が進む。

この記事のポイント

  • Stripe決済成功後に寄付が未完了になるのは、Webhook処理の段階でGiveWPがイベントデータを読み取れていないから
  • 致命的エラー「array_keys null given」はWebhookの中身が空であることを示す決定的な手がかり
  • GiveWPとStripeの接続解除からWebhook全削除、再接続までを一気に行い、署名シークレットを完全に再生成する
  • LiteSpeedやホスティングのキャッシュからWebhookエンドポイントを除外し、POSTリクエストが加工されないようにする
  • 署名シークレットはGiveWPが自動管理するため、手動設定は不要であり、むしろ競合の原因になる