タグアーカイブ 500エラー

WP Activity Log v5.6.4でアプリパスワード削除時に500エラーが出る原因と回避策

WP Activity Log v5.6.4でアプリパスワード削除時に500エラーが出る原因と回避策

WP Activity Log v5.6.4を有効化したWordPressサイトで、プロフィール画面からアプリケーションパスワードを取り消すと「このサイトで重大なエラーが発生しました」と表示される場合、プラグインのアップデート待ちでは解決しない。原因はWP Activity Logが汎用のupdate_user_metaフックに対するメタキーの検証を怠っている点にあり、PHP 8ではcount()に文字列を渡すとTypeErrorが発生して致命的エラーになる。この記事では、エラーの仕組みから、手動での回避策、上位互換のためのコードパッチまでを具体的に示す。

エラーの全容と発火する条件

エラーの全容と発火する条件

WP Activity Log v5.6.4に収録されたWP_User_Profile_Sensor::event_application_password_added()は、汎用のupdate_user_metaアクションにフックされている。関数シグネチャには$meta_keyが渡されているが、コールバック内でこれを一度も検証しない。代わりにHTTPリファラとREQUEST_URIだけを見て、アプリケーションパスワード変更のリクエストかどうかを判定している。

このため、ユーザーのプロフィール画面からアプリケーションパスワードを取り消すときに、REST APIへのDELETEリクエストが発行される。リファラチェックはプロフィールページを指し、URIチェックも/wp/v2/users/{id}/application-passwords/...を含むため、両方の条件を通過する。ここでBuddyBoss Appのようなプラグインが、同じリクエストのディスパッチ中にlast_activityというユーザーメタを更新すると、本来アプリケーションパスワードのメタを想定していたセンサーが誤ってそのtimestamp文字列を処理してしまう。

致命的エラーの発生箇所とスタックトレース

致命的エラーの発生箇所とスタックトレース

実運用のログには、次のような未捕捉のTypeErrorが記録される。PHP 8ではcount()の引数が配列またはCountableでない場合、警告ではなくTypeErrorがスローされる。WP Activity Logのコードは文字列をcount()に渡しているため、リクエストが500エラーになる。

エラーの発火経路
1. プロフィール画面で操作 アプリパスワードの取り消しをクリックする
↓
2. REST APIリクエスト発行 DELETE /wp/v2/users/{id}/application-passwords/{uuid}
↓
3. 別プラグインがメタを更新 BuddyBoss App が last_activity のtimestamp文字列を書き込む
↓
4. センサーが誤発火 アプリパスワードと無関係なメタ書き込みでもコールバックが動く
↓
5. count()が文字列を受けてTypeError 500エラーになり、操作が完了しない
■ PHP 8のTypeErrorを引き起こす誤発火 ■ 無関係なメタ更新

スタックトレースを追うと、クラスの203行目でcount( $_meta_value )が呼ばれている。ここで$_meta_valueはtimestampの文字列であり、$old_valueは_application_passwordsの配列である。文字列をcount()に渡すとPHP 8ではTypeErrorが発生し、アプリケーションパスワードの取り消しは実行されないまま処理が失敗する。

第一の対処方法、プラグインの停止で被害を止める

第一の対処方法、プラグインの停止で被害を止める

まず、サイトが利用者から見て壊れている状態を早く解消するには、WP Activity Logを停止する。管理画面にアクセスできる場合は「プラグイン」画面からWP Activity Logを無効化する。アクセスできない場合はFTPでwp-security-audit-logディレクトリをリネームする。リネームするとWordPressがプラグインを検出できなくなり、自動的に無効化される。

第二の対処方法、一時的にPHPのエラー表示を止める

第二の対処方法、一時的にPHPのエラー表示を止める

WP Activity Logを使い続けたい場合は、PHPのcount()エラーが致命的にならないよう回避策を施す。だが、これは根本解決ではなく症状を隠すだけだ。むしろ、エラー自体を修正するパッチを適用する方が安全である。ただし、プラグインのアップデートで上書きされることを理解した上で、運用上の措置として行うかどうかを判断してよい。

ソースコードを直接修正する根本対応

ソースコードを直接修正する根本対応

WP Activity Logの該当ファイルはwp-security-audit-log/classes/WPSensors/class-wp-user-profile-sensor.phpである。コールバックの先頭で、メタキーが_application_passwordsでない場合は早期returnするようガードを追加する。これが今回のエラーを確実に止める最小の修正だ。

public static function event_application_password_added( $meta_id, $user_id, $meta_key, $_meta_value ) {
    if ( '_application_passwords' !== $meta_key ) {
        return;
    }
    // 以下、既存の処理
}

加えて、防御的措置としてcount()に渡す前に配列キャストを行うと、将来何らかの形で配列以外の値が混入した場合にも致命的エラーを防げる。メタキーガードだけでも今回の症状は解消するが、運用中のサイトでは両方の修正を施しておく方が堅牢だ。

} elseif ( count( (array) $_meta_value ) < count( (array) $old_value ) ) {

修正後、コード上の同じパターンが他に残っていないか、deleted_user_metaやadded_user_metaへの登録も確認するとよい。同じクラス内で複数のフックが同様のリファラ+URIチェックだけに頼っている場合、似た条件のリクエストで誤発火する可能性がある。

PHP 8環境で注意すべきcount()の挙動

PHP 7.xでは、count()に文字列を渡しても警告が出るだけで処理は継続されていた。しかしPHP 8ではTypeErrorとしてスローされるため、これまで表面化しなかったコードの前提ミスが致命的エラーとして現れる。WP Activity Logに限らず、WordPressプラグインの旧コードでは、更新順にこうした潜在バグが発覚することがある。

サイトをPHP 8系へ更新した直後に、特定の操作でのみ500エラーが出る場合は、エラーログにcount(): Argument #1 ($value) must be of type Countable|array, string givenのような記録が残っていないか確認する。該当する場合は、エラーを起こしているプラグインのコードが文字列をcount()に渡している可能性が高い。

PHP 7.x
  • count()に文字列を渡すと警告のみ
  • 処理は継続される
  • 潜在的バグが表面化しない
↓
PHP 8.x
  • TypeErrorがスローされる
  • 致命的エラーで500応答
  • 操作が完了しない
■ 緩やかなエラー ■ 致命的エラー

よくある質問

WP Activity Logを無効化すると監査ログは消えますか?

無効化しても記録済みの監査ログはデータベースに残る。ただし、無効化している間に発生したイベントは記録されない。復旧後にプラグインを再度有効化すれば、既存のログを閲覧できる。

BuddyBoss Appが原因なのでBuddyBoss側を停止すれば直りますか?

BuddyBoss Appがユーザーメタを更新するタイミングが発火に重なっているが、根本的な誤動作はWP Activity Log側のフック設計にある。BuddyBoss Appが動いていなくても、別のプラグインが同様にRESTリクエスト中にユーザーメタを更新すれば同じエラーが起きる。

WP Activity Logのバージョンを下げれば回避できますか?

過去のバージョンが同じコードを含んでいる場合、単純なダウングレードでは解消しない。今回のクラスのコールバックを変更せずに添付された報告では、v5.6.5にも修正が含まれていないと指摘されている。信頼できる最新の修正が入るまでは、上記のコードパッチを適用するか、プラグインを停止する方が確実だ。

プロフィール画面でアプリパスワードを管理できる権限がないユーザーも影響を受けますか?

このエラーはアプリケーションパスワード管理を行えるユーザーに限らず、同じリクエスト経路でユーザーメタが更新される状況であれば発火しうる。ただ、発火条件としてプロフィール画面からの操作と、REST APIのURIにアプリケーションパスワードのパターンが含まれることが必要になる。

プラグインをアップデートしたら勝手に直りますか?

プラグインの開発者がメタキーガードを実装したバージョンをリリースすれば直る。ただし、現時点で修正が含まれているかはリリースノートとソースを確認する必要がある。修正が見つからないうちは、手動パッチか無効化で運用を守る。

この記事のポイント

  • WP Activity Log v5.6.4の500エラーはPHP 8のcount()エラーが原因
  • コールバックがメタキーを検証せず、アプリパスワードと無関係なユーザーメタで誤発火する
  • メタキーガードを追加するコードパッチが根本解決になる
  • 配列キャストを加えるとPHP 8の厳格なエラーに強いコードになる
  • 修正版が出るまでは、プラグイン停止かパッチ適用で被害を防ぐ
Klarna Paymentsで注文支払いページが500エラーになる原因と対処法

Klarna Paymentsで注文支払いページが500エラーになる原因と対処法

Klarna Payments を有効にした WooCommerce サイトで注文支払いページにアクセスした際に「このサイトで重大なエラーが発生しました」と表示される問題は、プラグイン内部のコードに null チェックが欠落していることが原因だ。存在しない注文 ID に対して get_order_key() メソッドを呼び出そうとして致命的エラーが発生している。この問題は Klarna Payments 4.12.0 以前のバージョンで発生し、プラグインのコードを1行修正するか、開発元のアップデートを適用することで解決できる。

存在しない注文の支払いページでなぜ500エラーが起きるのか

存在しない注文の支払いページでなぜ500エラーが起きるのか

このエラーの直接の原因は、Klarna Payments プラグインの class-kp-assets.php ファイル内にある get_checkout_params() メソッドの実装にある。このメソッドは注文支払いページでチェックアウトスクリプトを読み込む際に呼び出されるが、URL パラメータから取得した注文 ID で wc_get_order() を実行したあと、戻り値が false(注文が見つからなかった場合)かどうかを確認せずに get_order_key() を呼び出している。

PHP は false に対してメソッドを呼び出せないため、「Call to a member function get_order_key() on bool」という致命的エラーが発生し、サイトが HTTP 500 を返す。通常 WooCommerce は存在しない注文に対して「この注文は無効です」という通知を表示する仕様だが、Klarna Payments のスクリプトが先にエラーを起こすことで画面全体が停止してしまう。

エラー発生時の処理フロー
URLパラメータ → 注文ID取得 → wc_get_order()
wc_get_order() → false を返す → get_order_key() 呼び出し → 致命的エラー
↓
修正後の安全なフロー
wc_get_order() → false を返す → $order の存在チェック → false なら処理をスキップ
■ 修正後 ■ 修正前

この問題は単に手動で不正な URL を入力した場合だけでなく、実際の運用でも発生する。WooCommerce は定期的に保留中や失敗した古い注文を自動的に削除する(woocommerce_trash_pending_orders などのスケジュールタスク)。顧客が「注文保留中」のメールを受け取り、その支払いリンクをクリックした時点で注文が既に削除されていると、本来表示されるべきエラーメッセージの代わりに HTTP 500 エラーに直面することになる。

エラーが発生しているかどうかを確認する方法

エラーが発生しているかどうかを確認する方法

致命的エラーが発生すると、WordPress はデフォルトで「このサイトで重大なエラーが発生しました」というメッセージを表示し、サイト管理者に自動的にメールを送信する。このメールにはエラーの詳細と、問題が発生したプラグイン名が記載されている。まずはこのメールを確認するのが最も早い。

デバッグモードを有効にしてエラーの詳細を確認する

エラーメールが届いていない場合や、より詳細なスタックトレースを確認したい場合は、WordPress のデバッグログを有効にする。wp-config.php に以下の定数を追加または既存の行を変更する。

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

この設定により、エラーは画面に表示されず /wp-content/debug.log ファイルに記録される。問題の URL(存在しない注文 ID を含む注文支払いページ)にアクセスしたあと、このログファイルを開いて「Call to a member function get_order_key() on bool」というエラーが記録されているかを確認する。

サイトヘルス画面でエラー情報を取得する

WordPress 5.2 以降では、管理画面の「ツール」→「サイトヘルス」→「情報」タブで、最近発生した致命的エラーの一覧を確認できる。「WordPress の致命的エラー」セクションに、発生時刻とエラーメッセージが表示されるため、本番環境でデバッグモードを常時有効にできない場合の手がかりとして活用できる。

エラー原因の特定フロー
STEP 1 管理メールを確認する
↓
STEP 2 サイトヘルスで致命的エラー履歴を確認する
↓
STEP 3 デバッグログを有効にして詳細を取得する
↓
STEP 4 「get_order_key() on bool」エラーを特定する

Klarna Payments プラグインのコードを修正する手順

Klarna Payments プラグインのコードを修正する手順

この問題の根本的な解決には、プラグインのコードに適切なガード条件を追加する必要がある。修正対象は /wp-content/plugins/klarna-payments-for-woocommerce/classes/class-kp-assets.php ファイルの get_checkout_params() メソッド内にある約181行目付近のコードだ。

修正前のコードと問題箇所

if ( ! empty( $order_id ) ) {
    $order     = wc_get_order( $order_id );
    $order_key = $order->get_order_key(); // $order が false の場合にエラー
}

修正後の安全なコード

if ( ! empty( $order_id ) ) {
    $order = wc_get_order( $order_id );
    if ( $order ) {
        $order_key = $order->get_order_key();
    }
}

追加するのは「もし $order が存在するなら」という条件分岐の1行だけだ。この修正により、wc_get_order() が false を返した場合に get_order_key() の呼び出しがスキップされ、Klarna Payments のスクリプトが正常に読み込まれなくなる代わりに、WooCommerce の標準的な「この注文は無効です」という通知が表示されるようになる。

Before 修正前
$order_key = $order->get_order_key();
→ $order が false だと致命的エラー
↓
After 修正後
if ( $order ) { ... }
→ false なら安全にスキップ

プラグインファイルを安全に編集する際の注意点

プラグインファイルを安全に編集する際の注意点

この修正はプラグインのコアファイルを直接変更するため、次の点に注意が必要だ。最も重要なのは、プラグインが自動アップデートされると修正が上書きされる点である。Klarna Payments の開発元である Krokedil が次回のバージョンでこのバグを修正する可能性が高いため、当面の暫定対応としてのみ行うべきだ。

修正前に必ずバックアップを取得する

FTP クライアントまたはサーバーのファイルマネージャーで class-kp-assets.php をローカルにダウンロードし、class-kp-assets.php.bak のような名前でコピーを保存してから編集する。誤った修正でサイトが停止した場合にすぐ元に戻せるようにするためだ。

プラグインの自動アップデートを一時的に停止する

カスタム修正を適用したプラグインが自動アップデートされると修正が消えるだけでなく、場合によっては修正とアップデートの競合でさらに問題が起きる可能性もある。WordPress 管理画面の「プラグイン」→「プラグインの自動更新を無効化」から Klarna Payments の自動更新をオフにするか、より安全な方法として wp-config.php に define( 'WP_AUTO_UPDATE_CORE', false ); を追加してプラグイン自動更新全体を制御する方法もある。ただしこの定数は WordPress コアの自動更新にも影響するため、既存の設定と相談して決める必要がある。

エラーログを監視して修正後の状態を確認する

修正を適用したあとは、デバッグログを数日間監視し、同じエラーが再発していないか確認する。また、実際に存在しない注文 ID を含む URL(/checkout/order-pay/99999999/?pay_for_order=true&key=whatever)にアクセスし、500 エラーではなく「この注文は無効です」という WooCommerce の通知が表示されることを検証する。検証が終わったら WP_DEBUG と WP_DEBUG_LOG を false に戻し、デバッグログファイルを削除する。

よくある質問

プラグインの修正を待つ間の一時的な回避策はあるか

コード修正以外の回避策として、Klarna Payments のチェックアウトフロー設定を「redirect(リダイレクト)」に変更する方法がある。管理画面の「WooCommerce」→「設定」→「支払い」→「Klarna Payments」で「Checkout flow」を「redirect」に設定すると、注文支払いページでのスクリプト読み込み動作が変わる可能性がある。ただしこの設定が確実にエラーを回避するかは環境によって異なるため、検証が必要だ。

このエラーは特定のテーマが原因で発生するのか

テーマは直接の原因ではない。エラーのスタックトレースにテーマ名(例: Shoptimizer)が含まれるのは、テーマが wp_head() を呼び出し、そのフック経由で Klarna Payments のスクリプトが実行されるためだ。テーマを変更してもこの問題は解決しない。原因はあくまで Klarna Payments プラグインのコードにある。

Klarna Payments の代わりに別の決済プラグインに切り替えるべきか

この種の null チェック不足は、特定のバージョンに限った問題であり、他にも多数の決済プラグインで過去に同様のバグが報告されている。Klarna Payments 自体は広く使われている安定したプラグインであり、1つのマイナーなバグのために乗り換えるほどの問題ではない。上記の1行修正で解決できる範囲だ。

同じ修正を子テーマの functions.php で適用できるか

このケースでは適用できない。問題のコードはプライベートメソッド get_checkout_params() 内にあり、WordPress のフィルターフックやアクションフックを提供していない。そのためフックで動作を上書きしたり無効化したりすることができず、プラグインファイルの直接編集が必要になる。フックで対応できるのは、プラグインが明示的に do_action() や apply_filters() を提供している箇所に限られる。

この記事のポイント

  • Klarna Payments 4.12.0 以前で存在しない注文の支払いページにアクセスすると致命的エラーが発生する
  • 原因は class-kp-assets.php 内で wc_get_order() の戻り値が false かどうかを確認せずにメソッドを呼び出していること
  • if ( $order ) の1行を追加することでエラーを回避できる
  • プラグインのコアファイルを編集する前に必ずバックアップを取得する
  • プラグインの自動アップデートにより修正が上書きされるため、一時的な対応として扱う
WordPress 7.0 ブロックエディターで多言語プラグイン Bogo 有効時に REST API 500 エラーが出る原因と対処

WordPress 7.0 ブロックエディターで多言語プラグイン Bogo 有効時に REST API 500 エラーが出る原因と対処

WordPress の多言語プラグイン Bogo を有効化した状態でブロックエディターを開くと、カテゴリーなどのタクソノミーパネルが空になり、REST API が 500 Internal Server Error を返す症状は、Bogo が REST API に付与する lang パラメータと WordPress 7.0 のブロックエディター側のリクエスト処理が競合していることが主な原因だ。

なぜ Bogo とブロックエディターの組み合わせで REST API が 500 エラーを返すのか

なぜ Bogo とブロックエディターの組み合わせで REST API が 500 エラーを返すのか

この問題の核心は、ブロックエディターが内部で使用する REST API エンドポイントに対するリクエストにある。ブロックエディターは編集画面を表示する際、/wp-json/wp/v2/taxonomies や /wp-json/wp/v2/users/〜 といった複数のエンドポイントに同時にリクエストを送信し、カテゴリー一覧や投稿者情報を取得している。

Bogo は多言語対応のために、これらの REST API リクエストに対して自動的に lang クエリパラメータを付与する。たとえば ?lang=en や ?lang=ja といった具合だ。このパラメータ追加の処理が、ブロックエディターの特定の内部リクエストと組み合わさった際に、サーバー側で PHP の致命的エラーを引き起こしている。

データベースから要求された言語のデータを取得しようとするが、ブロックエディターのコンテキストでは想定外の引数が渡され、結果として WP_Query やタクソノミー取得関数が WP_Error オブジェクトを返す。これが REST API のレスポンス生成時に適切にハンドリングされず、500 エラーとして表面化する。

エラーの切り分けと原因特定の手順

エラーの切り分けと原因特定の手順

まずは問題が本当に Bogo とブロックエディターの組み合わせに限定されているのかを確認する。以下のフローに沿ってテストを進めると、原因の特定がスムーズになる。

STEP 1 Bogo 以外の全プラグインを無効化する
↓
STEP 2 標準テーマ(Twenty Twenty-Five など)に切り替える
↓
STEP 3 ブロックエディターで新規投稿画面を開き、カテゴリーパネルを確認する
↓
STEP 4 ブラウザの開発者ツール「ネットワーク」タブで 500 エラーを探す

上記の最小構成でもエラーが再現する場合、Bogo とブロックエディターの直接的な競合と判断できる。なお、クラシックエディタープラグインをインストールして同じ操作を行った際に問題が発生しないことも、ブロックエディター固有の問題であることの強い証拠になる。

実用的な回避策と当面の対応

実用的な回避策と当面の対応

根本的な修正は Bogo プラグイン側のアップデートを待つ必要があるが、運用を止めずにしのぐ方法はいくつか存在する。状況に応じて以下を使い分ける。

クラシックエディターへの一時的な切り替え

最も確実で即効性のある回避策は、クラシックエディタープラグインをインストールして旧来の編集画面を使うことだ。クラシックエディターは REST API に依存したデータ取得を行わないため、Bogo の lang パラメータ付与が問題を引き起こす余地がない。

Before(ブロックエディター)
✕ REST API 500 エラーでカテゴリーパネルが空
→ ブロックエディターの内部リクエストが lang パラメータと競合
↓
After(クラシックエディター)
○ カテゴリーが正常に表示される
→ REST API 非依存のため競合が発生しない
■ エラー状態 ■ 回避後の状態

クラシックエディターは WordPress の公式プラグインディレクトリから無料でインストールできる。インストール後は「設定」→「投稿設定」からデフォルトのエディターを切り替えられる。

REST API への lang パラメータ付与をフィルターフックで制限する

Bogo は REST API リクエストに言語パラメータを付与する際、rest_dispatch_request や rest_pre_dispatch といったフィルターフックを経由している。子テーマの functions.php に以下のようなコードを追加することで、管理画面からのリクエストに対して言語パラメータの付与を抑制できる。

add_filter( 'rest_dispatch_request', function( $dispatch_result, $request, $route, $handler ) {
    // 管理画面からの REST API リクエストの場合、Bogo の言語処理をスキップ
    if ( is_admin() || ( defined( 'REST_REQUEST' ) && REST_REQUEST && strpos( $route, '/wp/v2/' ) === 0 ) ) {
        remove_filter( 'rest_dispatch_request', 'bogo_rest_dispatch_request', 10 );
    }
    return $dispatch_result;
}, 5, 4 );

このコードは、/wp/v2/ から始まる REST API ルート(ブロックエディターが使用する主要なエンドポイント)に対して、Bogo が持つ bogo_rest_dispatch_request フィルターを一時的に除去する。ただし、この方法は Bogo の内部実装に依存しているため、プラグインのバージョンアップによって動作が変わる可能性がある点に注意が必要だ。

プラグインのダウングレードまたはフォーク版の利用を検討する

Bogo 3.9.2 で問題が顕在化したのであれば、1つ前のバージョンである 3.9.1 にダウングレードすることで問題が回避できる可能性がある。ただし、ダウングレードはセキュリティ上のリスクを伴うため、あくまで開発者側の対応を待つ間の暫定策と位置づける。

代替の多言語プラグインへの移行を検討する

Bogo はシンプルな多言語化プラグインとして長く使われているが、ブロックエディターとの相性問題が続くようであれば、Polylang や WPML、TranslatePress といった代替プラグインへの移行も選択肢に入る。これらのプラグインはブロックエディターとの互換性テストがより積極的に行われており、多言語サイトの構築で実績も豊富だ。

デバッグモードで詳細なエラー情報を取得する

デバッグモードで詳細なエラー情報を取得する

REST API の 500 エラーは、通常の PHP エラーとは異なり debug.log に記録されない場合がある。そのため、wp-config.php に以下の定数を追加して、より詳細なエラー情報を取得する。

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

さらに、ブラウザの開発者ツールで「ネットワーク」タブを開き、500 エラーを返している REST API リクエストを特定する。該当するリクエストの「レスポンス」タブを確認すると、サーバーから返された HTML のエラーページや JSON エラーオブジェクトが表示される。WordPress 7.0 では「このサイトで重大なエラーが発生しました」というメッセージが返ってくることが多い。

どうしてもエラーの詳細が取得できない場合は、wp-config.php に以下のコードを追加し、REST API エラー専用のログファイルを作成する方法もある。

add_action( 'rest_api_init', function() {
    set_error_handler( function( $errno, $errstr, $errfile, $errline ) {
        $log = sprintf( '[%s] %s:%d %s', date( 'Y-m-d H:i:s' ), $errfile, $errline, $errstr );
        file_put_contents( WP_CONTENT_DIR . '/rest-api-errors.log', $log . PHP_EOL, FILE_APPEND );
    });
}, 1 );

このコードは REST API の初期化時にカスタムエラーハンドラを登録し、発生したエラーをすべて wp-content/rest-api-errors.log に記録する。問題が解決したら必ず削除すること。

よくある質問

Bogo の代わりに Polylang を使っても同様のエラーは出るか

Polylang は REST API との統合が設計段階から考慮されており、ブロックエディターとの組み合わせでも同様の 500 エラーが発生する可能性は極めて低い。実際に多くの多言語サイトで Polylang とブロックエディターの組み合わせが問題なく運用されている。移行を検討する価値は十分にある。

この問題は WordPress 7.0 以前のバージョンでも発生するのか

WordPress 6.x 系では報告が少なく、7.0 へのアップデート後に顕在化したケースが多い。ブロックエディターの内部実装が 7.0 で変更され、特定の REST API エンドポイントに対するリクエストのタイミングやパラメータの扱いが変わったことが影響していると考えられる。

クラシックエディターに切り替えた後、再びブロックエディターに戻せるのか

問題なく戻せる。クラシックエディターで作成した投稿は、ブロックエディターに戻した際に自動的にクラシックブロックとして読み込まれる。Bogo プラグイン側のアップデートで問題が修正されたら、クラシックエディタープラグインを無効化してブロックエディターに戻せばよい。

REST API のエラーはフロントエンドの表示にも影響するのか

今回の問題は管理画面のブロックエディター内に限定されており、公開済みサイトのフロントエンド表示には影響しない。カテゴリー一覧や投稿一覧の表示、多言語切り替え機能は通常どおり動作する。ただし、ブロックエディターでカテゴリーを選択・編集できないため、投稿の作成や編集作業に支障が出る。

functions.php にフィルターフックを追加する方法がわからない場合はどうすればよいか

最も安全な方法は、FTP クライアントまたはレンタルサーバーのファイルマネージャーを使い、子テーマの functions.php ファイルを編集することだ。操作に不安がある場合は、Code Snippets プラグインを利用して管理画面からコードを追加する方法もある。誤ったコードの追加はサイト全体に影響するため、必ず事前にバックアップを取得してから作業すること。

この記事のポイント

  • Bogo 有効時にブロックエディターのカテゴリーパネルが空になるのは、REST API への lang パラメータ付与が競合を起こすため
  • クラシックエディターに一時的に切り替えることで、即座に問題を回避できる
  • functions.php にフィルターフックを追加し、管理画面からの REST API リクエストに対して Bogo の言語処理を抑制する方法もある
  • 根本解決には Bogo プラグイン側のアップデートが必要で、状況によっては代替プラグインへの移行も検討する
  • REST API の 500 エラーは debug.log に記録されないことがあるため、専用のエラーログ取得を設定すると原因特定が早まる