タグアーカイブ WordPress

Astraのフッターで特定のウィジェットロゴだけ表示されない時の直し方

Astraのフッターで特定のウィジェットロゴだけ表示されない時の直し方

Astra のフッターウィジェットエリアで、まったく同じ手順で設定したはずのロゴ画像が、ある特定の位置だけ表示されない。この現象はウィジェット個別の「デザイン」設定にある可視性トグルがオフになっているのが原因だ。

なぜ特定のウィジェットだけ表示されないのか

なぜ特定のウィジェットだけ表示されないのか

Astra のウィジェットには、共通の外観設定とは別に、各ウィジェット単体で表示を制御する「可視性(Visibility)」というオプションが存在する。この設定は Astra の「デザイン」タブ内にあり、デスクトップ・タブレット・モバイルのデバイスごとにオンオフを切り替えられる。今回のように「画像ファイル自体は正常で、配置場所を入れ替えても問題のウィジェット枠だけが出ない」という症状は、この可視性トグルが何らかの操作ミスやインポート時のずれでオフになっている典型的なケースだ。

WordPress の標準ウィジェット画面と Astra の独自設定が組み合わさっているため、単にウィジェットの中身を見るだけでは原因に気づきにくい。問題のウィジェットを開き、外観の設定ではなく Astra が拡張した「デザイン」パネルの中まで確認する必要がある。

STEP 1 「外観」→「ウィジェット」から該当のフッターエリアを開く
STEP 2 表示されないウィジェットをクリックして展開する
STEP 3 「デザイン」タブを選択し「可視性」セクションを探す
STEP 4 デスクトップ・タブレット・モバイルのトグルをすべてオンにする

上の手順図は Astra のウィジェット設定から可視性を修正する流れを示している。管理画面左メニューの「外観」から「ウィジェット」画面へ進み、問題のフッターエリアにある該当ウィジェットを開いて Astra の「デザイン」タブ内を確認する。

表示されないウィジェットを特定し設定を修正する手順

表示されないウィジェットを特定し設定を修正する手順

可視性トグルの確認と修正

ウィジェット編集画面を開いたら、まず Astra が追加する「デザイン」タブをクリックする。ここには「可視性」という項目があり、「デスクトップで表示」「タブレットで表示」「モバイルで表示」の3つのスイッチが並んでいる。いずれかひとつでもオフになっていれば、対応するデバイスでそのウィジェットは非表示になる。すべてのデバイスでオフになっていると、当然どの端末からも見えなくなる。

このトグルは、ウィジェットを複製したりテーマの設定をインポートした際に、意図せずオフの状態で保存されることがある。特に3カラム構成で同じロゴ画像を並べている場合、1つだけ設定がずれていても他と同じに見えるため、中身を確認しただけで「設定は同じだ」と思い込んでしまう。必ずデザインタブの可視性まで目を通す必要がある。

修正後にキャッシュをクリアして確認する

可視性トグルをオンにしてウィジェットを保存したら、必ずサイトのキャッシュを削除してからフロントエンドを確認する。キャッシュ系プラグインを使っている場合はそのプラグインのキャッシュ削除機能を実行し、ブラウザのキャッシュも念のためクリアしておくと確実だ。修正が即時反映されないケースの多くはキャッシュが残っているだけなので、焦らずキャッシュクリアを行ってから再度表示をチェックする。

似た症状だが可視性設定以外が原因のケース

似た症状だが可視性設定以外が原因のケース

z-index が競合している

Astra のフッター内で特定の要素だけが見えない場合、z-index の重なり順が原因になっていることがある。特に上に重なる背景要素や疑似要素(::before / ::after)があると、実際には出力されているのに視覚的に隠れてしまう。ブラウザの検証ツールで該当エリアを右クリックして「検証」を開き、要素が DOM 上に存在するかどうかを最初に確認する。要素自体があるのに見えないなら CSS の z-index や opacity、visibility プロパティを疑う。

プラグインやキャッシュの影響

最適化プラグインが CSS や JavaScript を結合・圧縮する過程で、Astra の可視性制御に関わるスタイルが誤って上書きされることがある。また、CDN を経由している場合はエッジサーバーに古いキャッシュが残っている可能性も考慮する。まずは最適化プラグインを一時停止して表示が直るか切り分け、問題が再現しなければ圧縮除外リストに Astra 関連の CSS を追加するといった対応をとる。

子テーマやカスタムコードの干渉

子テーマの functions.php にウィジェットの表示条件を操作するフィルターフック(widget_display_callback など)が記述されていると、Astra の可視性設定と競合することがある。また、独自に追加した CSS で特定のウィジェット ID に対して display: none を指定してしまっていないかも確認する。こうした干渉は、標準テーマに一時的に切り替えることでは Astra 側の問題と区別できないため、子テーマのコードを直接精査する必要がある。

よくある質問

Astra の可視性設定は Elementor で作ったフッターにも影響するのか

Elementor でフッターを構築している場合、Astra のウィジェット可視性設定は直接影響しない。ただし、Elementor で作成したフッターと Astra の標準フッターが混在している環境では、Astra の設定が効くエリアと効かないエリアが発生する。テーマのフッター管理画面で、実際にどちらのフッターが表示される設定になっているかを先に確認する。

可視性トグルをオンにしたのにまだ表示されない

可視性設定以外に、ウィジェット自体の「コンテンツ」が空になっていないか確認する。画像ウィジェットの場合、画像URLが欠落していると何事もなかったかのように空のHTMLが出力される。また、フッターウィジェットエリア全体が Astra のカスタマイザーで非表示に設定されていないかも再確認する。カスタマイザーの「フッター」→「フッターウィジェット」セクションでエリア自体の表示設定を変更できるためだ。

特定のデバイスだけで消えるのは可視性設定だけが原因か

可視性設定以外にも、CSS のメディアクエリで特定の画面幅に display: none が指定されているケースがある。Astra の追加 CSS や子テーマに誤ったメディアクエリが残っていないか、ブラウザの検証ツールでデバイスモードを切り替えながら該当要素の CSS を確認する。可視性トグルがすべてオンでも、別の CSS で上書きされていると表示されない。

この記事のポイント

  • Astra の特定ウィジェットだけ非表示になる主因は「デザイン」タブの可視性トグル
  • 修正はウィジェット編集画面のデザインタブからすべてのデバイストグルをオンにするだけ
  • キャッシュクリア後にフロントエンドで反映を確認する
  • z-index やプラグイン競合でも似た症状が出るため、DOM 上の存在確認が切り分けの第一歩
WordPressプラグインがAI検索で推奨される方法と獲得施策

WordPressプラグインがAI検索で推奨される方法と獲得施策

WordPressプラグインの購入検討者が、検索結果ページをスキップしてChatGPTやGeminiに直接「おすすめのバックアッププラグインは?」と質問する流れが広がっている。GoogleのAI Overviewも同様に、青いリンクをクリックせずに答えだけを見る行動が増えた。AI検索で自社製品が名前を挙げられなければ、その製品は存在しないに等しい。

この変化に対して「ブラックボックスを攻略するハック」は必要ない。WP Mayorの記事が紹介するAhrefsの最新調査からは、AIがツール推薦の情報源としている実態が明らかになった。Webサイト、ベストリスト記事、YouTubeが重要な役割を担っている。

本記事では、この調査データを紐解き、WordPressプラグインやテーマを提供する企業がAI推奨を獲得するための具体的な施策を解説する。

AI検索がプラグイン発見の重心を変えた

AI検索がプラグイン発見の重心を変えた
従来のプラグイン発見フロー(Before)
ユーザー Google検索 検索結果ページ 複数サイトを見て比較 プラグイン決定
検索エンジンのランキング上位表示が集客の主戦場だった
AI検索時代のプラグイン発見フロー(After)
ユーザー ChatGPTなどに質問 AIが推奨プラグイン名を提示 リンクを辿らずにAIの回答で判断
AIに名前を挙げてもらえるかどうかが勝負

このデモは、従来の検索行動とAI検索の違いを概念的に示したものだ。青字の「ユーザー」部分は共通だが、情報収集のプロセスが大きく変わっている。

自社サイトの情報がAIの信頼基盤になる

AI検索が台頭しても、自社のWebサイトが「情報の原本」として扱われる点は変わらない。Googleが示すAI向けの最適化ガイドでも、クローラビリティの確保、実用的なコンテンツの作成、技術的な構造の整理、信頼性の証明をページ上部に配置することなど、基本中の基本が重視されている。

つまり、通常の検索ランキングで結果を出すための施策と、AIに引用されるための施策は地続きだ。派手な隠しスキーマや「アルゴリズムの裏をかく」手法は必要ない。ホームページや機能紹介ページで何をするプラグインか、誰の役に立つか、実績や証拠を明確に表現するだけで、AIは正確な情報を拾い上げる。

AIは「ベストリスト」記事から推薦を引き出す

Ahrefsの調査によれば、ChatGPTが回答のソースとして参照した26,283件のURLのうち、実に43.8%が「ベスト◯◯」形式のリスト記事だった。ベストバックアッププラグインやベストメンバーシッププラグインといった比較記事が、AIの推薦エンジンを支える主要な情報源になっている。

ベストバックアッププラグイン記事 AIモデルが学習 ChatGPTが「おすすめはプラグインA」と回答
Ahrefsの調査では、ChatGPTが参照したURLの43.8%がこの種のリスト記事だった。

この流れを考えれば、集客の目標設定も変わる。従来は「リスト記事で上位表示させてクリック流入を狙う」だったが、これからは「そのリストに掲載されることでAIの回答に名前が載る」ことこそがゴールになる。Ahrefsの分析によると、AI Overviewが表示される場合、最上位にランクしているページでもクリック率が約58%低下するという。AIが回答を先に出してしまうため、クリックを待つよりも推薦の中に自社プラグインが含まれている状態を目指すべきだ。

YouTubeがAIの隠れた情報源になっている理由

YouTubeがAIの隠れた情報源になっている理由

もうひとつ注目すべき発見が、YouTubeの言及とAI可視性の高い相関だ。Ahrefsが75,000のブランドを調べたところ、ChatGPTやAI Overviewでの可視性とYouTubeでの言及回数との相関係数は約0.737に達した。これは調査されたすべてのシグナルの中で最も強い数字だった。

相関と因果は別物だが、「動画コンテンツがAIに読まれている」というメカニズムは十分に説得力がある。YouTubeはAIにとって巨大な書き起こしデータベースだ。チュートリアルやデモ、レビュー動画、ポッドキャスト形式の対談、これらはすべて自動でテキスト化され、AIモデルが学習可能な情報になる。

YouTube動画
「メンバーシッププラグイン導入方法」のチュートリアル動画
書き起こしテキスト
音声が自動でテキスト化され、AIが解析可能に
AIモデルの知識ベース
「プラグインAはメンバーシップ機能に強い」といった情報を獲得
※相関係数0.737は、YouTubeでの言及が多いブランドほどAI検索で可視化されやすい傾向を示している(Ahrefs調べ)。

派手な編集や高額な機材は必要ない。自社のプラグインが何を解決するのか、どんなユーザーに向いているのか、実際の設定手順はどうなのかを淡々と説明する動画で十分だ。顧客インタビューや比較検討のガイドも有効に働く。

AI推奨を獲得するための実践アクション

AI推奨を獲得するための実践アクション

ここまでの調査が示す方向性は極めて実直だ。短期的なハックではなく、情報資産を地道に積み上げる活動がAI検索時代の競争を決める。具体的に取り組むべき施策を整理した。

  • コアページの品質を徹底する。ホームページや機能紹介ページで、何をするプラグインか、誰の役に立つか、実績や証拠を明確に記載する。AIはこれらのページを引用して製品を説明する。
  • 関連する「ベスト◯◯」比較記事に掲載される。ターゲット読者が読む比較記事を特定し、自社製品を掲載してもらうよう働きかける。これがAI推奨への最も直接的なルートになる。
  • YouTubeの情報資産を築く。派手な映像は不要。プラグインの機能や設定方法、選び方のガイド、顧客インタビューなど、実用的で正確な動画を数本でも公開する。動画のテキスト情報がAIに学習される。
  • 第三者による信頼性の高い言及を増やす。レビュー、ケーススタディ、ポッドキャストでの紹介など、複数の信頼できる情報源が自社製品を正確に説明すればするほど、AIは自信を持って推薦できるようになる。

いずれも派手さはないが、それこそが要点だ。AI検索で勝つ企業は、インターネット上に「十分な証拠」を積み上げてきた企業にほかならない。役に立つプロダクトを届け、それを明確に説明し、第三者が語るのを助ける。その積み重ねが、AI時代の信頼残高になる。

この記事のポイント

  • ChatGPTなどのAI検索では、従来の検索エンジンランキングとは異なる推薦メカニズムが働く。AIは「ベストリスト記事」と「YouTubeのテキスト情報」を主な情報源としている
  • 自社Webサイトの基本情報(機能説明、実績、事例)がAIの信頼基盤になるため、検索エンジン最適化の基本を外さないことが重要
  • 自社製品が「ベストプラグイン」系の記事に掲載されることで、AI回答の候補に入る確率が格段に高まる
  • YouTube動画の制作は、凝った編集よりも「役に立つ内容」を優先し、テキスト情報としてAIに読み取られることを意識する
  • AI推奨の獲得は短期的なハックでは不可能で、正確な情報と実績をインターネット上に積み重ねる地道な活動が不可欠
WooCommerce PayPal決済が断続的に失敗する原因と直し方

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

よくある質問

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

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

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

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

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

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

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

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

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

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

この記事のポイント

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

sudo systemctl restart php8.3-fpm

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

よくある質問

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

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

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

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

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

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

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

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

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

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

この記事のポイント

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

W3 Total Cache 2.10.0 更新後に動的コンテンツが表示されない時の直し方

W3 Total Cache 2.10.0 へのアップデート後、動的コンテンツが表示されず「W3TC dynamic mfunc tag refused: missing call:slug + hmac envelope.」と表示される場合、根本原因はバージョン 2.10.0 で導入された HMAC 署名検証の仕様変更である。プラグインを 2.9.x 系に戻すか、動的ブロックの呼び出しコードに正しい slug 属性と HMAC 署名を付与すれば直る。

どんな症状が発生しているのか

どんな症状が発生しているのか

W3 Total Cache(以下 W3TC)のページキャッシュを有効にしたサイトを更新したあと、AdRotate Pro など mfunc タグを使って動的コンテンツを部分キャッシュしていた箇所が、エラーメッセージに置き換わる。日本語環境では英文のまま「W3TC dynamic mfunc tag refused: missing call:slug + hmac envelope.」という文言が表示されるケースが多い。この文言は「mfunc 呼び出しが拒否された。slug と HMAC エンベロープが不足している」という意味だ。

対象になるのは、W3TC のページキャッシュ機能と「後期キャッシング(Late Caching)」や「動的 mfunc ブロック」を組み合わせて使っていたサイトである。具体的には、固定ページ全体をキャッシュしつつ、広告ブロックやログイン状態表示などの一部だけを非キャッシュで差し込んでいた構成だ。更新前は問題なく動いていたのに、2.10.0 にした途端に該当箇所だけエラー文言に化ける。

なぜ W3TC 2.10.0 でエラーが起きるのか

なぜ W3TC 2.10.0 でエラーが起きるのか

W3TC 2.10.0 では、動的 mfunc タグのセキュリティ強化として HMAC(ハッシュベースのメッセージ認証コード)による署名検証が必須になった。これは不正な動的コードの注入を防ぐための仕組みだが、従来の呼び出しコードには slug 属性と HMAC 署名が含まれていなかったため、検証に失敗し、一律で拒否されるようになった。

W3TC の動的 mfunc ブロックは、PHP 関数をページキャッシュ内に埋め込んでおき、キャッシュから配信される直前に実行する仕組みだ。これまでは単純なコールバック名だけで動作していたが、2.10.0 からは「どのスラッグから呼び出されたか」と「正当な呼び出し元であることを証明する HMAC 署名」のセットがなければ mfunc タグが無効化される。

この仕様変更は W3TC 本体のセキュリティアップデートであるため、AdRotate Pro など W3TC 互換モードを持つ他プラグインの側が新しい署名形式に対応していないと、もれなくエラーになる。結果的に、更新後は互換モードで動的コンテンツを提供しているほとんどすべてのサイトで同じ問題が発生している。

W3TC 2.10.0 の動的 mfunc 呼び出し変化
Before
<!– mfunc callback_name –>
slug・HMAC なし → 拒否される
After
<!– mfunc callback_slug –><!– mfunc hmac_signature –><!– /mfunc –>
slug・HMAC 付き → 正常動作
エラー状態(旧形式)  2.10.0 の要求仕様

すぐにサイトを元に戻す応急処置

すぐにサイトを元に戻す応急処置

W3 Total Cache を 2.9.x 系にダウングレードする

最も短時間で確実に直す方法は、W3TC を 2.10.0 より前のバージョンに戻すことだ。ダウングレード手順は以下のとおり。

  1. 管理画面の「プラグイン」から W3 Total Cache を停止する
  2. 「プラグイン」→「プラグインの追加」→「プラグインのアップロード」を使うか、FTP で古いバージョンの ZIP を展開して上書きする
  3. プラグインを再有効化し、すべてのキャッシュを削除する

古いバージョンの ZIP ファイルは WordPress.org のプラグインページにある「以前のバージョン」セクションから入手できる。バージョン 2.9.8 や 2.9.9 であれば HMAC 署名検証が存在しないため、従来どおり動的 mfunc タグが動作する。

ダウングレードしたあとは、W3TC の自動更新を一時的に停止することを推奨する。管理画面の「プラグイン」で個別に自動更新をオフにするか、wp-config.php に define( 'AUTOMATIC_UPDATER_DISABLED', true ); を追加してサイト全体の自動更新を止めておけば、意図しない再アップデートを防げる。

他プラグインの W3TC 互換モードを一時的に無効化する

もし AdRotate Pro など、W3TC 互換モードを個別にオン・オフできるプラグインを使っているなら、当該プラグインの設定で互換モードをオフにする手もある。ただしこの場合、ページキャッシュの影響で広告がローテーションしなくなったり、動的コンテンツが静的になってしまったりする副作用がある。あくまで「エラー表示を消す」ための一時的な回避策と位置づけるのが安全だ。

2.10.0 を使い続ける場合の恒久対応

2.10.0 を使い続ける場合の恒久対応

W3TC 2.10.0 のセキュリティ修正を活かしたまま動的コンテンツを動作させるには、呼び出しコードに正しい slug と HMAC 署名を付与する必要がある。この修正は、動的 mfunc タグを生成している側(多くの場合は広告管理プラグインや自作のテーマ関数)に手を入れることになる。

W3TC の HMAC 署名の仕組みを理解する

mfunc タグはページキャッシュの HTML 内に PHP コード片を残し、キャッシュ配信時に W3TC がそれを検出して実行する。2.10.0 ではこのとき、呼び出しパラメータとして「call:slug」と「hmac」の両方がエンベロープに含まれていなければならない。slug は処理を一意に識別する任意の文字列、hmac は W3TC 内部で生成される署名ハッシュだ。

生成ルールは公開されているが、実際には W3TC が提供する API 関数を使って動的ブロックを登録するのが現実的だ。自作テーマであれば w3tc_fragmentcache_register フィルターを使い、コールバックと slug を W3TC に登録すれば、あとは W3TC 側が自動で HMAC 署名を計算してくれる。

AdRotate Pro での対応状況を確認する

AdRotate Pro は W3TC 互換モードを有効にしている場合、内部的に mfunc タグを生成している。今回のエラーは、AdRotate Pro が生成する mfunc タグが 2.10.0 の新形式に対応していないために発生している。AdRotate Pro の開発元がこの問題に対応したアップデートをリリースするまでは、互換モードの使用が難しい。

AdRotate Pro の管理画面にある「W3 Total Caching compatibility」設定をオフにし、代わりに JavaScript による非同期広告読み込み(AdRotate のダイナミックモード)を使うか、広告ブロックを iframe で埋め込む形に切り替えると、ページキャッシュ機構に依存せず動的広告を配信できる。

自作テーマで動的ブロックを登録し直す

テーマの functions.php などで自作の動的コンテンツを mfunc タグで埋め込んでいた場合は、W3TC のフラグメントキャッシュ API を使った正式な登録に切り替える。基本的な流れは次のとおりだ。

  1. w3tc_fragmentcache_register フィルターで、slug とコールバック関数のペアを W3TC に登録する
  2. テンプレート内では w3tc_fragmentcache_output 関数を使い、slug を指定して動的出力を行う
  3. W3TC が自動で HMAC 署名を計算し、mfunc タグとしてページキャッシュに埋め込む

この方法なら、W3TC のバージョンが上がっても署名方式の変更に W3TC 本体側が追随するため、サイト側のコードを再度修正する必要がなくなる。フラグメントキャッシュ API の具体的な記述例は W3TC の公式ドキュメントに掲載されている。

Late Caching 設定の確認と調整

W3TC の pgcache.late_caching 設定(後期キャッシング)が有効かどうかも、動作に影響を与える要素のひとつだ。この設定が true の場合、ページ生成の最終段階で mfunc タグを処理するため、プラグイン間の競合が減る傾向がある。すでに true でもエラーが出ている場合は今回の本質的な原因ではないが、念のため設定値を確認しておく。

wp-content 内の w3tc-config/master.php を直接確認するか、管理画面の「パフォーマンス」→「一般設定」からエクスポートした設定ファイルで pgcache.late_caching の値を確認できる。false であれば true に変更し、キャッシュを全削除してから表示を再確認する。

再発を防ぐための注意点

再発を防ぐための注意点

W3TC のような深くサイト機構に組み込まれるプラグインをメジャーバージョンアップする前には、必ずステージング環境で検証する習慣をつける。とくに mfunc やフラグメントキャッシュといった、通常のキャッシュとは異なる高度な機能を使っている場合は、本番適用前に動的コンテンツの全パターンをテストする必要がある。

また、W3TC の設定をエクスポートしてバックアップしておけば、問題が起きたときに設定ごと以前のバージョンに戻せる。管理画面「パフォーマンス」→「一般設定」の下部にある「設定のダウンロード」ボタンで、JSON 形式の設定ファイルを定期的に保存しておくとよい。

更新前の準備と検証フロー
STEP 1 W3TC 設定を JSON でダウンロードしてバックアップ
STEP 2 ステージング環境で W3TC を更新し動作確認
STEP 3 動的コンテンツ全種をテストし問題なければ本番に適用
STEP 4 本番反映後すぐにキャッシュ全削除して再チェック

よくある質問

「W3TC dynamic mfunc tag refused」はサイト全体が真っ白になるのか

サイト全体が真っ白になるわけではない。ページの大部分は正常にキャッシュ配信されるが、mfunc タグで差し込まれていた動的コンテンツの部分だけがエラー文言に置き換わる。レイアウトが崩れることはあるが、PHP 致命的エラーによる白画面とは異なる。

キャッシュを削除しても直らないのはなぜか

キャッシュ削除はあくまで「現在保存されているキャッシュファイルを消す」行為であり、mfunc タグの生成コード自体を修正するものではない。新しいキャッシュが生成されるときに、同じく新形式に対応していない mfunc タグが再度埋め込まれるため、キャッシュ削除だけでは根本解決にならない。

W3TC 無料版でも同じ問題は起きるのか

起きる。HMAC 署名検証は W3TC のコア機能の一部として Pro 版・無料版の両方に実装されている。フラグメントキャッシュや mfunc タグを使っているサイトは、Pro 版かどうかに関係なく影響を受ける。

このエラーを放置してもサイトには大きな問題はないか

動的コンテンツが表示されないという機能面の問題に加え、エラー文言が来訪者にそのまま見える状態はサイトの信頼性を損なう。また広告が表示されなければ収益にも直結するため、実質的には早期解決が必要な重大トラブルに分類される。

他に W3TC 2.10.0 で影響を受けるプラグインはあるか

AdRotate Pro 以外にも、W3TC 互換モードで動的コンテンツを埋め込む仕組みを持つプラグイン全般が影響を受ける可能性がある。具体的には、動的ウィジェットやパーソナライズ表示を行うキャッシュ対応プラグインが該当する。該当プラグインの更新情報を注視し、開発元が W3TC 2.10.0 対応を表明するまではアップデートを保留するのが安全だ。

この記事のポイント

  • W3TC 2.10.0 の HMAC 署名検証強化で mfunc タグが拒否される
  • ダウングレードで即時解決するがセキュリティ面は旧版に戻る
  • 互換プラグイン側の対応アップデートを待つか公式 API で再実装する
  • キャッシュ削除だけでは再発するため mfunc コード自体の修正が必要
  • メジャーアップデート前のステージング検証と設定バックアップが再発防止の鍵
WooCommerce納品書印刷で致命的エラーが出た時の直し方

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

❌ Before

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

✅ After

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

エラー状態  修正後

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

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

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

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

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

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

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

よくある質問

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

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

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

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

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

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

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

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

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

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

この記事のポイント

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

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

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

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

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

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

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

Save for Later(あとで買う)

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

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

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

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

Wishlists(ほしいものリスト)

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

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

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

技術的基盤

技術的基盤

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

共有 Store API エンドポイント

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

/wc/store/v1/shopper-lists/

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

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

Interactivity API との統合

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

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

機能の有効化手順

機能の有効化手順

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

有効化に必要な条件

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

設定手順

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

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

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

テストすべきポイント

テストすべきポイント

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

Save for Later のテスト項目

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

Wishlists のテスト項目

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

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

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

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

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

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

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

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

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

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

この記事のポイント

  • WooCommerce 10.9 が Shopper Lists 機能を実験的に導入した
  • 「Save for Later」はカートブロックに商品を一時保存する機能
  • 「Wishlists」は Add to Cart with Options ブロックと連携するほしいものリスト
  • 両機能はデフォルト無効で、管理画面の「高度な設定 > 機能」から有効化する
  • 本番環境ではなくステージング環境でのテストが強く推奨されている
WordPressを構築する人材は誰なのか、市場縮小の実態

WordPressを構築する人材は誰なのか、市場縮小の実態

数字が物語る市場の縮図

数字が物語る市場の縮図

まずは客観的な立場から現状を整理する。データはシェアの緩やかな縮小を示しているが、これは崩壊ではなく「選択されなくなる」局面への移行を意味する。

全ウェブサイトに占めるWordPressのシェアは、2024年の約43.6%をピークに、2026年6月時点で41.5%まで低下した。CMS市場に限っても、ピークの61.7%から59.3%へとダウンしている。だが、この数値を額面通り受け取るのは早計だ。絶対数ベースで見ればWordPressサイトの総数は依然として増加しており、シェア低下の主因は、ウェブ全体の成長スピードにWordPressの新規サイト獲得が追いついていない点にある。

つまり、既存ユーザーが脱出しているわけではない。リスクは「新しくサイトを作る人がどこから始めるか」という新規獲得市場に潜んでいる。WP Mayorの記事はこれを「維持率は堅いが、新規参入の指標が危険信号を灯している」と総括する。この見立ては、プラットフォームの将来を占う上で極めて重要だ。

シェア低下の構造的要因

シェア低下はWordPressの魅力が失われたというより、ウェブの主戦場とプレイヤーが多様化した結果だ。かつてはサイト構築のデファクトだったWordPressも、今やShopifyやSquarespaceといったホステッドプラットフォーム、SubstackやLinktreeのような単機能サービスと住み分ける局面に入った。WixとShopifyだけで、WordPressが失ったシェアとほぼ同規模の成長を示している。

これはWordPressの「万能性」が、一部の層にとっては「複雑性」として映り始めている証左でもある。ウェブ制作の民主化は確かに進んだが、その民主化を担うツールの主役が交代しつつあるのだ。

変わりゆく作り手の肖像

変わりゆく作り手の肖像

WordPressを支えるコア人材の年齢層は、確実に上がっている。この構造変化は、エコシステムの将来における最大の不安要素の一つだ。

2003年の誕生から20年以上が経過し、黎明期を支えた開発者やエージェンシー経営者の多くは40代から50代に差し掛かっている。WP Mayorの記事が参照する2023年の公式調査では、回答者の約半数が40歳以上であり、30歳未満は23%に過ぎなかった。この調査は英語圏のコアコミュニティに偏っているという限界はあるが、プロフェッショナル層の高齢化を如実に示している。

より広範な開発者コミュニティに目を向けても傾向は同じだ。Stack Overflowの調査では、35歳以上の開発者の割合が2019年の約4分の1から2025年には47%にまで上昇している。PHP自体の新規学習者も少なく、若年層の関心はJavaScriptやノーコードツール、あるいはWebflowやFramerといった直感的なサイトビルダーに流れている。

新興市場という希望と現実

反論として、インドやブラジル、インドネシアといった新興国での成長を挙げる声は根強い。実際、これらの地域の若年層がWordPressの新たな利用者層を形成している可能性は高い。WP Mayorの記事も「世界全体で見れば、新規ユーザーの中心年齢はむしろ若いかもしれない」と指摘する。

だが、問題はその層が「エコシステムの構築者」、すなわちプラグインを開発し、コミュニティを牽引し、WordPressの未来を形作る人材なのか、という点にある。現状、西側諸国を中心とした従来の強力なコントリビューター層の高齢化と、新たな才能の流入不足は、イノベーションの停滞に直結する構造的な弱点だ。

「WordPressを構築する方法」の終焉

「WordPressを構築する方法」の終焉

ウェブ制作の前提そのものが根本的に変化し、WordPressが前提としてきた「自分で積み上げる」モデルは、もはや唯一の選択肢ではなくなった。

かつてのように、サーバーを借り、CMSをインストールし、テーマを選び、プラグインを探し、セキュリティを自衛するという一連の体験は、多くの個人やスモールビジネスにとって、もはや過剰な負担でしかない。WP Mayorの記事が指摘する通り、ウェブの消費行動が「所有から利用へ」と移行する中で、この参入障壁の高さは深刻なコストとして認識されるようになった。

公開データが示す調査結果も興味深い。2026年1月の調査では、スモールビジネスの68%がソーシャルメディアと有料広告を成長の最大のドライバーと見なしていた。自社サイトは、かつての「最初の一歩」から「信頼性を担保する二の次の存在」へと役割を変えたのだ。

参入障壁という名のジレンマ

WordPressの柔軟性は、それを楽しめる人にとっては未だ最大の武器だ。しかし、スピードと簡便さを求める一般人にとって、WordPressが要求する「技術的なリテラシー」は、単なる面倒くささでしかない。最近のAIサイトビルダーがこれほど急速に支持を集めているのは、この「面倒くささ」をゼロにしたからに他ならない。

WP Mayorの記事は、この点について「いじくり回すことを楽しむ人が減ったとき、柔軟性はアドバンテージからコストに変わる」と明確に断じている。この変化は、WordPressがターゲットとすべき市場が「手間をかけてでも理想を追求する層」へと限定されつつあることを示唆している。

悪化するブランドパーセプション

悪化するブランドパーセプション

構造的な問題に加え、WordPressにはイメージ面での逆風も吹いている。「遅い」「セキュリティが脆弱」というレッテルは、時に誤解を含みつつも、新規ユーザーの選択を阻害する強力な要因だ。

セキュリティに関して言えば、「WordPressコアに重大な脆弱性が多い」という認識は、データに基づくと不正確だ。Patchstackのレポートによれば、2025年に報告されたコアの脆弱性はわずか6件で、いずれも重要度は低かった。問題の91%はサードパーティ製プラグインに集中しており、脆弱性の公開から悪用開始までの時間は中央値で5時間にまで短縮されている。WP Mayorの著者はこの状況を「WordPressコアは安全だが、無数のプラグインで構成される現実のサイトは危険」と評する。

表示速度も同様の構図だ。Core Web Vitalsの合格率は改善傾向にあるものの、モバイルでの合格率は約45%と、Shopify(68〜75%)などに大きく水をあけられている。だが、これは技術的な限界というより、安価なホスティングや無秩序なプラグインの重ねがけによる「運用の問題」が大きい。WP Mayorの記事は「速度問題はWordPressというソフトウェアには不公平だが、典型的な導入実態には妥当な批判」と表現している。

「オープンソース」という逆説

今、オープンソースはAIブームによってかつてない隆盛を極めている。GitHub上では大規模なオープンソースAIプロジェクトが何十万ものスターを集め、コードを公開し合う文化が再び脚光を浴びている。WP Mayorの記事はここにこそ痛烈な皮肉があると指摘する。かつてオープンソースの大衆化を象徴したWordPressは、この新しい潮流から完全に取り残されているのだ。

新しい才能はWordPress.orgではなく、モダンなAIツールやJavaScriptフレームワークのリポジトリに集まっている。知名度はあっても、もはや「カッコよくない」プラットフォーム、それがWordPressの直面するイメージ上の課題だ。

AIが侵食する「すそ野」市場

AIが侵食する「すそ野」市場

WP Mayorの記事が最も深刻に捉えているのがこの問題だ。AIによるWebサイト構築の民主化は、WordPressが伝統的に得意としてきた「シンプルなサイト」の市場を根底から解体しつつある。

「サイトが欲しい」というニーズに対する解答は、もはやツールの習得ではない。LovableやCursor、Vercelのv0、WixのAIビルダーといったサービスは、ユーザーがやりたいことを自然言語で伝えれば、数分で動作するサイトを生成する。これらのツールは既に巨大なビジネスに成長しており、単なるバズワードではない。雇用主AIビルダーは、この流れが本物であることを証明している。

WP Mayorの記事は、AIの影響を「底上げ」と「天井上げ」の2つに分類する。すなわち、技術的でない人が簡単なサイトを作れるようにする底上げと、技術者がWordPressではなくCursorやAstroで高度なカスタムサイトを構築する天井上げだ。このうちWordPressにとって脅威なのは、市場規模が大きい前者の「底上げ」部分であり、これはWordPressがこれまで無意識に吸収してきた客層と完全に重なる。

プラグイン市場への波及

シンプルなサイトの需要が減退すれば、それを支えてきたプラグイン市場も連動して縮む。問い合わせフォーム、簡単なSEO対策、ギャラリー表示、ちょっとしたレイアウト変更。これまで無数のプラグインが提供してきたこれらの機能は、今やAIがその場で生成できるものだ。

WP Mayorの記事は、まだAIによるプラグイン収益減少を示す確定的なデータは存在しないと慎重に留保しつつも、「WordPressサイトでなくても済むようになったサイト群」を支えてきたプラグインこそが、エコシステムの中で最大のリスクに晒されている、という明確な見解を示している。これは、WordPressビジネスに携わる者なら誰しも直視すべき未来予測だろう。

従来のプラグイン戦略(消えゆくモデル)
シンプルな機能を提供する単機能プラグイン
機能 問い合わせフォーム
機能 シンプルなSEOテキスト生成
機能 画像ギャラリー
これからの生存戦略(生き残るモデル)
AIで簡単に複製できない「堀」を持つビジネス
データ 独自の脅威インテリジェンス
サービス リアルタイムAPI提供
流通 巨大なインストールベース

プラグインゴールドラッシュの終焉

プラグインゴールドラッシュの終焉

WP Mayorの記事が最も具体的に警鐘を鳴らすのが、プラグイン開発者の未来だ。AIによるコーディング支援は、プラグイン開発の参入障壁を劇的に下げた。2025年には12,713件のプラグインが新たに審査され、前年比で40%以上も急増した。WP Mayorはこれを「コードという防壁が消え去った状態」と表現する。

この状況下では、コードの機能だけが売りのプラグインに未来はない。誰でもAIを使えば、有料プラグインと同等の機能を一から構築できてしまうからだ。残るのは、コードだけでは再現できない「堀(Moat)」、すなわち、独自に蓄積したデータ、ライセンス認証やアップデート配信といったインフラ、あるいはユーザーからの信頼とブランド力である。

加速する寡占とデータの重要性

この変化を敏感に察知し、行動に移しているのが大手プラグイン企業だ。Awesome Motiveは多数のプラグインを買収し、そのデータと流通網を掌握することで巨大な堀を築いている。2026年5月にはLiquid WebがStellarWPブランドを統合し、傘下のプラグイン群を単一製品ラインに再編した。これらの動きは、企業価値の源泉が「コード」から「データと顧客基盤」へ完全にシフトしたことを示している。

WP Mayorの記事は、「AIは模倣者だけでなく、既存の勝者をも強力にする」と冷静な分析も加えている。すでに巨大なインストールベースを持つ企業は、AI機能を自社製品に迅速に組み込むことができるからだ。重要なのは、自身のビジネスがこの「バーベル」のどこに位置するのかを、今のうちに見極めておくことだろう。

ガバナンス不在が招く開発者離れ

ガバナンス不在が招く開発者離れ

WP Mayorの記事は、技術や市場の変化以上に深刻な問題として「プロジェクトのガバナンス」を挙げる。開発者がリスクを感じて去っていく最大の要因が、ここにあると断じている。

事の発端は、WordPressの共同創設者であるMatt Mullenweg氏が、ホスティング会社WP Engineを公の場で「WordPressのがん」と非難した2024年秋の出来事だ。WP Mayorの著者は、その後の一連の行為、すなわちWP Engineのアップデートサーバーアクセス遮断、ログイン時の「WP Engineと無関係である」という宣誓チェックボックスの設置、そして200万サイト以上で使われていたプラグインの無断フォークと乗っ取りを、「商標権の行使」の枠を超えた、統治機構の欠如を示すデモンストレーションだったと批判する。

連邦裁がAutomattic社に仮差し止め命令を出す事態にまで発展したこの騒動は、コミュニティに深い傷を残した。WP Mayorの記事は、これが単なる企業間紛争ではなく、優秀な開発者に対して「このプラットフォームに貢献する真のコスト」を知らしめる出来事だった、と厳しく指摘している。

構造的欠陥は何も変わっていない

WP Mayorの記事が最も憂慮するのは、問題の根本が2026年半ばの現在まで全く変わっていない点だ。WordPress.orgの配信インフラとプラグインディレクトリは、非営利財団ではなく、Mullenweg氏個人の資産であるという構造的な事実。そこには監視委員会も、コミュニティがリーダーの決定を覆すメカニズムも存在しない。

ガバナンス改革を主導したコミュニティリーダーのアカウントが停止され、代替リポジトリを目指したプロジェクトは出資者を得られず頓挫した。WP Mayorの記事は、この一連の出来事を「才能ある人々は皆、結論を出した。何かが変わるまでは、才能の流出は止まらない」と総括している。これは、WordPressの未来を左右する、極めて政治的な、しかし避けては通れない核心的な課題だ。

この記事のポイント

  • WordPressの市場シェア低下は緩やかであり、エコシステムが崩壊しているわけではない。しかし、かつてのように「誰でも最初に選ぶツール」ではなくなりつつある。
  • ユーザー層と開発者コミュニティの高齢化は深刻で、若い才能の流入不足が長期的な競争力を削いでいる。
  • シンプルなサイト構築需要はAIに奪われつつあり、単機能プラグインの市場は決定的に縮小する公算が大きい。
  • 生き残るには、コード以外の独自データや流通網といった「堀」が不可欠だ。ビジネスは二極化し、中間層は消える。
  • プラットフォームのガバナンス問題は、今後もエコシステム最大の不安定要因であり続ける。その影響は技術的な課題よりも根深い。
SiteGuard WP Pluginでwp-loginが表示される原因とMultiViewsの無効化手順

SiteGuard WP Pluginでwp-loginが表示される原因とMultiViewsの無効化手順

なぜ /wp-login/ でログイン画面が表示されてしまうのか

なぜ /wp-login/ でログイン画面が表示されてしまうのか

この現象は SiteGuard WP Plugin の仕様ではなく、サーバー環境に由来する問題だ。Apache の MultiViews 機能が有効になっていると、/wp-login/ へのアクセスが内部的に /wp-login.php にマッチしてしまい、ログイン画面が表示される。

MultiViews は Apache のコンテンツネゴシエーション機能の一部で、リクエストされたパスに拡張子がない場合に、サーバー側で適切なファイルを探し出して提供する仕組みだ。/wp-login(もしくは末尾スラッシュ付きの /wp-login/)を要求すると、Apache は wp-login.php という実ファイルを見つけて実行してしまう。これが根本の原因であり、ログインページ変更機能で隠しパラメータを追加しても、このフィルタをすり抜けてしまうケースが生まれていた。

実際に WordPress.org フォーラムで報告され、プラグイン開発者によってバージョン 1.8.4 で対策が施された。しかし /wp-login/任意の文字列(例:/wp-login/test)に対しては、引き続き MultiViews の影響でログイン画面が表示される可能性が残っている。完全に防ぐには、Apache 側で MultiViews を無効化する必要がある。

アクセスパターンと挙動の比較
Before(MultiViews 有効+SiteGuard 1.8.0〜1.8.3)
/wp-login/ → ログイン画面が表示される
/wp-login/test → ログイン画面が表示される
After(MultiViews 無効化+SiteGuard 1.8.4)
/wp-login/ → 404 ページが表示される
/wp-login/test → 404 ページが表示される
問題のある状態(MultiViews 有効)  対策後(MultiViews 無効)

このデモは MultiViews の有無によるアクセス結果の変化を示している。

SiteGuard WP Plugin 側の対策と残る課題

SiteGuard WP Plugin 側の対策と残る課題

バージョン 1.8.4 で /wp-login/ はブロック対象に

SiteGuard WP Plugin 1.8.4 では、内部的に /wp-login/ へのアクセスを捕捉し、ログインページ変更機能で指定した独自 URL 以外からのアクセスをブロックする処理が追加された。これにより、多くの環境で「/wp-login/」を直接叩かれてもログイン画面が表示されなくなった。

/wp-login/任意の文字列 は依然としてすり抜ける

しかし URL の末尾にさらにパスを付け足した /wp-login/something のようなアクセスは、プラグイン側の正規表現やルールでは補足しきれず、Apache の MultiViews がマッチする限りログインページを返してしまう。これはプラグインのバグというより、Web サーバーのモジュールが優先してしまう構造的な問題だ。

Apache で MultiViews を無効化する手順

Apache で MultiViews を無効化する手順

最も確実な対策は、Apache の設定で MultiViews を無効にすることだ。レンタルサーバーを利用している場合でも、.htaccess ファイルで制御できるケースが多い。

MultiViews 無効化の手順
STEP 1 FTP やファイルマネージャーで WordPress ルートの .htaccess を開く
STEP 2 ファイルの先頭付近に Options -MultiViews を追加
STEP 3 保存してサーバーにアップロード
STEP 4 シークレットウィンドウで /wp-login/ にアクセスし、404 になるか確認

この手順により、Apache が MultiViews を使ったファイルの自動解決を行わなくなり、/wp-login//wp-login/何らかのパス へのアクセスでログイン画面が表示されることはなくなる。

.htaccess の記述例

WordPress の標準的な .htaccess に組み込む場合は、以下のような形になる。Options -MultiViews はリライトルールよりも手前に書くのがセオリーだ。

# BEGIN WordPress
Options -MultiViews

<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

MultiViews 無効化ができない場合の代替策

レンタルサーバーの制限で Options -MultiViews が許可されていない環境もまれにある。その場合は、より直接的なリダイレクトルールを追加して、/wp-login/ へのアクセスを 404 ページやトップページに飛ばす方法がある。

RewriteRule ^wp-login/ - [R=404,L]

このルールを .htaccess の RewriteEngine On の直後に追記すれば、/wp-login/ というパスで始まるリクエストすべてを 404 で返す。ただしリライトの優先順位によっては、他のルールと競合しないか必ずテストすること。

404 ページをブラウザ標準から WordPress テーマのものに切り替える

404 ページをブラウザ標準から WordPress テーマのものに切り替える

質問の中で「ブラウザ標準の 404 ページではなく、WordPress テーマ側の 404 ページに遷移させたい」という要望があった。SiteGuard WP Plugin 1.7.x 系では、ログインページ変更機能が動作すると WordPress の 404 テンプレートを表示する挙動だった。これが 1.8.x 系で Apache の標準エラー応答に変わったのは、プラグインの内部ロジックがより低レイヤーでリクエストを遮断するように再設計されたためだ。

WordPress テーマの 404 ページを表示させたい場合は、プラグイン任せにせず、Apache の ErrorDocument ディレクティブを利用する方法がある。ただし完全に同一の外観を保つのは難しく、セキュリティ上の観点からも、404 ページの表示にこだわるよりも「不正なアクセスをいかに早く遮断するか」に注力したほうが実用的だ。

よくある質問

SiteGuard WP Plugin のログインページ変更だけでは不十分なのか

ログインページ変更機能は、ボットによる辞書攻撃や自動スキャンの大半を防ぐ効果がある。しかしサーバー側の MultiViews のような特殊な設定が残っていると、その穴を突かれる可能性がゼロではない。基本はプラグイン任せ、より強固にしたい場合は MultiViews の無効化を組み合わせるのが現実的な落としどころだ。

MultiViews を無効にすると他の機能に影響はあるか

WordPress は基本、PHP ファイルを直接呼び出すスタイルで動作しているため、通常の運用で MultiViews が必須になることはほぼない。静的ファイルの MIME タイプや言語ネゴシエーションを使っている特殊なカスタマイズがなければ、影響は出ないと考えてよい。

Nginx 環境でも同じことは起きるのか

Nginx には Apache の MultiViews に相当する機能は標準で存在しないため、この問題は発生しない。Nginx の場合は try_files ディレクティブの設定ミスによって似た現象が起こることがあるが、原因はまったく異なる。

プラグインを最新にしたのに管理画面が 404 になることがある

SiteGuard WP Plugin の「管理ページアクセス制限」を有効にしていると、未ログイン状態で /wp-admin/ にアクセスするとサイトトップにリダイレクトされる。また「管理者ページからログインページへリダイレクトしない」設定を ON にしている場合のリダイレクト先も確認しておくと混乱が少ない。

この記事のポイント

  • /wp-login/ からのログイン画面表示は MultiViews が原因
  • SiteGuard WP Plugin 1.8.4 で基本対策は完了している
  • 根本解決には Apache の MultiViews 無効化が必要
  • .htaccess に Options -MultiViews を追加するだけで対処可能
  • 404 表示にこだわるより、アクセス遮断の仕組みを優先する
NextGEN GalleryでTrying to access array offset on null警告の原因と直し方

NextGEN GalleryでTrying to access array offset on null警告の原因と直し方

NextGEN Gallery(管理画面では「NextGEN Gallery」と表示)で「Trying to access array offset on null」というPHP警告が繰り返し出力される場合、原因はテンプレートファイル内で $thumb_size 変数がnullのまま配列としてアクセスされていることにある。テーマのfunctions.phpに一時的なnullチェックを追加するか、プラグインの該当テンプレートを直接修正することで警告を止められる。

なぜ「Trying to access array offset on null」が発生するのか

なぜ「Trying to access array offset on null」が発生するのか

この警告はPHP 7.4以降で追加された「配列オフセットへのnullアクセス」に関するエラーレベル通知だ。NextGEN Galleryの /templates/Thumbnails/index.php 110行目周辺では、サムネイル画像の幅と高さを次のように取得しようとしている。

$thumb_size['width']
$thumb_size['height']

通常 $thumb_size にはサムネイルサイズの設定が格納された配列が入るが、特定の条件下(ギャラリー設定の不整合、画像メタデータの欠落、プラグイン内部の処理順序による変数未代入)でnullになる。nullの変数に対して配列のキーでアクセスしようとすると、PHPは警告を発行する仕組みだ。

エラーの発生箇所を特定する手順

エラーの発生箇所を特定する手順

警告メッセージにファイルパスと行番号が含まれているため、どこで問題が起きているかは一目瞭然に思える。しかし実際には以下の点を確認しておくと、修正後の再発防止に役立つ。

Before エラー発生時の状態
$thumb_size = null;
echo $thumb_size[‘width’]; // PHP Warning
After nullチェック追加後
if (is_array($thumb_size)) {
  echo $thumb_size[‘width’];
}
エラー状態  修正後

上図のように、変数が配列であることを確認する is_array() チェックを入れるだけで警告は出なくなる。以下に具体的な修正方法を3つのレベルで示す。

デバッグモードで警告を可視化する

本番サイトでは警告が非表示設定になっていることも多い。問題を見逃さないために、一時的に wp-config.php を編集してデバッグモードを有効にする。

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

WP_DEBUG_DISPLAY をfalseにすれば画面には警告が出ず、/wp-content/debug.log に記録される。警告の再現性を確認したら、必ず WP_DEBUG をfalseに戻すことを忘れないようにしよう。

管理画面からプラグインのバージョンを確認する

「プラグイン」画面でNextGEN Galleryのバージョンが最新かどうかを確認する。2026年6月現在、NextGEN Galleryはバージョン3系が主流で、多くのnull関連の警告はバージョンアップで修正されている。更新が可能であれば、まずプラグインの更新を実行するのが最も安全な対処法だ。

エラーログで発生頻度とパターンを見極める

警告が散発的なのか、特定のページ表示時のみなのかによって対応の緊急度が変わる。デバッグログを確認し、同じ警告が何度も出ているなら恒久的な修正が必要だ。特定のギャラリーページだけなら、そのギャラリーの設定に問題がある可能性が高い。

警告を止める3つの修正アプローチ

警告を止める3つの修正アプローチ

NextGEN Galleryのコアファイルを直接編集する方法、子テーマから上書きする方法、functions.phpでフィルターフックを使う方法の3つがある。サイトの運用方針に合わせて選んでほしい。

STEP 1 プラグインを最新版に更新する(最も安全)
STEP 2 それでも直らなければ index.php にnullチェックを追加
STEP 3 更新で上書きされるため、必要なら子テーマやフィルターで恒久対応

アプローチ1 プラグインのコアファイルを直接修正する

最も短期的で簡単な方法だ。ただしNextGEN Galleryが更新されると修正が上書きされるため、恒久的な対応にはならない。該当ファイルは以下にある。

wp-content/plugins/nextgen-gallery/templates/Thumbnails/index.php

110行目と111行目付近の $thumb_size['width']$thumb_size['height'] を、以下のように is_array() で囲む。

if (is_array($thumb_size)) {
    $width  = $thumb_size['width'];
    $height = $thumb_size['height'];
} else {
    $width  = 240; // デフォルトの幅
    $height = 160; // デフォルトの高さ
}

デフォルト値には、NextGEN Galleryの「ギャラリー設定 → サムネイル設定」で指定されているサイズを入れておくと、画像が崩れずに表示される。

アプローチ2 子テーマでテンプレートを上書きする

NextGEN Galleryはテーマによるテンプレート上書きをサポートしている。修正した index.php を以下のパスに配置すれば、プラグイン更新後も修正が維持される。

wp-content/themes/your-child-theme/nggallery/thumbnails/index.php

元の /templates/Thumbnails/index.php をコピーし、該当行にnullチェックを追加して保存するだけだ。子テーマを使っていない場合は、この機会に作成しておくと今後のカスタマイズにも役立つ。

アプローチ3 functions.phpで警告を抑制する(非推奨)

どうしてもテンプレートを修正できない事情がある場合は、警告そのものを表示させない方法もある。ただし根本解決ではないため、最終手段として理解しておくといい。

add_action('init', function() {
    if (defined('WP_DEBUG') && WP_DEBUG) {
        error_reporting(E_ALL & ~E_WARNING);
    }
});

このコードはWordPressのデバッグモードが有効な場合のみ警告レベルを下げる。しかし他の重要な警告も見逃すリスクがあるため、あくまで一時的な回避策として考えてほしい。

修正後も警告が消えない場合の追加チェック

修正後も警告が消えない場合の追加チェック

上記の修正を適用してもまだ警告が出るなら、キャッシュのクリアを試す。NextGEN Galleryは独自の画像キャッシュを持っており、テンプレートの変更がすぐに反映されないことがある。

NextGEN Galleryのキャッシュをクリアする

管理画面の「ギャラリー → その他のオプション → 画像オプション」にある「キャッシュをクリア」ボタンを実行する。さらにWordPress全体のキャッシュ(プラグインやCDNを使用している場合はそれらも含めて)をクリアすると、テンプレートの変更が確実に反映される。

nullが発生する根本原因を探る

$thumb_size がnullになるのは、ギャラリー設定や画像のアップロード時にメタデータが正しく生成されなかった場合に多い。管理画面から該当ギャラリーを開き、各画像の「メタデータを更新」を実行する。また、ギャラリー設定で「サムネイルサイズ」が未設定になっていないかも確認してほしい。

よくある質問

この警告を放置してもサイトは壊れないか

警告(Warning)はエラー(Fatal Error)と異なり、スクリプトの実行は継続される。サムネイル画像が一部表示されない可能性はあるが、サイト全体が停止することはない。ただし警告が大量に出力されるとデバッグログが肥大化し、サーバーのディスク容量を圧迫する原因になる。

NextGEN Gallery以外のプラグインでも同様の警告は出るのか

PHP 7.4以降では配列アクセスの扱いが厳格化されたため、古いプラグインやテーマで同様の警告が発生することがある。対象プラグインが更新されていない場合は、今回紹介したnullチェックの手法を応用して修正可能だ。

警告が debug.log に出続けて容量がいっぱいになりそうだ

WP_DEBUG_LOG をtrueにしたまま長期間放置すると、ログファイルが数GBに膨れ上がることがある。問題を特定したら速やかに WP_DEBUG をfalseに戻す。どうしてもデバッグを続ける必要があるなら、定期的にログローテーションを行うか、WP_DEBUG_LOG'/path/to/custom-debug.log' のように指定して管理しやすくするといい。

プラグインを更新したくない(カスタマイズが消えるのが怖い)

NextGEN Galleryのテンプレートを直接編集している場合、プラグイン更新で修正が上書きされる不安は理解できる。今回紹介した子テーマによるテンプレート上書きを使えば、プラグイン本体には手を加えずに済む。カスタマイズを維持したまま、コアのバグ修正やセキュリティアップデートだけを取り込める。

NextGEN Galleryの代わりになるプラグインはあるか

標準の「メディアとカテゴリー」を使ったギャラリー機能でも十分な場合や、Envira GalleryやFooGalleryといった代替プラグインも選択肢になる。ただしNextGEN Galleryは長年の実績があり、ギャラリー数が多いサイトでは移行コストを考慮する必要がある。

この記事のポイント

  • 「Trying to access array offset on null」はPHP 7.4以降の厳格化による警告
  • NextGEN Galleryの /templates/Thumbnails/index.php$thumb_size がnullになるのが原因
  • is_array() によるnullチェックで警告を止められる
  • 子テーマでテンプレートを上書きすればプラグイン更新後も修正が維持される
  • 修正後はNextGEN GalleryのキャッシュとWordPress全体のキャッシュをクリアする