レンタルサーバーを移管したときに、次のようなエラーが発生しました。
Warning: Undefined array key 8 in /home/public_html/wp-content/themes/functions.php on line 94
この記事ではこの原因と対処法についてまとめています。
エラーの内容
このエラーの内容は次のようなものです。
「警告: /home/xxx/prograshi.com/public_html/wp-content/theme/cocoon-my-child/functions.php の 94 行目にある配列キー 8が未定義」
エラーが発生しうる3つの原因
このエラーは、functions.phpファイルの94行目で、配列に存在しないキー(8, 9, 10)にアクセスしようとしたために発生したものです。
レンタルサーバーを移管した際に、PHPの設定やバージョンの違い、または配列のデータが正しく読み込まれなかったことが原因で、このようなエラーが表示されることがあります。
原因1: PHPバージョンの違い
移管前のサーバーと移管後のサーバーで使用しているPHPのバージョンが異なる場合、PHPの動作が微妙に異なることがあります。特に、未定義の配列キーにアクセスする際の警告メッセージが異なることがあります。
原因2: データの移行ミス
データベースやファイルの移行が不完全で、一部のデータが正しく移行されていない可能性があります。
これにより、配列に期待するデータが存在しないことがあります。
FTPソフトなどでファイルやフォルダを移管した際に、途中で停止してしまった場合などに発生する可能性があります。
原因3: コードの問題
functions.phpファイルで、配列のキーが存在するかを確認せずにアクセスしている可能性があります。これが原因で、存在しないキーにアクセスした場合にこのエラーが発生します。
PHPバージョンの確認
サーバー移管でこのエラーが発生した場合、一番の可能性はPHPバージョンの違いです。
まずは旧サーバーに入ってPHPの状態を確認します。「8.3」になってます。
次に、移管後のサーバーに入ってPHPのバージョンを確認します。バージョンが「8.1.22」になっていました。
「8.3」と「8.1」でマイナーバージョンがずれています。
対策1: PHPバージョンの違い
修正として、移管後のサーバーのPHPのバージョンを旧サーバーと同じ「8.3系」に変更します。
変更しましたが、直りませんでした。。
対策2: データの移行ミス
エラー発生原因にデータの移行ミスがあります。
移行ミスしていないかを確かめるため、旧サーバーの現在使用中のテーマの中にあるfunctions.phpと、新サーバーの現在使用中のテーマの中にあるfunctions.phpを確認してみます。
確認したところ、全く同じものがコピーされていました。
対策3: コードの問題
エラーの原因になっているfunctions.phpの該当部分のコードは以下のようになっています。
これは、h2タグの上に指定した広告を表示するためのプログラムです。
// 表示表示設定
$show_ads = [ //ウィジェット投稿本文中
[true, $adsence],
[true, $adsence],
[true, $adsence],
[true, $adsence],
[true, $adsence],
[true, $adsence],
[true, $adsence],
[true, $adsence],
[true, $adsence],
[true, $adsence],
];
if ( is_single() ) {
$h2 = '/^<h2.*?>.+?<\/h2>$/im';
if ( preg_match_all( $h2, $the_content, $h2s )) {
if ( $h2s[0] ) {
for ($i=0; $i <= 10; $i++){
if ( $h2s[0][$i] && $show_ads[$i][0] ) {
$the_content = str_replace($h2s[0][$i], $show_ads[$i][1].$h2s[0][$i], $the_content);
}
}
}
}
}
return $the_content;
}
add_filter('the_content','show_ads_on_selected_h2');
今回はこのコードがエラーの原因になっているようなので以下のように修正します。
エラー発生個所でキーのない変数を処理していることが問題なので、issetメソッドを用いて、存在している場合のみ処理を実行するように変更しました。
for ($i=0; $i <= 10; $i++){
if ( isset($h2s[0][$i]) && $show_ads[$i][0] ) {
$the_content = str_replace($h2s[0][$i], $show_ads[$i][1].$h2s[0][$i], $the_content);
}
}
WEBサイトを確認するとエラー表示が消えました。
以上で対応は完了です。