PHP 8.3に更新したらWordPressにWarningが大量発生!Xeory Baseの修正記録 *広告付き

この記事にはアフィリエイトリンクが含まれる場合があります。

どうも!Kzumaです!

今回は、WordPressのPHPを8.3に更新したら、サイトのあちこちにWarningが大量発生してしまった話です。

使用しているテーマはXeory Base。長年使い続けているテーマなのですが、PHPのバージョンを更新したところ、ヘッダーや記事本文、サイドバーなどで警告が出るようになりました。

しかも、サイドバーに至ってはHTMLの断片まで表示される始末。

さすがに放置できないので、エックスサーバーのファイルマネージャーからPHPファイルを確認し、警告が発生しているコードを修正していきました。

結果として、今回確認したWarningはすべて解消。サイドバーも正常な表示に戻り、WordPressのサイトヘルスも「良好」になりました。

この記事では、実際に発生したPHPのWarningと、修正前後のコード、復旧までの手順をまとめています。

最初に注意

この記事は2026年11月3日に自分のサイトで実施した作業記録です。Xeory Baseを使用しているすべてのサイトで同じ修正が必要になるわけではありません。

PHPファイルの編集を間違えるとサイトが表示されなくなる場合があります。必ずバックアップを取得し、可能ならテスト環境で動作確認してから作業してください。

PHP 8.3への更新でXeory BaseにWarningが大量発生

今回のトラブルのきっかけは、サーバーのPHPバージョンを更新したことでした。

自分のサイトでは、WordPressのテーマにXeory Baseを使用しています。

  • 親テーマ:xeory_base
  • 子テーマ:xeory_base_child
  • 更新後のPHP:8.3系
  • 作業日:2026年11月3日

PHPの更新後にサイトを確認したところ、これまで見かけなかったWarningが複数表示されるようになりました。

サイト上部だけでなく、記事本文にも同じWarningが何度も表示されている状態です。

さらにサイドバーの表示までおかしくなっていました。

PHPを更新しただけでサイトの表示がここまで変わるとは思っていませんでしたが、警告を調べてみると、古いテーマのコードが想定していない値を参照していたことが主な原因と考えられました。

PHP 8.3だけの問題ではない

今回のWarningは、必ずしもPHP 8.3固有のエラーというわけではありません。

PHP 8系では、未定義変数や不適切な配列参照など、以前のPHPではNoticeとして扱われていた処理がWarningになるケースもあります。

つまり、PHPの更新によってテーマのコードが突然書き換わったわけではなく、以前から存在していたコード上の問題が表面化したと考えるのが近そうです。

発生したWarningと対象ファイル一覧

今回確認したWarningは以下の6か所です。

対象ファイル 行番号 エラー内容
setting.php 19行 Attempt to read property “post_name” on null
setting.php 22行 Undefined property: WP_Error::$slug
子テーマ functions.php 61行 Undefined variable $nlink
bzb-functions.php 299・301行 Trying to access array offset on false
bzb-functions.php 596行 Trying to access array offset on false
head.php 135行 Trying to access array offset on false

※行番号は修正前のファイルで確認したものです。テーマのバージョンや編集状況によって異なります。

親テーマのファイルが3つ、子テーマのファイルが1つという構成でした。

今回はそれぞれのエラー発生箇所を調べ、合計5つの修正作業を行いました。

PHPファイルの修正前に確認すること

今回の作業では、エックスサーバーのファイルマネージャーからテーマのPHPファイルを編集しました。

対象ファイルは以下のディレクトリにあります。

wp-content/
└── themes/
    ├── xeory_base/
    │   └── lib/
    │       └── functions/
    │           ├── setting.php
    │           ├── bzb-functions.php
    │           └── head.php
    └── xeory_base_child/
        └── functions.php

ここで重要なのが、編集前のバックアップです。

PHPファイルは、記号を1つ間違えるだけでもサイトが正常に動作しなくなる可能性があります。

PHPファイルの編集前に必ず確認

  • 編集するPHPファイルのバックアップを保存する
  • 可能ならサイト全体とデータベースもバックアップする
  • 修正対象のファイル名と関数名を確認する
  • 一度に大量の箇所を変更せず、少しずつ確認する
  • エラーが起きたら元の状態に戻せるようにする

また、今回は親テーマのPHPファイルを直接編集しています。

親テーマを更新すると修正内容が上書きされる可能性があるため、将来的にはテーマ側のコード更新や別の保守方法を検討したいところです。

子テーマfunctions.phpのUndefined variable修正

まず紹介するのは、今回の修正の中でも特に簡単だったものです。

記事本文に何度も表示されていたのが、次のWarningでした。

Warning: Undefined variable $nlink

対象は子テーマのfunctions.php、61行目です。

xeory_base_child/functions.php

修正前のコード

$nlink .='

この部分では、$nlink という変数に文字列を追加する処理が使用されていました。

しかし、変数が定義されていない状態で .= を使用していたため、Warningが発生していたと考えられます。

修正後のコード

$nlink ='

修正内容は、ドット「.」を1つ削除するだけ!

.= は既存の文字列に追加する演算子ですが、= は変数へ値を代入する演算子です。

今回の該当箇所では、追加ではなく代入する処理に変更したことでWarningが消えました。

たった1文字の違いですが、処理の意味は変わってきます。

すべての「.=」を削除してはいけない

複数の文字列を連結する処理では .= が必要です。今回掲載したのは修正箇所の一部であり、ほかのコードまで同じように変更するものではありません。

文字列の連結が必要な場合は、変数をあらかじめ空文字で初期化する方法もあります。

setting.phpのnull・WP_Error参照エラー修正

続いては、サイト上部に表示されていた2件のWarningです。

対象ファイルはこちら。

xeory_base/lib/functions/setting.php

問題になっていたのは、ナビゲーションメニューのCSSクラスを追加する関数でした。

修正前の問題点

固定ページの情報を取得する部分では、次のコードが使用されていました。

$page = get_page_by_title( $item->title );
$classes[] = $page->post_name;

get_page_by_title() で対象ページが見つからなかった場合、返り値はnullになります。

しかし、その状態でも post_name を参照していたため、次のWarningが発生していました。

Warning: Attempt to read property "post_name" on null

カテゴリーの取得処理でも、似た問題がありました。

$cat = get_category( get_cat_ID ( $item->title ) );
$classes[] = $cat->slug;

こちらはWP_Errorが返された場合にも、カテゴリーの slug を参照しようとしていました。

Warning: Undefined property: WP_Error::$slug

修正方法:関数全体を置き換える

setting.php 内にある、次の関数を探します。

function bzb_my_nav_menu_css_class( $classes, $item ) {

この関数を、以下のコードに丸ごと置き換えました。

function bzb_my_nav_menu_css_class( $classes, $item ) {

  if ( 'page' == $item->object ) {

    $page = get_page_by_title( $item->title );

    if ( $page instanceof WP_Post ) {
      $classes[] = $page->post_name;
    }

  } else if ( 'category' == $item->object ) {

    $cat = get_category( get_cat_ID( $item->title ) );

    if ( $cat instanceof WP_Term ) {
      $classes[] = $cat->slug;
    }

  }

  return $classes;
}

修正のポイントは instanceof による判定です。

  • 固定ページを正常に取得できた場合は、従来どおりCSSクラスを追加する
  • カテゴリーを正常に取得できた場合も、従来どおりCSSクラスを追加する
  • 取得できなかった場合は、クラスを追加せず処理を続ける

これなら取得結果がnullやWP_Errorだった場合にも、そのままプロパティを読み取ることを避けられます。

メニュー項目そのものを削除する処理ではないため、基本的には既存のメニュー表示を維持できます。

ただし、取得できなかった項目には追加のCSSクラスが付かなくなるため、そのクラスに依存するデザインがある場合は確認が必要です。

今回の修正後は、ヘッダー付近に表示されていた2件のWarningが消えました。

補足

今回使用している get_page_by_title() は、WordPress 6.2から非推奨になっています。今回の修正はnull参照への対処が目的なので取得処理自体は維持していますが、長期的にはWP_Queryなどへの置き換えを検討する必要があります。

bzb-functions.phpのサイドバー設定修正

次は、サイドバーに表示されていたWarningです。

対象ファイルは、親テーマのbzb-functions.phpでした。

xeory_base/lib/functions/bzb-functions.php

299・301行目付近で、次のWarningが発生していました。

Warning: Trying to access array offset on false

これは、配列ではないfalseという値を、配列として参照しようとした場合などに発生する警告です。

修正前のコード

$bzb_option = get_option('bzb_option');
if( is_single() || is_page() ){

この処理では、get_option('bzb_option') でレイアウトの設定値を取得していました。

しかし、WordPressの get_option() は、設定が存在しない場合などにfalseを返すことがあります。

その状態で後続の処理が $bzb_option['post_layout'] にアクセスすると、今回のようなWarningが発生します。

修正後のコード

修正対象の bzb_layout_side() 内で、先ほどのコードを以下に置き換えました。

$bzb_option = get_option('bzb_option');

if ( !is_array($bzb_option) ) {
    $bzb_option = array();
}

$bzb_option['post_layout'] = $bzb_option['post_layout'] ?? '';

if( is_single() || is_page() ){

追加したのは、取得した値が配列かを確認する処理と、post_layout の初期値を設定する処理です。

is_array() によって、設定値が配列ではなかった場合は空の配列を用意します。

さらに ?? を使うことで、post_layout が存在しない場合にも空文字を設定できるようにしています。

既存の設定値が正常に取得できている場合は、その値が維持されます。

修正後にサイドバーを確認

このコードを保存したあと、Warningが発生していたページを再読み込みしました。

サイドバーに表示されていたWarningが消え、検索欄や最近の投稿なども正常に表示されるようになりました。

HTMLの断片まで表示されていたので少し厄介でしたが、今回の環境では設定値を適切に扱うことで復旧できました。

head.phpの配列参照エラー修正

続いては、カテゴリーページのヘッダーに関係する処理です。

対象ファイルはこちら。

xeory_base/lib/functions/head.php

135行目付近で、再び次のWarningが発生していました。

Warning: Trying to access array offset on false

原因は、サイドバーのときとほぼ同じです。

修正前のコード

今回問題になっていたのは、bzb_header_meta() 内でカテゴリー設定を取得する処理です。

$cat_option = get_option('cat_'.$t_id);

if( is_array($cat_option) ){
  $cat_option = array_merge(array(
    'bzb_meta_title' => '',
    'bzb_meta_keywords' => ''),$cat_option);
}

このコードには、すでに is_array() による判定がありました。

しかし、配列だった場合にしか初期値を設定していません。

get_option() がfalseを返すと条件に入らず、そのまま後続の処理で配列として参照されてしまいます。

つまり、配列ではなかった場合の処理が抜けていたわけです。

修正後のコード

先ほどのコードを、以下に置き換えました。

$cat_option = get_option('cat_'.$t_id);

if ( !is_array($cat_option) ) {
    $cat_option = array();
}

$cat_option = array_merge(
    array(
        'bzb_meta_title'    => '',
        'bzb_meta_keywords' => ''
    ),
    $cat_option
);

これなら、設定が存在しなかった場合も空の配列を用意できます。

そのうえで array_merge() を使用し、必要な設定項目に初期値を設定しています。

  • 設定が存在する場合は、既存の値を維持する
  • 設定が存在しない場合は、空の配列から初期化する
  • メタタイトルやメタキーワードが未設定の場合は、空文字を使用する

カテゴリーのSEO設定を削除する処理ではないので、正常に保存されている設定値はそのまま使用できます。

修正後は、ページ上部に表示されていたhead.phpのWarningが消えました。

カテゴリー説明文の配列参照エラー修正

最後は、再びbzb-functions.phpです。

今度は596行目付近で、同じ配列参照エラーが発生していました。

Warning: Trying to access array offset on false

自分のサイトでは、XREALのカテゴリーページでこの警告を確認しています。

修正前のコード

bzb_category_description() の中に、以下の処理がありました。

$cat_option = get_option('cat_'.$t_id);

if(is_array($cat_option)){
  $cat_option = array_merge(array('cont'=>''),$cat_option);
}

$content = apply_filters( 'the_content', stripslashes($cat_option['bzb_meta_content']), 10 );

こちらも原因は、取得した設定値がfalseだった場合の処理です。

is_array() がfalseになると、初期値を設定する処理を通らず、配列のキーである bzb_meta_content を参照しようとします。

さらに、初期値として設定されていたのは cont というキーで、後続で使用している bzb_meta_content とは異なっていました。

これでは、必要な設定項目の存在を保証できません。

修正後のコード

今回は、$cat_option = get_option(...) から $content = apply_filters(...) までを、以下に置き換えました。

$cat_option = get_option('cat_'.$t_id);

if ( !is_array($cat_option) ) {
    $cat_option = array();
}

$cat_option = array_merge(
    array(
        'bzb_meta_content' => ''
    ),
    $cat_option
);

$content = apply_filters(
    'the_content',
    stripslashes($cat_option['bzb_meta_content'])
);

これなら、カテゴリーの説明文が設定されていない場合にも空文字を用意できます。

既存の説明文があれば、その内容を維持して表示する仕組みです。

また、元の apply_filters() にあった第3引数の 10 も、今回の置き換えコードでは削除しています。

WordPressの apply_filters() の第3引数は優先順位ではなく、フィルターに渡す追加の引数です。今回の配列参照エラーを直す主な変更は、あくまで bzb_meta_content の初期化部分です。

修正時の注意点

function bzb_category_description(){ は削除しません。

また、後ろにある if ( !empty($content) ) 以下の出力処理もそのまま残します。

置き換えるのは、今回紹介した取得処理からフィルター処理までの部分です。

修正後にXREALのカテゴリーページを再読み込みしたところ、596行目のWarningも表示されなくなりました。

配列参照エラーの共通点

今回のサイドバー、head.php、カテゴリー説明文のエラーは、いずれも設定値が存在しない場合への対応が不十分だったことが共通していました。

取得結果を確認し、必要な初期値を用意することで対処できました。

修正後の動作確認とサイドバーの復旧

ここまでの修正を終えたところで、実際にサイトを開いて確認しました。

確認した内容は以下の通りです。

  • ヘッダー付近に出ていた2件のWarningが消えた
  • 記事本文に連続表示されていた$nlinkのWarningが消えた
  • サイドバーのWarningと表示崩れが解消された
  • XREALのカテゴリーページでWarningが消えた
  • WordPressのサイトヘルスが「良好」と表示された

特にサイドバーは、WarningだけでなくHTMLの断片まで表示されていたので、正常な状態に戻ってひと安心です。

Warningが消えたからといって完全に安全とは限らない

今回の作業で、実際に確認していたWarningは解消できました。

ただし、画面に警告が表示されていないことと、サイト全体にエラーが存在しないことは別です。

WordPressのサイトヘルスが良好でも、すべてのテーマやプラグインのコードが正常であると保証されるわけではありません。

今回は、発生していた警告の解消と、表示の復旧を確認できたという結果になります。

PHPのWarningを隠すだけでは解決しない

PHPの設定を変更すれば、Warningをブラウザ上に表示させないこともできます。

ただし、それでは問題になっているコードそのものは残ったままです。

本番サイトではエラーの詳細を訪問者に見せないことも大切ですが、エラーを非表示にする処理と、原因を修正する処理は別物です。

今回はWarningの内容を確認し、該当するコードを修正することで対処しました。

まとめ|PHP更新後は古いWordPressテーマのコードにも注意

今回は、PHP 8.3への更新をきっかけにXeory Baseで発生したWarningと、その修正内容を紹介しました。

今回の修正を振り返ると、主な問題は以下の4種類でした。

  • 存在しないページのプロパティを読み取っていた
  • WP_Errorを通常のカテゴリー情報として扱っていた
  • 初期化されていない変数を使用していた
  • falseを配列として扱っていた

1つの修正で終われば楽だったんですが、ヘッダー、記事本文、サイドバー、カテゴリーページと、複数の場所で警告が発生していました。

それでも、エラーに表示されたファイル名と行番号を頼りに確認していけば、問題になっているコードを絞り込むことができました。

今回は結果的に5つの修正作業で、確認できていたWarningをすべて解消できました。

PHPの更新後にWarningが発生した場合は、まず対象ファイルと行番号を確認し、変数の初期化や取得結果のチェックが行われているかを調べてみるとよさそうです。

ただし、PHPファイルは間違った変更をするとサイト全体に影響する場合があるので、バックアップだけは忘れずに!

以上、Xeory Baseで発生したPHP Warningの修正記録でした!

参考資料

     

SNSでもご覧ください。

スポンサーリンク