タグアーカイブ トラブル解決

WooCommerceのメールが届かない時はWP Mail SMTPの「Force From Email」を確認

WooCommerceのメールが届かない時はWP Mail SMTPの「Force From Email」を確認

WP Mail SMTPのテストメールは届くのに、WooCommerceの注文確認や処理完了のメールだけが届かない場合、原因のほとんどはWP Mail SMTPで「Force From Email(送信元アドレスを強制)」の設定が無効になっていることだ。この設定を有効にし、WooCommerce側の送信元アドレスも確認すれば、数分で解決する。

なぜテストメールは届くのにWooCommerceのメールだけ届かないのか

なぜテストメールは届くのにWooCommerceのメールだけ届かないのか

WP Mail SMTPのテストメール機能は、管理画面から手動で送信した単体のメールだ。このとき、WP Mail SMTPは自分が設定されたSMTPサーバー情報(サーバー名、ポート番号、ユーザー名、パスワード)と認証用のメールアドレスを使ってメールを送る。テストが成功しているということは、SMTPサーバーとの通信自体は正常で、認証情報も間違っていない。

一方、WooCommerceが自動で生成するメール(新規注文、処理中、完了など)は、SMTPサーバーに直接接続するわけではない。内部的にWordPressのwp_mail()関数を呼び出し、WP Mail SMTPがそれをフックしてSMTP経由で配送する。この過程で問題になるのが送信元(From)アドレスの不一致だ。

多くのSMTPサービス(SendGrid、Gmail SMTP、Microsoft 365など)は、なりすまし防止のため、メールのFromヘッダーが認証済みのアドレスと一致しているか厳しくチェックする。WooCommerceはデフォルトで「wordpress@あなたのドメイン」のようなアドレスを送信元に設定するが、これがSMTP認証に使ったアドレスと違うと、SMTPサーバー側で送信が拒否される。テストメールはWP Mail SMTPが認証アドレスを直接使うので届く。ここが分かれ目だ。

Before(不一致=届かない)
WP Mail SMTP認証 admin@example.com
WooCommerce送信元 wordpress@example.com
SMTPサーバーが送信を拒否 認証アドレスとFromアドレスが異なるため
After(Force From Email有効=届く)
WP Mail SMTP認証 admin@example.com
WooCommerce送信元 admin@example.com 強制一致
SMTPサーバーが正常に配送 認証アドレスとFromアドレスが一致
不一致で拒否される状態  Force From Emailで解決

上の図のように、WP Mail SMTPの認証アドレスとWooCommerceが使う送信元アドレスが異なると、SMTPサーバーは「このメールのFromは本当に認証された持ち主か?」と判断できず、配送を止めてしまう。解決にはWP Mail SMTP側でこの不一致を強制的に揃える設定が必要になる。

WP Mail SMTPの「Force From Email」を有効にする手順

WP Mail SMTPの「Force From Email」を有効にする手順

まず試すべきは、WP Mail SMTPの設定画面にある「Force From Email」オプションを有効にすることだ。この設定は、WooCommerceを含むすべてのプラグインが生成するメールの送信元アドレスを、WP Mail SMTPに登録した認証アドレスで上書きする働きを持つ。これにより、SMTPサーバーがアドレスの不一致でメールを拒否する問題が解消される。

STEP 1 WordPress管理画面の「WP Mail SMTP」→「設定」を開く
STEP 2 「From Email」セクションまでスクロールする
STEP 3 「Force From Email」のチェックボックスをオンにする
STEP 4 画面下部の「設定を保存」ボタンを押す
STEP 5 WooCommerceのメール送信テストを実行して確認する

「Force From Email」が表示されない場合の確認ポイント

WP Mail SMTPの無料版(Free)には「Force From Email」のオプションが存在しないバージョンもある。設定画面の「From Email」セクションに項目が見当たらない場合は、以下の点を確認する。

  • WP Mail SMTPが最新バージョンに更新されているか
  • 有料版(Pro)を使っているか、無料版で機能が制限されていないか
  • 「From Email」欄に認証アドレスと完全に同じメールアドレスを手動で入力しているか

無料版で「Force From Email」が使えない場合は、「From Email」欄にSMTP認証で使っているアドレスをそのまま手入力し、さらに後述のWooCommerce側の送信元設定も同じアドレスに揃える方法で対応できる。

WooCommerce側の送信元アドレス設定も揃える

WooCommerce側の送信元アドレス設定も揃える

WP Mail SMTPの「Force From Email」が有効でも、設定が競合したり予期しない挙動でうまくいかないケースがある。念のため、WooCommerce自体のメール送信元設定もSMTP認証アドレスに揃えておくと確実だ。

WooCommerceの「差出人アドレス」を変更する

管理画面の「WooCommerce」→「設定」→「メール」タブを開く。ページ上部に「差出人アドレス(From Address)」という項目がある。ここにWP Mail SMTPで認証したメールアドレスとまったく同じアドレスを入力する。デフォルトではドメイン名から自動生成されたアドレスが入っていることが多いので、上書きする。

同じ画面のすぐ上にある「差出人(From Name)」はショップ名など任意の表示名でかまわない。ここは認証とは関係なく、受信者のメールソフト上で「誰からのメールか」として表示されるだけだ。

個別のメールテンプレート設定は通常変更不要

「メール」タブの下部には「新規注文」「処理中」「完了」など個別のメール通知一覧がある。ここで各メールの「受信者アドレス」を設定できるが、送信元アドレスを個別に指定する項目は標準ではない。そのため、通常は上部の「差出人アドレス」だけ修正すれば十分だ。もし個別テンプレートをカスタマイズするプラグインを入れている場合は、そのプラグイン側でFromアドレスが上書きされていないか確認する。

その他の確認ポイント

その他の確認ポイント

WooCommerceからテストメールを送る方法

WP Mail SMTPのテストメールだけでなく、WooCommerce側からもメール送信をトリガーして確認したい場合は、管理画面の「WooCommerce」→「ステータス」→「ツール」タブを開き、「メールをテスト」機能を使う。ここで任意のメール種別(例「新しい注文」)を選んで「送信」ボタンを押すと、実際のWooCommerceメールが送信される。Force From Emailの設定後、このテストで届くかどうかを見るのが最も確実だ。

プラグインの競合を疑う

稀に、他のSMTPプラグインやメール関連プラグイン(メールテンプレートカスタマイザー、メールログプラグインなど)が共存していると、WP Mail SMTPのフックより先にメール処理を横取りしてしまうことがある。「Force From Email」とWooCommerce側の設定を合わせても改善しない場合は、以下の手順で切り分けを行う。

  1. WP Mail SMTP以外のメール関連プラグインをすべて無効化する
  2. 標準テーマ(Twenty Twenty-Fiveなど)に一時的に切り替える
  3. WooCommerceの「メールをテスト」で再度送信を試す

ここで届くようになれば、テーマかプラグインのどちらかに原因がある。1つずつ再有効化して原因を特定する。

SMTPサーバー側の送信ログを確認する

上記すべてを試しても解決しない場合、SMTPサーバー側でメールがどう処理されているかを確認する。SendGridやGmail SMTP、Microsoft 365など、利用しているSMTPサービスには管理画面があり、送信ログやアクティビティログを確認できる。WooCommerceが送信を試みた形跡があるか、エラーが出ているかを見ることで、問題の所在がWP Mail SMTPより先か後かを切り分けられる。

よくある質問

「Force From Email」を有効にしてもメールが届かない場合は?

WooCommerce側の「差出人アドレス」が認証アドレスと一致しているか再度確認する。また、WP Mail SMTPの「Force From Name」も併せて有効にすると、名前の不一致によるフィルタリングを回避できることがある。それでも改善しなければ、他のメール関連プラグインを無効化して競合を確認する。

SMTP認証のメールアドレスはどのアドレスを使うべきか

自社ドメイン(例 info@自社ドメイン.com)を使うのが最も信頼性が高い。Gmailの無料アカウントでも送れるが、1日の送信制限があり、ビジネス用途ではGoogle WorkspaceやSendGridなどの専用SMTPサービスが推奨される。いずれの場合も、認証に使ったアドレスと完全に同じものを送信元アドレスとして使う必要がある。

迷惑メールフォルダに入ってしまう場合はどうするか

SMTP認証を使っていても、SPFレコードやDKIM署名がドメインのDNSに正しく設定されていないと、迷惑メールに分類されることがある。WP Mail SMTPの設定画面から「メールテスト」を送った際に表示される診断結果で、SPFやDKIMの状態を確認できる。これらが未設定または失敗している場合は、利用しているSMTPサービスの指示に従ってDNSレコードを追加する。

この記事のポイント

  • WP Mail SMTPのテスト成功はSMTP通信が正常な証拠で、問題は送信元アドレス不一致にある
  • 「Force From Email」を有効にすれば、全プラグインの送信元アドレスが認証アドレスに強制統一される
  • WooCommerce側の「差出人アドレス」設定も同じ認証アドレスに手動で揃えるとさらに確実
  • 改善しない場合はメール関連プラグインの競合やSMTPサーバー側のログを確認する
  • SPFやDKIMのDNS設定も合わせて確認すると、迷惑メール対策まで完結する
REST APIに非ログイン状態でアクセスできなくなった時の原因と解決手順

REST APIに非ログイン状態でアクセスできなくなった時の原因と解決手順

プラグインや本体のアップデートを機に、外部サービスからのREST APIリクエストが「Only authenticated users can access the REST API.」というエラーで拒否されるようになった場合、多くのケースではプラグインの認証設定が更新によって変更されている。まずは該当プラグインの「REST APIアクセスを許可する」設定を見直し、それでも改善しなければバージョン固有の不具合を疑う。

なぜアップデート後にREST APIが突然使えなくなるのか

なぜアップデート後にREST APIが突然使えなくなるのか

WordPressのREST APIは、外部アプリやサービスとサイトがデータをやり取りするための共通の窓口だ。決済ゲートウェイの通知(ウェブフック)、モバイルアプリからの記事取得、別サーバーとの在庫連携など、多様な自動処理がREST APIを通じて動いている。

プラグインのバージョンアップでアクセスが遮断される原因は、大きく分けて二つある。ひとつはセキュリティ強化を目的とした仕様変更で、非ログインユーザー(未認証リクエスト)に対する制限が新たに追加、あるいは既定で有効化されたケースだ。もうひとつは、アップデート時のコードの不具合で「REST APIを許可する」設定が内部的に無視されてしまうケースである。

REST API遮断の主な発生パターン
ケースA セキュリティ機能の新設・既定値変更
新バージョンで「未認証ユーザーのREST APIアクセスをブロック」が既定でオンになった
ケースB バージョン固有のコード不具合
管理画面の設定は「許可」のままでも内部処理が効かず拒否される
仕様変更による遮断  不具合による遮断

いずれの場合も、ウェブフックを受け取るサイト側では「ログインしていない外部からのPOSTリクエスト」として扱われるため、認証エラーが返ってしまう。ECサイトの決済通知や予約システムの在庫更新など、リアルタイム性が求められる連携ほど被害が大きい。

プラグイン設定でREST APIのアクセス制御を確認する

プラグイン設定でREST APIのアクセス制御を確認する

最初に行うべきは、該当プラグインの設定画面にREST API関連の項目が存在するかどうかの確認だ。多くのセキュリティ系プラグインやユーザー管理プラグインには「REST APIへのアクセスを制限する」「未認証ユーザーをブロックする」といったチェックボックスが用意されている。

管理画面から該当プラグインの設定ページを開き、「REST API」「APIアクセス」「外部リクエスト」「認証」などのキーワードを含む項目を探す。もし「未認証ユーザーのREST APIアクセスを無効にする」といった設定がオンになっていれば、これをオフに切り替えて保存し、外部からのリクエストが再び通るかをテストする。

設定項目の名称や位置はプラグインによって異なる。セキュリティタブの中にあったり、詳細設定の一番下に隠れていたりすることも多い。見つからない場合はプラグインのドキュメントや公式サポートフォーラムで「REST API permission」をキーに検索する。

設定確認から解決までのフロー
STEP 1 プラグイン設定でREST API許可のチェックボックスを探す
STEP 2 無効化されていればONに変更して保存
STEP 3 外部からAPIリクエストを送信して動作確認
STEP 4 改善しなければバージョンの切り戻しを検討

プラグインのバージョンを切り戻して検証する

プラグインのバージョンを切り戻して検証する

設定が正しく「許可」になっているにもかかわらずAPIが機能しない場合、プラグイン自体の不具合を疑う段階に入る。管理画面上は許可しているように見えて、内部的な処理では設定値を正しく読み取れていない可能性がある。

まずは該当プラグインの安定していた旧バージョンを入手し、手動でインストールし直す。公式プラグインディレクトリの「以前のバージョン」セクションや、プラグイン開発者がGitHubでリリースしているアーカイブからダウンロードできる。

切り戻しは次の手順で進める。プラグイン一覧画面で問題のプラグインを一度無効化し、削除する(設定データは残るため心配は不要)。続いて旧バージョンのZIPファイルを「プラグイン」→「新規追加」→「プラグインのアップロード」からインストールし有効化する。この状態で外部からのAPIリクエストが正常に処理されるかテストし、復旧を確認したら開発元に不具合報告を送る。

どうしても旧バージョンが入手できない場合は、WP Rollbackプラグインを使って管理画面から直接ダウングレードする方法もある。ただし本番サイトでの使用は慎重に行い、必ず事前にバックアップを取得しておく。

特定エンドポイントだけを許可するカスタム対応

特定エンドポイントだけを許可するカスタム対応

セキュリティ上の理由からREST API全体を無制限に開放したくない場合は、必要なエンドポイントだけを選択的に許可する方法が有効だ。たとえば決済ゲートウェイのウェブフックは特定のルート(/wp-json/wc/v3/ordersなど)だけ通ればよい。

テーマのfunctions.phpに以下のようなフィルターを追加すれば、特定のRESTルートに対して認証要件を緩和できる。コードを直接書く場合は必ず子テーマを利用する。

add_filter( 'rest_authentication_errors', function( $result ) {
    if ( ! empty( $result ) ) {
        return $result;
    }
    if ( strpos( $_SERVER['REQUEST_URI'], '/wp-json/my-plugin/v1/webhook' ) !== false ) {
        return true;
    }
    return $result;
});

このコードは、指定したパス(上の例では/my-plugin/v1/webhook)へのアクセスに対して認証チェックをスキップし、それ以外のエンドポイントは通常の認証を維持する。プラグイン本体を修正せずに済むため、アップデートが来ても上書きされる心配がない。

フィルターを追加した後は必ず、許可したエンドポイントに外部からcurlコマンドやPostmanでテストリクエストを送り、意図したとおりに動作することを確認する。想定外のエンドポイントが開放されていないかも併せてチェックする。

リバースプロキシやWAFがリクエストを遮断していないか調べる

リバースプロキシやWAFがリクエストを遮断していないか調べる

プラグインの設定もバージョンも問題ないのにAPIが機能しない場合、サーバー環境側でリクエストが遮断されている可能性がある。CDNのWAF(ウェブアプリケーションファイアウォール)、ホスティング側のセキュリティモジュール、あるいは.htaccessの記述が原因で、外部からのPOSTリクエストがブロックされているケースは意外に多い。

確認すべきはログだ。WAFを導入している場合はその管理画面で遮断ログを検索し、APIリクエストが誤検知でブロックされていないか調べる。サーバーのアクセスログでは、対象のエンドポイントにリクエストが到達しているかどうか、到達している場合のHTTPステータスコード(401や403なら認証・権限の問題、200系ならアプリケーション側で正常処理後にエラーが発生している)をチェックする。

とくに管理画面のURLを変更するプラグインや、xmlrpc.phpを無効化する設定が、間接的にREST APIのエンドポイントにまで影響を与えていることもある。これらの設定も一時的に解除してテストを行う。

よくある質問

どのプラグインがREST APIに影響を与えているか特定するには

全プラグインを一度無効化し、問題のエンドポイントに外部からアクセスして正常応答を確認する。その後、プラグインを1つずつ有効化しながら再テストすれば、原因のプラグインを絞り込める。テーマのfunctions.phpのカスタムコードも疑わしい場合は、標準テーマに一時的に切り替えて検証する。

外部サービスが受け取るエラーの内容を詳しく知るには

WordPressのREST APIは認証エラー時にJSON形式のエラーオブジェクトを返す。外部サービス側でHTTPレスポンスボディをログに残せるなら、codemessageの値を取得すれば原因の手がかりになる。ログが取れない場合は、curlで手動リクエストを送り、curl -vでレスポンスボディを直接確認する。

REST API全体を無効化せずにセキュリティを保つ方法はあるか

特定のIPアドレスからのみアクセスを許可する.htaccessの設定、APIキーやアプリケーションパスワードを使った認証の義務付け、あるいは必要なエンドポイントだけをホワイトリスト登録するカスタムコードで対応できる。無制限の全面開放は避け、必要最小限の権限に絞ることが安全面でも推奨される。

プラグインをダウングレードしても問題はないのか

セキュリティ修正や脆弱性対策を含むアップデートを巻き戻すことになるため、ダウングレードはあくまで一時的な回避策と位置づける。復旧を確認したら速やかに開発元へ報告し、修正バージョンがリリースされたらすぐに更新する。ダウングレード期間中はサイト全体の監視を強化する。

アップデート前のバージョンが不明な場合はどうするか

プラグイン一覧画面の「詳細を表示」から「開発」タブを開くと、過去のバージョン履歴が参照できる。または公式プラグインディレクトリの「Advanced View」に「Previous Version」のリンクが用意されている。どうしてもわからない場合は、バックアップから前回正常に動作していたプラグインファイルを復元する。

この記事のポイント

  • プラグイン更新後にREST APIが遮断されたら、まず設定画面のアクセス制御項目を確認する
  • 設定が正しくても動かない場合は、旧バージョンに切り戻して不具合を検証する
  • 必要なエンドポイントだけをfunctions.phpのフィルターで選択的に開放できる
  • WAFやサーバー設定がリクエストをブロックしていないかログで確認する
  • ダウングレードは一時的な対策とし、修正版のリリースを待って更新する
Premium Addonsの更新で重大なエラーが出た時の原因と対処法

Premium Addonsの更新で重大なエラーが出た時の原因と対処法

Premium Addons for Elementor の更新後に「このサイトで重大なエラーが発生しました」と表示されサイトが落ちる場合、原因は更新パッケージのファイル欠損や破損にある。is_widget() メソッドが見つからないエラーがログに記録されているなら、プラグインの手動再インストールで解決する可能性が高い。

なぜ Premium Addons の更新で致命的エラーが起きるのか

なぜ Premium Addons の更新で致命的エラーが起きるのか

Premium Addons 4.11.91 から 4.11.93 への更新中に「このサイトで重大なエラーが発生しました」が表示されるケースでは、エラーログに Call to undefined method PremiumAddons\Modules\Woocommerce\Module::is_widget() が記録される。

このエラーは、WordPress の自動更新や管理画面からのワンクリック更新を実行した際に、プラグインのファイル一式が完全に展開されず、一部の PHP ファイルが欠損した状態でバージョンだけが切り替わった場合に発生する。module-base.phpis_widget() メソッドを呼び出そうとしたタイミングで、その定義が存在せず PHP が致命的エラーを返す仕組みだ。

この種のエラーは Premium Addons に限らず、大規模なアドオン系プラグインの更新時に時折見られる。サーバーの実行時間制限やメモリ不足が引き金になることもあるが、今回は開発元が更新パッケージの不備を認めて修正版を再提供している。つまり原因は利用者側の環境ではなく、配信された更新ファイル自体の不備だ。

Before(エラー発生時)
管理画面から Premium Addons 更新 重大エラー
Error: Call to undefined method
PremiumAddons\Modules\Woocommerce\Module::is_widget()
After(修正後)
手動で 修正済み ZIP をアップロード 更新成功
WooCommerce モジュールが正常に読み込まれ、エラーログにも記録なし
エラー状態  修正後

このデモは、ファイル欠損が原因で起こる典型的なエラーパターンとその解消後の状態を示している。

手動でプラグインを再インストールする手順

手動でプラグインを再インストールする手順

自動更新でエラーが起きた場合、有効な解決策は修正版の ZIP ファイルを入手し手動でアップロードすることだ。以下の手順で進める。

STEP 1 Premium Addons の公式サイトまたは WordPress.org のプラグインページから最新の ZIP ファイルをダウンロードする
STEP 2 WordPress 管理画面の「プラグイン」→「新規追加」→「プラグインのアップロード」から ZIP を選択
STEP 3 「今すぐインストール」を実行し、既存のプラグインを上書きすることを確認
STEP 4 プラグインを有効化し、サイトキャッシュを全削除して動作を確認

手動アップロードによる上書き更新は、ファイルの破損や欠損を確実に修復できる方法だ。

公式サイトから ZIP を入手する

Premium Addons は WordPress.org の公式プラグインディレクトリで配布されている。検索エンジンで「Premium Addons for Elementor WordPress」を検索し、プラグインページの「ダウンロード」ボタンから ZIP ファイルを取得する。有料版を使っている場合は、購入元のアカウントページから最新バージョンをダウンロードする。

管理画面から ZIP をアップロードする

「プラグイン」→「新規追加」を開き、ページ上部の「プラグインのアップロード」ボタンをクリックする。ファイル選択画面で先ほどダウンロードした ZIP を選び、「今すぐインストール」を押す。WordPress が「すでにインストールされています」と検出した場合、「現在のものをアップロードしたものに置き換える」という選択肢が出るのでそれを選ぶ。

キャッシュを完全にクリアする

プラグインの上書きが完了したら、サイトのキャッシュを徹底的に削除する。キャッシュ系プラグイン(W3 Total Cache や WP Super Cache など)の「全キャッシュ削除」機能を実行し、さらにブラウザのキャッシュもクリアする。サーバー側で Nginx FastCGI キャッシュや Redis オブジェクトキャッシュを使っている場合はそれらも合わせてクリアする。

それでもエラーが続く場合の追加対応

それでもエラーが続く場合の追加対応

エラーログの詳細を確認する

手動再インストール後もエラーが続くなら、まず WooCommerce のステータスログを開く。「WooCommerce」→「ステータス」→「ログ」タブから、fatal-errors で始まる最新のログを確認する。別のメソッドやファイルでエラーが出ている場合、プラグインの競合が原因である可能性が高い。

プラグイン競合の切り分けを実施する

Premium Addons 以外の全プラグインを一時的に無効化し、WordPress の標準テーマ(Twenty Twenty-Five など)に切り替える。その状態で Premium Addons だけを有効にしてエラーが再現するか確認する。ここで問題が解消すれば、無効化したプラグインの中に競合相手がいる。

開発元に修正版をリクエストする

公式リポジトリのバージョンでもエラーが解消しない場合は、Premium Addons のサポートフォーラムにエラーログ全文と環境情報(WordPress バージョン、PHP バージョン、Elementor バージョン)を添えて報告する。開発元が個別の修正パッケージを提供してくれることがある。

よくある質問

管理画面すら開けない状態でどうやって直せばいいか

FTP クライアントまたはレンタルサーバーのファイルマネージャーで /wp-content/plugins/premium-addons-for-elementor/ ディレクトリを一旦リネームする。これでプラグインが無効化され管理画面にアクセスできるようになる。その後、正しい ZIP を展開し直して元のディレクトリ名に戻し、管理画面から有効化する。

WooCommerce を無効にすればエラーは出なくなるのか

エラーの発生箇所が WooCommerce 用モジュールであるため、WooCommerce 本体を無効化すればこの特定のエラーは止まる。しかしショップ機能が完全に停止するため、恒久対応にはならない。あくまで緊急避難として認識し、速やかに Premium Addons の修正を行うべきだ。

自動更新を止めて手動更新に切り替えるべきか

Premium Addons に限って一時的に自動更新を無効化するのは有効な予防策だ。「プラグイン」画面で該当プラグインの「自動更新を有効化」のチェックを外せば、次回以降の更新は手動で制御できる。問題が完全に解決したと確認できた後に再度自動更新を有効化すればよい。

PHP のバージョンが原因ということはあるか

Premium Addons は PHP 8.3 に対応しているため、今回の is_widget() エラーは PHP バージョンに起因するものではない。ただし PHP 8.x 系ではメソッドの未定義エラーが例外ではなく致命的エラーとして扱われるようになったため、以前の PHP 7.x 系では警告で済んでいた問題がサイト停止に直結するようになっている。

この記事のポイント

  • Premium Addons 更新後の重大なエラーは、更新ファイルの欠損や破損で定義されていないメソッドを呼び出すのが原因
  • 手動で最新の ZIP ファイルをアップロードして上書きすれば解決する
  • キャッシュの全削除を忘れずに行う
  • 再発防止として自動更新の一時停止や更新前のバックアップが有効
  • FTP からのプラグイン無効化は管理画面にアクセスできないときの最終手段
WPC Linked Variation 更新で管理画面の依存スクリプトエラーを修正する方法

WPC Linked Variation 更新で管理画面の依存スクリプトエラーを修正する方法

WooCommerceの商品バリエーションを扱うプラグイン「WPC Linked Variation」(WooCommerce用)を使っていると、管理画面のあらゆるページで「依存関係にあるスクリプトが登録されていません」という警告が表示される場合がある。これはバージョン4.4.3以前の不具合であり、最新版4.4.4以降へアップデートすればすぐに消える。

エラー「正しく呼び出されていません」の中身と発生原因

エラー「正しく呼び出されていません」の中身と発生原因
エラー状態
管理画面の任意のページで、「依存関係 wc-enhanced-select, selectWoo が登録されていない」という警告が表示される
正常状態
プラグイン更新後、または正しい画面チェック付きで読み込まれれば警告は消え、管理画面がすっきりする

上記のようなデモの流れで、管理画面の上部やQuery Monitorに突然エラーが出現する。

WooCommerceは商品編集画面や注文編集画面といった限定された管理ページにのみ、wc-enhanced-selectselectWooといった選択UIを拡張するためのスクリプトを登録している。ところがWPC Linked Variation 4.4.3は、admin_enqueue_scriptsアクションの中で画面を一切絞り込まずに、これらに依存するwpclv-backendを読み込もうとしていた。

その結果、WooCommerceがスクリプトを用意していない「割引プラグインの設定画面」や「ユーザープロフィール」など、まったく関係のないページで依存先が見つからず、WordPressが「WP_Scripts::add の呼び出しが正しくない」と警告を出す。フロントエンドの表示や動作には影響しないが、管理画面の見通しが悪くなり、Query Monitorなどのデバッグツールを使っていると特に目立つ。

プラグイン更新でエラーを消す手順

プラグイン更新でエラーを消す手順
STEP 1 WordPress管理画面「プラグイン」→「インストール済みプラグイン」へ移動する
STEP 2 「WPC Linked Variation for WooCommerce」に更新通知が出ていたら「今すぐ更新」をクリックする
STEP 3 更新後、管理画面を再読み込みしてエラーが消えたことを確認する

プラグイン一覧に更新通知が表示されない場合は、WooCommerce公式マーケットプレイスまたはCodeCanyonから最新版を手動でダウンロードし、FTP経由で上書きする方法もある。いずれの場合も、更新前に必ずサイト全体のバックアップを取得しておく。

バージョン4.4.4では、開発者がadmin_enqueue_scripts内に適切な画面チェックを実装し、WooCommerceの商品編集画面でのみ依存スクリプトを読み込むように修正された。そのため、他のプラグインの設定画面や投稿一覧などで無用な警告が出ることはなくなる。

すぐにアップデートできない場合の一時しのぎ

すぐにアップデートできない場合の一時しのぎ

プロジェクトの都合ですぐにプラグインを更新できない場合、応急処置としてQuery Monitorを一時的に無効化するか、プラグインファイルを手動で編集する方法がある。後者は更新時に上書きされてしまうため、あくまで次のアップデートまでのつなぎと考えてほしい。

コードを直接修正する開発者向け手順

WPC Linked Variationのプラグインフォルダ内にある wpc-linked-variation.php を開き、admin_enqueue_scripts にフックしている関数を以下のように変更する。現在の管理画面オブジェクトを取得し、投稿タイプが product の場合だけスクリプトを読み込む条件を追加する。

// 修正前(問題のあるコード)
add_action('admin_enqueue_scripts', 'wpclv_enqueue_scripts');
function wpclv_enqueue_scripts() {
    wp_enqueue_script('wpclv-backend', plugins_url('assets/js/backend.js', __FILE__), array('wc-enhanced-select', 'selectWoo'), WPC_Linked_Variation::VERSION, true);
}

// 修正後(画面チェックを追加)
add_action('admin_enqueue_scripts', 'wpclv_enqueue_scripts_fixed');
function wpclv_enqueue_scripts_fixed($hook) {
    $screen = get_current_screen();
    if ($screen && $screen->post_type === 'product') {
        wp_enqueue_script('wpclv-backend', plugins_url('assets/js/backend.js', __FILE__), array('wc-enhanced-select', 'selectWoo'), WPC_Linked_Variation::VERSION, true);
    }
}

この修正により、商品の編集・新規追加画面でのみスクリプトが読み込まれ、それ以外の管理画面ではエラーが発生しなくなる。修正後は管理画面をリロードして警告が消えることを確認する。本体のアップデートが可能になった時点で、必ず公式の最新版に差し替えることを推奨する。

よくある質問

このエラーはサイトのフロントエンドに影響しますか

影響しない。あくまで管理画面内でQuery MonitorやWordPressのデバッグ表示が警告を出すだけであり、来訪者が見る商品ページやチェックアウト画面の動作は変わらない。

プラグインを更新する以外の簡単な対処法はありますか

Query Monitorプラグインを無効化すればエラー表示自体は消えるが、あくまで表示上の回避に過ぎない。管理画面のパフォーマンスや他のスクリプト競合のリスクが残るため、プラグイン本体の更新が確実な解決策になる。

ほかのプラグインでも同様の「正しく呼び出されていません」エラーが出ます

多くのプラグインが管理画面用のスクリプトを読み込む際、WooCommerceや他のプラグインが提供するライブラリを依存関係に指定することがある。読み込むページを限定していない場合、同様の依存エラーが発生する。該当プラグインの開発者に報告するか、バージョンアップ情報を確認するのが近道だ。

バージョン4.4.4に更新してもまだエラーが消えない場合は

まずブラウザキャッシュとWordPressのキャッシュ(サーバーキャッシュやプラグインキャッシュ)をすべてクリアする。それでも消えなければ、別のプラグインが同様の問題を起こしている可能性があるため、すべてのプラグインを一時停止し、一つずつ有効化して原因を特定する。WooCommerce本体も常に最新版に保つ。

この記事のポイント

  • WPC Linked Variation 4.4.3以前に起因する管理画面のスクリプト依存エラー
  • プラグインを4.4.4以降にアップデートすれば完全に解消する
  • エラーはフロントエンドに影響せず、管理画面の表示だけの問題
  • 応急処置としてQuery Monitor無効化やコード修正も可能だが、公式更新が最も安全
  • 他プラグインでも同様の警告が起きる場合、画面チェックの有無を疑う
埋め込みチャットでNS_ERROR_DOM_COEP_FAILEDエラーが出た時の直し方

埋め込みチャットでNS_ERROR_DOM_COEP_FAILEDエラーが出た時の直し方

サイトに埋め込んだ Teams やその他のチャットウィジェットをクリックした時に NS_ERROR_DOM_COEP_FAILED と表示されて開けない場合、サーバーが返している COEP(Cross-Origin Embedder Policy)ヘッダーが原因だ。htaccess で Cross-Origin-Embedder-Policy を credentialless に変更するか、不要なヘッダーであれば削除することで解決する。

NS_ERROR_DOM_COEP_FAILEDとは何か

NS_ERROR_DOM_COEP_FAILEDとは何か

COEP は「Cross-Origin Embedder Policy」の略で、ページが他オリジン(別ドメイン)のリソースを読み込む際のセキュリティルールを定める HTTP レスポンスヘッダーだ。このヘッダーが require-corp に設定されていると、埋め込む側のリソースすべてに CORP(Cross-Origin Resource Policy)ヘッダーが付与されていることをブラウザが要求する。

Teams のチャットウィジェットをはじめ、多くのサードパーティ製ウィジェットは自社の配信サーバーから JavaScript や画像を読み込むが、それらのリソースに CORP ヘッダーが付与されていないことが多い。結果としてブラウザが読み込みをブロックし、NS_ERROR_DOM_COEP_FAILED というエラーをコンソールに出力する。

このエラーは Firefox や Chrome などのモダンブラウザで発生し、ウィジェットのボタンは表示されるがクリックしてもチャット画面が開かない、または読み込み中のまま固まるといった症状が出る。

COEPエラーが発生する仕組み
自サイトのサーバー
COEPヘッダーを require-corp で返している
Teams ウィジェット(他オリジン)
配信する JS や画像に CORP ヘッダーが付いていない
ブラウザがブロック
NS_ERROR_DOM_COEP_FAILED を出力しウィジェットが開かない
エラーの流れ  外部リソース

この図のとおり、自サイトのサーバー設定と外部ウィジェットの配信仕様が噛み合わず、ブラウザが安全側に倒して読み込みを拒否するのが根本的な原因だ。

自サイトにCOEPヘッダーが設定されているか確認する手順

自サイトにCOEPヘッダーが設定されているか確認する手順

まずは自サイトが実際に COEP ヘッダーを返しているかどうかを確認する。ブラウザの開発者ツールを使えば数分で特定できる。

Chrome や Firefox の開発者ツールでレスポンスヘッダーを確認する

サイトの任意のページを開き、F12 キーで開発者ツールを起動する。NetWork タブを開いてページを再読み込みし、先頭のドキュメントリクエスト(多くの場合はページURLそのもの)をクリックする。Response Headers セクションに Cross-Origin-Embedder-Policy という項目があれば、その値が現在の設定だ。

値が require-corp になっている場合、厳格な制限がかかっている状態で、これがエラーの直接原因になる。値が credentialless であればクロスオリジンの埋め込みは許可されているため、別の要因を探す必要がある。ヘッダー自体が存在しない場合は、COEP 以外の原因(CORS 設定やウィジェット側のスクリプトエラーなど)を疑う。

セキュリティプラグインやCDNが自動付与しているケース

WordPress サイトの場合、セキュリティ系プラグインが HTTP レスポンスヘッダーを自動で追加していることがある。また Cloudflare などの CDN サービスを経由していると、CDN 側のセキュリティ設定で COEP ヘッダーが付与されるケースもある。

該当しそうなプラグインを一つずつ無効化してヘッダーの変化を確認するか、CDN の管理画面で「ヘッダー設定」や「セキュリティヘッダー」といった項目をチェックすると原因を絞り込める。

htaccessでCOEPヘッダーを修正してエラーを解決する

htaccessでCOEPヘッダーを修正してエラーを解決する

原因が COEP ヘッダーの require-corp 設定にあると特定できたら、htaccess ファイルを編集して修正する。Apache サーバーを使っている国内レンタルサーバーの大半は htaccess による上書きが可能だ。

STEP 1 FTP またはサーバーのファイルマネージャーでサイトのルートディレクトリにアクセスする
STEP 2 .htaccess ファイルをダウンロードしバックアップを取る(必須)
STEP 3 COEP ヘッダーを credentialless に設定するコードを追記する
STEP 4 ファイルをアップロードしブラウザキャッシュをクリアして動作確認する

上記 STEP 3 で追記するコードは以下のとおりだ。htaccess の末尾にこのブロックを追加する。

<IfModule mod_headers.c>
Header set Cross-Origin-Embedder-Policy "credentialless"
</IfModule>

この設定により、COEP ヘッダーが credentialless モードに切り替わる。credentialless はクロスオリジンのリソース読み込みを許可しつつ、認証情報(Cookie や HTTP 認証)を送信しないモードだ。Teams のチャットウィジェットは認証に Cookie を使わず独自のトークンで認証するため、credentialless モードでも問題なく動作する。

COEPヘッダーを完全に削除する方法

セキュリティ上の要件が特にないサイトであれば、COEP ヘッダー自体を削除する選択肢もある。以下のコードを htaccess に追記すればヘッダーが除去される。

<IfModule mod_headers.c>
Header unset Cross-Origin-Embedder-Policy
</IfModule>

どちらの方法を選ぶかはサイトのセキュリティポリシー次第だ。COEP ヘッダーが元々セキュリティプラグインや CDN の自動設定で付与されていたのであれば、credentialless への変更が無難だ。手動で require-corp を指定していた場合は、その意図を再確認した上で削除または変更を判断する。

htaccess編集後に変更が反映されない場合の確認ポイント

ファイルをアップロードしてもヘッダーが変わらない場合、mod_headers モジュールがサーバーで有効になっていない可能性がある。また、CDN を経由しているサイトでは CDN のキャッシュをパージしないと変更がすぐに反映されない。WordPress のキャッシュプラグインを使っている場合も、プラグインの設定画面からキャッシュを全削除する。

変更後は必ず開発者ツールの NetWork タブでレスポンスヘッダーを再確認し、Cross-Origin-Embedder-Policy の値が credentialless に変わっているか、ヘッダー自体が消えているかを検証する。

htaccessが使えないサーバー環境での対処法

htaccessが使えないサーバー環境での対処法

Nginx を使っている VPS やクラウド環境では htaccess が使えない。また一部の共用サーバーでは mod_headers が無効化されている場合もある。そうしたケースでの対処法をまとめる。

Nginxの場合

Nginx の設定ファイル(nginx.conf またはサイト単位の conf ファイル)の server ブロック内に以下の行を追加する。

add_header Cross-Origin-Embedder-Policy "credentialless";

記述後は nginx -t で設定ファイルの文法チェックを行い、問題がなければ nginx -s reload で設定を再読み込みする。sudo 権限が必要な操作のため、レンタルサーバーではサポートに依頼する必要がある。

CDNやWAFでヘッダーを操作する

Cloudflare を使っている場合、ダッシュボードの「ルール」から「HTTP レスポンスヘッダーを変更」ルールを作成し、Cross-Origin-Embedder-Policy を credentialless に上書きできる。サーバー側の設定を一切触らずに済むため、htaccess 編集に不安がある場合の現実的な代替手段になる。

PHPでヘッダーを直接出力する

WordPress のテーマの functions.php に以下のコードを追加する方法もある。テーマ更新時に消えないよう、必ず子テーマを使う。

function my_set_coep_header() {
    header('Cross-Origin-Embedder-Policy: credentialless');
}
add_action('send_headers', 'my_set_coep_header');

この方法はサーバー設定に依存せず、WordPress の仕組みだけでヘッダーを制御できる。ただし、テーマの functions.php を編集するため、誤った記述があるとサイトが表示できなくなるリスクを伴う。編集前に必ず functions.php のバックアップを取る。

よくある質問

COEPエラーは特定のブラウザだけに出るのか

Firefox と Chrome 系ブラウザ(Chrome、Edge、Brave など)で発生する。Safari は COEP への対応が遅れていたが、Safari 17.2 以降はサポートしている。ブラウザによってエラーメッセージの文言は異なるが、根本原因は同じ COEP ヘッダーだ。

WordPressのセキュリティプラグインが原因になることはあるか

ある。HTTP セキュリティヘッダーを自動付与する機能を持つプラグイン(セキュリティ全般を扱うプラグインやヘッダー専用プラグイン)が、COEP を含むヘッダーを一括で設定しているケースは多い。プラグインの設定画面で「セキュリティヘッダー」や「HTTP ヘッダー」項目を探し、COEP の値を変更または無効化する。

credentiallessとrequire-corpの違いは何か

require-corp は埋め込み先の全リソースに CORP ヘッダーを必須とする厳格モードだ。一方 credentialless は CORP ヘッダーなしでもクロスオリジン読み込みを許可するが、認証情報(Cookie など)は送信しない。Teams チャットのような独自認証を使うウィジェットでは credentialless で十分動作する。

埋め込みウィジェット側の設定で回避できるか

原則として難しい。COEP エラーは「読み込む側(自サイト)」の制限によって発生するため、ウィジェット提供元(Teams など)の設定で回避する手段はない。ウィジェット提供元が自社の全配信リソースに CORP ヘッダーを付与すれば解決するが、それを個別の利用者が依頼して実現するのは現実的ではない。

htaccess編集に自信がない場合はどうすればよいか

サーバーの管理画面からファイルマネージャーで操作する場合は、編集前に必ず htaccess をコピーしてローカルに保存する。ミスでサイトが表示できなくなったら、そのバックアップをアップロードし直せば元に戻る。どうしても不安な場合は、CDN のヘッダー変更機能や PHP の functions.php で対応する方法を検討する。

この記事のポイント

  • NS_ERROR_DOM_COEP_FAILED はサーバーの COEP ヘッダーが require-corp の時に発生する
  • Teams など多くの外部ウィジェットは CORP ヘッダーを返さないためブロックされる
  • htaccess で COEP を credentialless に変更するかヘッダーを削除すれば解決する
  • Nginx 環境や CDN 経由の場合は別の設定手順が必要になる
  • 修正後は必ず開発者ツールでレスポンスヘッダーが変わったか確認する
WordPressサイトがハッキングされた時の難読化PHPコードの見つけ方と完全駆除手順

WordPressサイトがハッキングされた時の難読化PHPコードの見つけ方と完全駆除手順

WordPressサイトのindex.phpなどのコアファイルに難読化された悪意あるPHPコードが埋め込まれ、不審なサイトへリダイレクトされる被害が発生した場合、感染ファイルの完全削除とコアファイルの再インストール、全認証情報の変更を同時に進める必要がある。

この種の改ざんは「goto文」や16進数エンコードした文字列、外部サーバーとの通信機能などを使って巧妙に隠されている。残骸を残さず駆除し、再侵入経路をすべて塞ぐ手順を具体的に追っていく。

なぜWordPressサイトに難読化された悪意あるコードが仕込まれるのか

なぜWordPressサイトに難読化された悪意あるコードが仕込まれるのか

攻撃者が難読化コードを埋め込む目的は大きく3つある。不正なリダイレクトによるアフィリエイト収益の横取り、サイト訪問者の個人情報やパスワードの窃取(フィッシング)、そしてサイト自体を踏み台にして別のサーバーを攻撃するスパム配信やDDoS攻撃の中継だ。

コードの難読化は、セキュリティプラグインや手動の目視検査をすり抜けるために施される。変数名や関数名をランダムな文字列にし、goto文で処理の流れを複雑に飛ばすことで、実際に何を実行しているのかを読み取りにくくしている。この手のコードは、単独のファイルに留まらず、複数のテーマファイルやアップロードディレクトリに分散して設置されることが多い。

ハッキングの兆候(BEFORE)
  • トップページが別ドメインにリダイレクトされる
  • index.phpの先頭に見慣れないgoto文や16進数文字列のブロックがある
  • 管理画面が重くなり、プラグインの一覧に覚えのない項目が増えている
駆除後の正常状態(AFTER)
  • サイトのURLが正しく表示され、意図しない転送が発生しない
  • コアファイルが公式のチェックサムと完全一致する
  • 管理者アカウントやプラグインに不審な追加がない
感染中  駆除後

上記の例は、攻撃者が検索エンジンのボットを判別し、Googleなどのクローラーには元の正常なページを見せ、一般の訪問者だけに不正サイトへ飛ばす「クローキング」という手法の典型的な挙動を示している。

感染したWordPressサイトを手動で完全に駆除する手順

感染したWordPressサイトを手動で完全に駆除する手順

感染が疑われるファイルとディレクトリを優先して検査する

改ざんされたコードは、WordPressのルートディレクトリ直下のindex.phpwp-config.phpだけでなく、テーマやプラグインのディレクトリ、アップロードディレクトリにも潜む。次の場所を重点的に確認する。

  • ルートディレクトリの全.phpファイル(index.phpwp-load.phpwp-settings.phpなど)
  • /wp-content/themes/ 配下の全テーマ(特にアクティブなテーマのfunctions.php
  • /wp-content/plugins/ 配下の全プラグインファイル
  • /wp-content/mu-plugins/(もし存在すれば)
  • /wp-content/uploads/ 配下のPHPファイル(本来PHPファイルが存在すべきではないディレクトリ)
  • /wp-includes/ 配下のコアファイルの改ざん有無(後述のチェックサム検証で判別可能)
  • .htaccess ファイル(リダイレクトルールや不正なコードブロックが追記されていないか)

WordPressコアファイルの再インストールとチェックサム検証

wp-content ディレクトリと wp-config.php を除き、WordPressのコアファイルをすべて公式の配布ファイルで上書きするのは安全かつ最も確実な駆除方法だ。管理画面の「ダッシュボード」→「更新」から「再インストール」を実行するか、手動で行う場合は次の手順を踏む。

STEP 1 WordPress公式サイトから最新のzipファイルをダウンロードし展開する
STEP 2 現在のサイトから wp-content ディレクトリと wp-config.php をローカルにバックアップ(退避)する
STEP 3 サーバー上の wp-adminwp-includes を完全に削除し、展開した公式ファイルの同名ディレクトリをアップロード
STEP 4 ルートディレクトリの全 .php ファイル(wp-config.php を除く)を公式ファイルで上書き
STEP 5 退避しておいた wp-contentwp-config.php をサーバーに戻し、wp-config.php に手動で追記された不正な行がないか目視確認
STEP 6 wp-includes/version.php を確認し、バージョン番号が正しいか検証。その後、プラグイン「WordPress Core Verify」などでチェックサムを検証する

管理画面にアクセスできるなら「ダッシュボード」→「更新」の「WordPressを再インストール」ボタンを押すだけで同等の処理が完了する。手動で行う場合も、wp-contentwp-config.php を保護している限り、データ消失の心配はない。

感染源を特定するためにサーバーログとタイムスタンプを照合する

どの脆弱性から侵入されたかを特定するには、改ざんされたファイルのタイムスタンプとサーバーのアクセスログ、エラーログを突き合わせる。ログに「POST /wp-admin/admin-ajax.php」や「POST /xmlrpc.php」への不自然な連続リクエストが記録されていれば、ブルートフォース攻撃やXML-RPCを経由した侵入が疑われる。

ホスティングのコントロールパネルから「Raw Access Logs」や「エラーログ」をダウンロードし、改ざん発生日時の前後を中心に調べる。プラグインやテーマのアップデートを長期間放置していた場合は、脆弱性情報データベース(CVE)で該当バージョンの既知の脆弱性を検索し、侵入経路の仮説を立てる。

適切なファイルパーミッションに設定し直す

ディレクトリは755、ファイルは644を基本とし、wp-config.phpだけは440または400に設定して読み取り権限を厳格にする。特にwp-content/uploads/ 配下にPHPファイルが置かれている場合は、そのディレクトリでPHPの実行を.htaccessで明示的に拒否しておくべきだ。

# .htaccess を wp-content/uploads/ に設置する場合
<FilesMatch "\.(php|php\.)$">
    Require all denied
</FilesMatch>

プラグインとテーマをクリーンな状態に置き換える

すべてのプラグインとテーマを、公式ディレクトリまたは購入元から再ダウンロードした完全に新しいファイルで上書きする。非公式サイトから入手したプラグインやテーマ、長期間更新が止まっているものは、この機会に削除するか代替に切り替える。

とくに mu-plugins ディレクトリは、手動で設置しない限り通常は存在しない。見慣れないディレクトリ名やPHPファイルがあれば、即座に削除する。

データベース内の不正なコードや管理者アカウントを検査する

phpMyAdminやWP-CLIを使って、wp_options テーブルの「siteurl」や「home」、wp_posts の投稿内容に不審なスクリプトタグやiframeが埋め込まれていないかを調べる。同時に、wp_users テーブルで身に覚えのない管理者アカウントが追加されていないかも必ず確認する。

データベース内の隠し管理者を一括で探すには、WP-CLIで次のコマンドを実行すると早い。

wp user list --role=administrator

全認証情報を変更しセキュリティキーを再生成する

駆除作業が完了したら、WordPress管理画面の全ユーザーパスワード、データベースパスワード、SFTP/SSHパスワード、ホスティングのコントロールパネルパスワードをすべて変更する。wp-config.php の「AUTH_KEY」「SECURE_AUTH_KEY」などのセキュリティ用ソルトも、WordPress.orgの公式ソルト生成ツールで新しいものに置き換える。

よくある質問

クリーンなバックアップがない場合、復旧の優先順位はどう決めればよいか

バックアップが存在しない、またはバックアップ自体が感染後のものである場合は、コアファイルの再インストールとプラグイン・テーマの全置き換えを最優先する。データベースの修復はその後で、不正な投稿やユーザーを手動で削除する。サイトのダウンタイムを最小限にするため、メンテナンスモードを有効にして作業するのが安全だ。

無料のプラグインやテーマが感染の原因になることはあるか

公式ディレクトリで配布されている無料プラグインでも、深刻な脆弱性が発見されて更新が滞れば攻撃の糸口になりうる。とくに、公式ディレクトリ以外のサイトから配布されている「nulled(クラック)」版の商用プラグインやテーマは、ほぼ確実にバックドアが仕込まれているため、絶対に使用してはいけない。

データベースを直接編集する際の注意点は何か

phpMyAdminなどでデータベースを直接操作する場合は、必ず事前にデータベース全体のダンプ(エクスポート)を取っておく。wp_options テーブルの「active_plugins」行を誤って削除すると全プラグインが無効化されるため、行の値を直接編集するよりも、WP-CLIのwp optionコマンドを使うほうが安全に操作できる。

cronジョブに疑わしいタスクが仕込まれていないか調べる方法は

WordPressの疑似cron(WP-Cron)はwp_options テーブルの「cron」オプションに格納されている。WP-CLIでwp cron event listを実行すると登録されている全タスクを一覧できる。ホスティング側の本物のcronジョブ(crontab)に不正なエントリが追加されていないかも、ホスティングの管理画面またはSSHで確認する。

攻撃者に検索エンジンのボット判定をすり抜けられた場合の追加対策は

難読化コードがボット判定を行っている場合、駆除後もクローキング用のキャッシュがCDNや検索エンジンに残っている可能性がある。サイト駆除後にGoogleサーチコンソールで「URL検査」→「インデックス登録をリクエスト」を実行し、CDNの全キャッシュをパージする。HTTPヘッダーを改ざんされていないかも、curlコマンドなどで確認しておくべきだ。

この記事のポイント

  • 難読化PHPコードは複数ファイルに分散して設置されるため、ルート直下、テーマ、プラグイン、アップロードディレクトリをすべて検査する
  • WordPressコアファイルは wp-contentwp-config.php を保護したうえで公式ファイルで完全に上書きする
  • 改ざんファイルのタイムスタンプとサーバーログを照合し、侵入経路を特定して永続的な対策を講じる
  • 全認証情報の変更とソルトの再生成を駆除と同時に行い、再侵入を防ぐ
  • クリーンなバックアップがある場合は、全ファイルとデータベースの削除後にバックアップから復元するのが最も確実な方法である
プラグイン更新後に WordPress ログイン不能になる「Cookie がブロックされました」エラーの直し方

プラグイン更新後に WordPress ログイン不能になる「Cookie がブロックされました」エラーの直し方

CF7 Google Sheet Connector バージョン 5.2.1 へのアップデート直後から、WordPress の管理画面にまったくログインできず、ログインページで「Cookie は予期しない出力のためにブロックされました」というエラーが表示されるなら、直接の原因はそのプラグインの不具合にある。FTP を使ってプラグインフォルダをリネームし、強制的に無効化すればログイン機能をすぐに回復できる。

プラグイン更新後に WordPress へログインできなくなる根本原因

プラグイン更新後に WordPress へログインできなくなる根本原因

WordPress のプラグインやテーマは、PHP の開始タグを閉じずにファイルを記述するのが一般的だ。しかし、何らかの原因でファイルの末尾に余分なスペースや空行が紛れ込んだり、意図しない echoprint が実行されたりすると、WordPress 本体が HTTP レスポンスを送信する前に「予期しない出力」が生まれる。

この予期しない出力は、ログイン機能で使われるセッション Cookie や setcookie() 関数の動作を妨げる。PHP は一度でも出力が行われると、後から HTTP ヘッダーを書き換えられないため、WordPress が正しく Cookie を発行できなくなり、結果として「重大なエラー」画面や「Cookie は予期しない出力のためにブロックされました」というエラーメッセージを返すようになる。

Before(異常なプラグイン有効時)
WordPress プラグイン 予期しない出力(空行や echo 等)
ヘッダー送信前にボディが出力される
→ ログイン時に Cookie 発行失敗
→ 「重大なエラー」「Cookie がブロックされました」表示
After(プラグインを無効化後)
WordPress 問題プラグイン停止中
不要な出力なし
→ Cookie 発行成功、ログイン再開
エラー状態  修正後

このデモが示すのは、問題のプラグインが WordPress のログインプロセスに割り込んでしまう仕組みだ。CF7 Google Sheet Connector 5.2.1 をはじめ、ごく一部のバージョンでこの現象が発生するケースが海外フォーラムでも報告されている。根本的には、プラグイン開発者が PHP ファイルの末尾やインクルード処理に余計な出力を残してしまうヒューマンエラーに起因する。

「Cookie がブロックされました」はなぜ起こるのか── unexpected output の詳細

「Cookie がブロックされました」はなぜ起こるのか── unexpected output の詳細

「Cookie は予期しない出力のためにブロックされました」は、WordPress のログイン時でなくても、プラグインの有効化画面で「このプラグインは有効化中に 3 文字の予期しない出力を生成しました」といった警告文とともに現れる。この警告は、まさに PHP が <?php の開始タグよりも前やファイル末尾に余計な空白文字を出力している証拠だ。

コンタクトフォームの送信自体は成功し、Google スプレッドシートへのデータ転送も動いているのに、ログインだけが機能しなくなるのは、フォーム送信とログイン認証で通る PHP の実行経路が異なるためだ。フォーム送信時にはセッション Cookie を新たに発行する必要がないため、表面上は問題が表面化しにくい。しかし wp-login.php や管理画面の認証周りでは、必ず Cookie のセットが行われるので、エラーが必ず検出される。

FTP で問題のプラグインを無効化する具体的な手順

FTP で問題のプラグインを無効化する具体的な手順

管理画面にログインできない状態では、ブラウザ上の操作だけではプラグインを停止できない。ここで必要なのが、契約しているレンタルサーバーの FTP アカウントを使った直接のファイル操作だ。FTP クライアントやサーバー管理画面のファイルマネージャー機能を利用して、次の手順を実行する。

STEP 1 FTP クライアントまたはサーバーのファイルマネージャーで WordPress インストール先に接続する
STEP 2 /wp-content/plugins/ ディレクトリに移動する
STEP 3 問題のプラグインのフォルダ(例 cf7-google-sheet-connector)を探し、リネームする(末尾に _disable などをつける)
STEP 4 ブラウザで /wp-admin/ にアクセスし、通常通りログインできるか確認する

リネームはフォルダ名の先頭や末尾に「_」を付けるだけでも十分であり、WordPress がそのプラグインを認識できなくなる。ログインが回復したら、管理画面の「プラグイン」一覧から、無効化された状態の当該プラグインを確認できる。ここで「削除」を選べば、問題のバージョンは完全に取り除かれる。

プラグインを以前のバージョンに戻して再発を防ぐ

プラグインを以前のバージョンに戻して再発を防ぐ

CF7 Google Sheet Connector を使い続ける必要があるなら、安定していた旧バージョンに戻すか、開発元が修正パッチを公開するのを待つことになる。WordPress 管理画面からプラグインを再インストールする際は、あえてバージョン 5.2.1 を避け、プラグインページ下部の「以前のバージョン」セクションや、WP Rollback のようなロールバック専用プラグインを使って前のバージョンにダウングレードできる。

また、問題が発生したプラグインをどうしても最新で使い続けたいのであれば、プラグインのサポートフォーラム(WordPress.org 内)で「バージョン 5.2.1 で unexpected output が発生しログイン不能になる」という事象を報告し、修正を促すのが建設的だ。開発者が原因を把握すれば、比較的早期に新しいバージョンがリリースされる可能性が高い。

よくある質問

FTP アカウント情報がわからない場合はどうすればいいか

契約しているレンタルサーバーの管理画面(コントロールパネル)に、FTP アカウントの設定やファイルマネージャー機能が用意されているケースが多い。cPanel なら「FTP アカウント」メニューから新規作成やパスワード再設定が可能だ。サーバー会社のサポートに問い合わせれば、FTP 接続情報を再発行してもらえることもある。

プラグインを無効化してもログインエラーが直らない

同様の症状が他のプラグインやテーマでも発生する可能性がある。全プラグインを無効化し、標準テーマ(Twenty Twenty-Five 等)に切り替えた状態で症状が消えるかどうかを確認する。それでも直らない場合は、サーバーの PHP エラーログを調べ、別の致命的エラーが起きていないか検証する必要がある。

プラグインの更新を止める方法はあるか

WordPress の標準機能では特定プラグインの自動更新だけを選択的に止めることはできないが、プラグイン「Easy Updates Manager」を使うと、プラグイン単位で自動更新を無効化できる。問題のあるバージョンを避けつつサイトを安全に保つには、ステージング環境で事前に更新テストを行うのが最も確実だ。

フォームのデータが送信されていれば問題ないのか

フォームが動いているからといって放置するのは危険だ。ログイン不能はサイト全体の管理を妨げるだけでなく、同じ予期しない出力が他の機能(RSS フィードや REST API)にも影響を及ぼす恐れがある。できる限り早急に原因のプラグインを停止し、サイト全体の健全性を取り戻す必要がある。

プラグインを手動で削除してもデータは残るのか

CF7 Google Sheet Connector の場合、コンタクトフォームの設定や Google スプレッドシートとの認証情報はデータベースに保存される。そのため、プラグインフォルダを削除しても設定情報は消えない。再度同じプラグインをインストールすれば、以前の連携設定を引き継げる可能性が高いが、念のためデータベースのバックアップを取ってから削除するのが安全だ。

この記事のポイント

  • CF7 Google Sheet Connector 5.2.1 では unexpected output によりログイン不能になる不具合が報告されている
  • 「Cookie がブロックされました」は PHP の予期しない出力が原因で、FTP を使ったプラグイン無効化で回復する
  • 管理画面にログインできなくても、FTP やファイルマネージャーからプラグインフォルダをリネームすれば強制停止可能
  • 旧バージョンへのダウングレードや開発元へのフィードバックで再発を防止できる
The Events Calendarでカレンダー表示にならない原因と直し方

The Events Calendarでカレンダー表示にならない原因と直し方

The Events Calendar でカレンダー表示(月表示)を設定しているのに、一覧(リスト表示)しか出てこない原因は、多くの場合「今後のイベントが存在しない」ことによるフォールバック動作だ。今後のイベントが1件もない場合、The Events Calendar は自動的に直近の過去イベントをリスト形式で表示する。そのため、設定を変えてもカレンダーが表示されず、タブ状の一覧だけが現れる。

カレンダー表示にならずリスト表示になるのはなぜか

カレンダー表示にならずリスト表示になるのはなぜか

この現象は、The Events Calendar プラグインが持つ「今後のイベントがない場合のフォールバック機能」により発生する。プラグインの仕様として、直近で開催予定のイベントがない状態で月表示ページにアクセスすると、デフォルトで「直近の過去イベント」がリストビューで表示される。したがって、カレンダーの月グリッドが見えないのは表示設定の不備ではなく、表示する「今後のイベント」がデータベース上に1件も存在しないことが根本原因だ。

管理画面のイベント設定や表示オプションをいくら変更しても、今後のイベントが0件であればリスト表示へのフォールバックが優先され、見た目は変わらない。特に「イベントを作成して公開したはず」と思っていても、日付が過去に設定されていたり、下書きのまま放置されていたケースが多い。

Before(今後のイベントなし)
カレンダー表示を設定しているのに、過去イベントのリストだけがタブ状に表示される
After(今後のイベントあり)
月グリッドのカレンダーが表示され、該当日にイベントへのリンクが現れる
今後のイベント0件の状態  今後のイベント作成後の状態

イベントが存在するのにカレンダーが出ない場合のチェックポイント

イベントが存在するのにカレンダーが出ない場合のチェックポイント

イベントの日付が過去になっていないか確認する

管理画面の「イベント」→「すべてのイベント」から各イベントの開始日時を確認する。日付が過去のものであれば、そのイベントは「今後のイベント」として認識されない。イベント編集画面で開始日を未来の日付に修正し、「更新」をクリックするだけで、カレンダー表示に反映される。

イベントの投稿ステータスが「公開済み」かを調べる

イベントが「下書き」や「非公開」のまま保存されていると、フロントエンドのカレンダーには表示されない。一覧画面でステータス列を確認し、公開済みになっていないイベントがあればステータスを「公開」に変更する。カレンダー表示に使われるのは公開済みのイベントだけだと覚えておく。

カテゴリページの表示設定を確認する

特定のイベントカテゴリページ(例:「学生向けイベント」カテゴリ)でリスト表示になってしまう場合、そのカテゴリに属する今後のイベントが存在しない可能性が高い。イベント編集画面で該当カテゴリを割り当てた未来イベントを最低1件作成する。カテゴリページの URL を直接確認し、月表示のクエリ文字列がついているかもあわせてチェックする。

テンプレートの上書きやテーマの干渉を調べる

The Events Calendar の表示テンプレートを子テーマやカスタムテーマで上書きしている場合、意図しないテンプレートファイルが読み込まれて月表示が無効化されることがある。特に `tribe/events/v2/month/` 配下のテンプレートファイルを触っていないか、`/wp-content/themes/使用テーマ/tribe-events/` ディレクトリの有無を FTP やファイルマネージャーで確認する。

根本原因かどうかを1分で見極めるテスト手順

根本原因かどうかを1分で見極めるテスト手順
STEP 1 イベントを1件新規作成し、開始日を確実に明日以降にする
STEP 2 ステータスを「公開済み」にして保存する
STEP 3 フロントエンドで該当のイベントページを開き、月表示に切り替わるか確認する
STEP 4 月グリッドが表示されたら「今後のイベントがなかった」ことが原因と確定する

この4ステップのテストでカレンダーが正常に表示されれば、根本原因は「表示すべき未来イベントの不在」だと特定できる。もしこれでも改善しない場合、プラグインの競合やテーマの上書きを疑い、別のトラブルシューティングに進む。

今後のイベントが0件でもカレンダーグリッドを強制的に表示させる方法

今後のイベントが0件でもカレンダーグリッドを強制的に表示させる方法

どうしても空のカレンダーグリッドを表示させたい場合は、`functions.php` にフィルターフックを追加するか、The Events Calendar のアドオン「The Events Calendar Pro」で追加されるカスタマイズオプションを利用する。無料版のまま対処するなら、`tribe_events_views_v2_use_period_for_request` フィルターを使ってフォールバックの挙動を変更できる場合があるが、これは将来のアップデートで動作が変わる可能性もある。

直近の過去イベントではなく「今後のイベントはありません」といったメッセージとともに空のカレンダーを出す運用がどうしても必要な場合は、子テーマのテンプレートを修正する方法が確実だ。

よくある質問

イベントは10件以上あるのにリスト表示のままなのはなぜか

すべてのイベントが過去日付で作成されている可能性が高い。イベント一覧で「開始日」の列を確認し、未来の日付が1件もない場合は、フォールバック機能によりリスト表示になる。1件でも未来の日付のイベントを公開すれば月表示に切り替わる。

特定カテゴリのページだけリスト表示になるのはなぜか

そのカテゴリに属する今後のイベントが存在していないためだ。カテゴリページでは、当該カテゴリに割り当てられた未来イベントが1件もないと、フォールバックでリスト表示に切り替わる。該当カテゴリを付与した未来イベントを作成すれば直る。

The Events Calendar で「月」表示をデフォルトに設定するにはどうすればよいか

管理画面の「イベント」→「設定」→「表示」タブにある「デフォルトのイベント表示」で「月」を選択する。ただしこの設定は今後のイベントが存在することが前提であり、未来イベントが0件の状態では設定にかかわらずフォールバックが作動する点に注意が必要だ。

メニューからカレンダーページに直接リンクしているのにリストが出るのはなぜか

URL が正しく `/events/month/` を指していても、表示する未来イベントがなければリスト表示のフォールバックが優先される。リンク切れや設定ミスではなく、データの問題だと判断してイベントの日付とステータスを確認するのが先決だ。

カレンダー表示が壊れているのか、フォールバック動作なのかを見分ける方法は

未来の日付で公開済みのテストイベントを1件作成し、フロントエンドで該当ページを再読み込みする。これで月グリッドが表示されればフォールバック動作だと確定できる。表示がまったく変わらない、あるいはレイアウトが崩れる場合はプラグインの競合やテーマの干渉を調べる必要がある。

この記事のポイント

  • 今後のイベントが0件だと The Events Calendar はリスト表示にフォールバックする
  • 未来日付で公開済みのイベントを1件作れば月表示に切り替わる
  • カテゴリページでも同じフォールバック動作が発生する
  • テーマのテンプレート上書きやプラグイン競合は二次的な原因にすぎない
  • 空カレンダーの強制表示には子テーマやフィルターフックでの対応が必要

“`

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サイト全体にアクセスできなくなった時の原因と復旧手順

サイトにも管理画面にもまったくアクセスできなくなった場合、最初に確認すべきはサーバーのファイル構造とWordPressのインストールパスだ。外部からの不正アクセスを受けた後にページが表示されなくなる症状では、改ざんされたプラグインの残骸や、不完全に変更された設定ファイルが読み込みを妨げている可能性が高い。

なぜサイト全体にアクセスできなくなったのか

管理画面も含めてあらゆるページが表示されない状態は、WordPressの根幹となるファイルが破損しているか、サーバーがPHPを正しく処理できなくなっていることを意味する。特に不正アクセスを受けた後であれば、攻撃者が設置した不正なコードがセキュリティプラグインや手動の復旧作業によって一部だけ削除され、不完全な状態で残っている可能性が高い。

Before アクセス不能状態
ブラウザでURLを開くと、真っ白な画面か「このサイトで重大なエラーが発生しました」というメッセージが表示される。
管理画面(/wp-admin)にアクセスしても同じ状態で、WordPressのログイン画面すら表示されない。
After 正常復旧
サイトのフロントエンドが正常に表示され、CSSやJavaScriptも正しく読み込まれる。
管理画面にアクセスするとログイン画面が表示され、ユーザー名とパスワードでログインできる。
アクセス不能状態  正常復旧後

最も厄介なのは、WordPress本体のコアファイルや設定ファイルそのものが破損しているケースだ。テーマやプラグインの不具合であれば、それらを無効化することで少なくとも管理画面にはアクセスできるようになるが、コア破損ではそれすらも不可能になる。

不正アクセスからの復旧作業で起こりやすい副次的な破損

外部から侵入を受けた後、多くのユーザーはパスワード変更やソルトキーの更新、不審なプラグインの削除といった応急処置を行う。しかしこれらの作業中に誤って重要なファイルを削除してしまったり、修正が中途半端な状態で終わってしまったりすることがある。特にソルトキーを手動で更新した場合、wp-config.php内で閉じ引用符が欠落していたり、PHPの定数定義が壊れていたりすると、WordPress全体が読み込めなくなる。

最初に試すべき緊急アクセス手順

最初に試すべき緊急アクセス手順

サイトが完全に応答しなくなった場合、まずはブラウザの問題ではなくサーバー側の問題であることを確認する。シークレットウィンドウで自分のサイトURLを開く、別の端末やネットワークからアクセスしてみる、example.com/readme.htmlのような静的なHTMLファイルが表示されるか試すといった切り分けが有効だ。静的なHTMLすら表示されないなら、DNS設定やサーバー自体の停止を疑う必要がある。

STEP 1 サーバーの管理パネルにログインし、ファイルマネージャーを開く
STEP 2 wp-config.phpを開き、文法ミスがないか確認する
STEP 3 全プラグインフォルダを一時的にリネームし、強制無効化する
STEP 4 WordPressのコアファイルを手動で再アップロードする

上記の手順で管理画面に到達できるようになれば、あとは管理画面からプラグインを1つずつ有効化して原因を特定し、テーマを正式に切り替えればよい。

wp-config.php の破損を確認する

ソルトキーを変更した直後にアクセス不能になったなら、wp-config.phpが最も疑わしい。このファイルはWordPressのルートディレクトリにあり、データベース接続情報や認証用のユニークキーを定義している。編集時にシングルクォートが1つ抜けている、余分な文字が混入している、PHPの開始タグ<?phpが欠落しているといった単純なミスで、サイト全体が真っ白になる。

サーバーのファイルマネージャーやFTPクライアントでwp-config.phpをダウンロードし、バックアップを取った上で内容を確認する。特にソルトキーを定義しているセクション(AUTH_KEYLOGGED_IN_KEYなどが並ぶ部分)に注目し、各行がdefine('キー名', '値');の形式を正しく守っているか、閉じ括弧とセミコロンが揃っているかを1行ずつ検証する。不安があれば、WordPressの公式ソルトキー生成ページから新しいキーセットをコピーし、該当セクションを丸ごと置き換えるのが安全だ。

プラグインを強制的に全無効化する

管理画面にさえアクセスできない状態では、データベースを直接操作するか、FTPでプラグインフォルダの名前を変更することでプラグインを無効化する。手順はシンプルで、/wp-content/plugins/ディレクトリに移動し、その中にある全プラグインのフォルダ名の先頭に「_」や「disabled_」を付け加えるだけだ。例えばwordfence_wordfenceにリネームすれば、WordPressはそのプラグインを認識しなくなる。

この方法の利点は、プラグイン本体のファイルを削除せずに済むため、原因特定後にすぐ元の名前に戻して復元できることだ。大量のプラグインを1つずつリネームするのが面倒な場合は、pluginsフォルダ自体をplugins_backupにリネームし、空のpluginsフォルダを新規作成すると一括で無効化できる。

WordPress コアファイルを手動で上書きする

wp-config.phpに問題がなく、プラグインをすべて無効化しても症状が改善しない場合、WordPress本体のプログラムファイルが改ざんまたは破損している。攻撃者がwp-adminwp-includesディレクトリに仕込んだバックドアが、不完全に削除されたまま残っているケースも多い。

対処法は、WordPress公式サイトから最新版の ZIP ファイルをダウンロードし、展開した中身をFTP経由でサーバーにアップロードすることだ。このとき絶対に上書きしてはいけないファイルが2つある。wp-config.php(サイト固有の設定)と/wp-content/ディレクトリ(テーマ・プラグイン・アップロードメディア)だ。これらを除くすべてのファイルとフォルダを上書きアップロードすることで、コアファイルだけがクリーンな状態にリセットされる。

サーバー側のエラーログを確認する方法

サーバー側のエラーログを確認する方法

ここまでの手順で復旧しない場合は、具体的なエラー内容を把握する必要がある。ブラウザには「重大なエラーが発生しました」としか表示されないが、サーバーには詳細なエラーログが記録されている。レンタルサーバーの管理パネル(cPanelやカスタムコントロールパネル)で「エラーログ」や「error_log」という項目を探し、直近のエントリを確認する。

ログの場所 1 サーバー管理パネルの「エラーログ」メニュー
ログの場所 2 WordPressルートディレクトリ内のerror_logファイル
ログの場所 3 /wp-content/debug.log(WP_DEBUG有効時)

エラーログには「PHP Fatal error」や「Allowed memory size exhausted」といった具体的な原因が記録されている。特に不正アクセス後によく見られるのが、改ざんされたファイルから呼び出された存在しない関数によるエラーや、不完全に削除されたコードの残骸による構文エラーだ。ログの内容を手がかりに、問題のファイルを特定して修正するか、該当プラグインを完全に削除する。

WP_DEBUG を一時的に有効化して詳細を表示する

サーバーのエラーログが見つからない場合は、WordPressのデバッグモードを有効にしてエラーを画面に直接表示させる。これはwp-config.phpに以下の定数を追加または変更することで実現できる。

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

WP_DEBUGtrueにするとWordPressがエラーを表示するようになり、WP_DEBUG_LOG/wp-content/debug.logにエラーが記録される。WP_DEBUG_DISPLAYtrueにすると、ブラウザ上にもエラーメッセージが直接表示される。なお、作業が終わったらこれらの定数をfalseに戻すか削除すること。本番サイトでデバッグ表示を有効にしたままにすると、訪問者にもエラー内容が見えてしまいセキュリティリスクになる。

.htaccess ファイルの破損を疑う

不正アクセスの痕跡として、.htaccessファイルが改ざんされているケースも多い。このファイルはWebサーバー(Apache)の挙動を制御しており、ここに不正なリダイレクトルールやアクセス制限が書き込まれていると、サイト全体にアクセスできなくなる。

WordPressルートディレクトリの.htaccessをダウンロードしてバックアップを取り、一度ファイル名を.htaccess_backupに変更して無効化する。その後、WordPress管理画面の「設定」→「パーマリンク設定」で「変更を保存」をクリックすれば、クリーンな.htaccessが自動生成される。ただし管理画面にアクセスできない現状では、以下の内容で新規に.htaccessを作成してもよい。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

これでサイトが表示されるようになれば、原因は.htaccessの改ざんだったと特定できる。旧ファイルは内容を精査し、不審な行(知らないドメインへのリダイレクトや、怪しいIPアドレスからのアクセス許可ルールなど)がないか確認してから削除する。

バックアップからの復元がうまくいかない場合の対処

バックアップからの復元がうまくいかない場合の対処

サーバー会社のサポートからバックアップ復元を提案されたが失敗したという状況は、バックアップデータ自体が破損しているか、復元先の環境に不整合があることを示している。特に多いのが、バックアップを上書き復元した後にデータベースの接続情報が古いままになっているケースだ。

バックアップ復元後にサイトが表示されない場合、まずwp-config.php内のデータベース名・ユーザー名・パスワード・ホスト名が、現在のサーバー環境と一致しているか確認する。バックアップが別のサーバーや別のデータベースインスタンスの情報を持ったまま復元されると、WordPressはデータベースに接続できず「データベース接続確立エラー」を返す。

もうひとつの可能性は、バックアップに不正アクセス後の改ざんファイルが含まれていたケースだ。攻撃を受けた後の状態をバックアップしてしまい、それを復元しても問題が再発するだけという悪循環に陥っている。この場合、バックアップからwp-content/uploads/(メディアファイル)とデータベースのダンプファイルだけを取り出し、WordPressのコアファイルとプラグインは公式のクリーンなファイルで置き換える方法が有効だ。

よくある質問

FTPの接続情報がわからない場合はどうすればよいか

多くのレンタルサーバーでは、契約時に送られてくる「サーバーアカウント情報」メールにFTPのホスト名・ユーザー名・パスワードが記載されている。見つからない場合はサーバーの管理パネルにログインし、「FTPアカウント」や「ファイルマネージャー」の項目から確認できる。管理パネル自体にログインできない場合は、サーバー会社のサポートに連絡してFTP情報を再発行してもらう必要がある。

「このサイトで重大なエラーが発生しました」のメールが届いたが確認できない

WordPress 5.2以降では、サイトに致命的なエラーが発生すると管理者メールアドレスに自動通知が届く。このメールには「リカバリーモード」へのリンクが含まれており、クリックするとプラグインを無効化した状態で管理画面にログインできる。メールが届いていない場合は、サーバーのPHPバージョンが古くてメール送信機能が動作していない、または管理者メールアドレスが間違って設定されている可能性がある。

不正アクセスを受けた後、どのプラグインを疑うべきか

攻撃者は多くの場合、更新が長期間止まっている脆弱なプラグインや、公式リポジトリ以外から入手したnulledプラグイン(正規ライセンスを回避した改変版)を経由して侵入する。/wp-content/plugins/内で更新日時が不自然に新しいファイル、プラグイン名とは無関係なファイル名(config.bakabout.phpなど)が紛れ込んでいないか確認する。また、長期間更新されていないプラグインは、たとえ攻撃の経路でなかったとしても今後のリスクになるため、代替プラグインへの移行を検討すべきだ。

すべて試しても復旧しない場合の最終手段は

サーバー上の全ファイルをローカルにバックアップし、データベースをエクスポートした上で、WordPressを新規インストールする。その後、エクスポートしたデータベースのうちwp_posts(投稿・固定ページ)とwp_postmeta(カスタムフィールド)、wp_options(サイト設定)のテーブルだけをインポートし直す。この方法ではテーマやプラグインの設定の一部が失われる可能性があるが、コンテンツを救出できる可能性が最も高い。作業前には必ず現状の完全バックアップを取っておくことが大前提だ。

この記事のポイント

  • 管理画面もサイトも表示されない場合、まずは静的なHTMLファイルが表示されるか確認し、問題の切り分けを行う
  • wt-config.phpの文法ミスやプラグインの強制無効化、.htaccessのリセットで多くのケースが解決する
  • 不正アクセス後はコアファイルが改ざんされている可能性があるため、wp-content以外をクリーンなファイルで上書きする
  • バックアップ復元に失敗したら、データベース接続情報の不一致やバックアップ自体の破損を疑う
  • エラーログやWP_DEBUGで具体的なエラー内容を特定し、根本原因に対処するのが最も確実な復旧手順である