PHPを8.0以降にバージョンアップすると突然出てくる「Attempt to read property “〇〇” on array…」というWarning(警告)メッセージ。
警告なので即座に動かなくなることはないのですが、あまり気持ちのいいものではありませんね。
というか、このメッセージがいきなりサイト画面に出てしまうようだと、デバッグモードが有効になってしまっている可能性があり、外から不具合が起きているファイルや行が丸見えになってしまうので、無効にされることを基本的におすすめします
これは、何かのデータを抽出しようとしたものの、データがないんだけどねぇ...というもので、全ページに出てくるというというよりも、その結果が発生した場合だけに出てくる警告になります(逆にデータの抽出できたページでは警告として出力されません)。
本ページ掲載のコードを使用するときは
本ページで掲載しているコードは、以下に了承した上で使用ください
- コードは商用・非商用問わず自由に使っていただいて構いませんが、コード追加による不具合やトラブルが発生しても当方では一切責任を負いません
- コードは有効化しているテーマのfunctions.php、style.cssなどへ追加することで機能します。それらのファイルへの変更を行うことに不安のある方は使用しないでください
- コードは本ページの公開日時点で私の環境において動作したものです。WordPressバージョン他環境の違いによって動作しないことがあります
- コードは、セキュリティ、コードの正確さなどにおいて完全なものではありません。中には紹介するコードを簡略化するために省略している部分があるものもありますので、ご自身でコードを十分に検証し、必要な部分の編集を行った上で使用するようにしてください
- 掲載しているのは参考コードです。自身の環境に合わせるための編集はご自身で対応いただく必要があります(コメント欄等から質問いただいても基本回答は致しません)
- 掲載しているコードの転載を禁じます(SNSで紹介いただいたり、本ページへのリンクを張っていただくことは大歓迎です)
「Attempt to read property “〇〇” on array…」の対処方法(例)
前述したようにデータ抽出時に訪ね当たらないというのが根源ですので、訪ね当たらなかったら空を返すように指定しておけば防げると思います
空を返したら不味い場合もありますので、よくテストしてください
issetで判別させる方法
コードの書き方や場合によりますが、issetで判別してやるとうまくいくことが多いようです。
例えば、その投稿の作者の情報を取得するのに、こんな感じのコードを書くと思います(コードは表示名を取得する場合です)。
global $post;
$author_id = $post->post_author;
$author_name_meta = get_the_author_meta('nickname',$author_id);
これに対して、「Attempt to read property “$post” on array…」と出るのですが、これは、「$post->post_author」で、その投稿に対する作者の情報がない!と言われているわけですので、以下のようにすればこの警告は出なくなります。
global $post;
if(isset($author_id)){
$author_id = $post->post_author;
}
$author_name_meta = get_the_author_meta('nickname',$author_id);
ただ、これだと、「$author_id」という変数がセットされないことになってしまい、その下の表示名を抽出するために使う投稿IDがないこととなるため、基本出力されることはないとは思いますが、ひょっとすると他のものが勝手に自動で吐き出されてしまうかも知れないので、以下のようにするといいでしょう。
global $post;
if(isset($author_id)){
$author_id = $post->post_author;
}else{
$author_id = '1';
}
$author_name_meta = get_the_author_meta('nickname',$author_id);
よほどのことがない限り、サイトをインストールした時に作られるIDが1のユーザーは削除されないので、訪ね当たらなかったらインストール時のユーザーの情報を!ということになり、その投稿のユーザー、または訪ね当たらなかったらID1のユーザーの情報を引っ張り出してくれます。
ただし、この方法を使用できるケース、使用できないケースがありますから、単純にユーザー定義関数の先頭で、変数(今回であれば「$author_id」)に対して情報をセットしておくなどしておくと良いかも知れませんが、本当にケースバイケースなので、やって結果を見てみてきちんと動作するかの確認は必須でしょう。
ユーザー定義関数で初期値をセットする方法
上記のissetで対処してもダメなときは、以下のようにユーザー定義関数に「$author_id=”」という定義をすることで解決できる場合があります。
function 〇〇($author_id=''){
global $post;
$author_id = $post->post_author;
$author_name_meta = get_the_author_meta('nickname',$author_id);
.......
}
この方法で指定するとき、既に()内に別の定義がある場合は、「,」で区切らないと致命的なエラー..となるのでご注意を!
変数の直上やユーザー定義関数の冒頭で初期値を設定する方法
前項の方法と同じですが、空をセットする変数が多い場合には、変数の直上や関数の冒頭で初期値をセットすることもできます。
function 〇〇(){
global $post;
$author_id='';
$author_id = $post->post_author;
$author_name_meta = get_the_author_meta('nickname',$author_id);
.......
}
空文字の判定をさせる方法
そもそもこの警告が出るのは、「$post->〇〇」で値を呼ぼうとしている時が多いので、「global $post;」を使う場合には以下のように書いて空判定させるといい場合もあります。
//$postが空の場合の処理(PHP8対策)
global $post;
if ( is_null( $post ) ) {
return;
}
以上、「Attempt to read property “〇〇” on array…」の回避方法をいくつか紹介しましたが、本当にケースバイケースで、都度ケースによって異なる対処が必要になると思います。
動作確認と検証をしながら気長に修正していきましょう。
エラーログをダッシュボードから確認する方法
ちなみに、このようなページや処理によって発生する場合、いちいちエラーログなどを見るのも面倒なので、私は以下のプラグインを入れてチェックしています。
これを使うと、レギュラー・イレギュラーに関わらず、エラーログに記録されたものをダッシュボード上で確認できるので便利ですよ。
この種のメッセージだけ表示させない方法もあるけど...
今回発生した警告や注意系のメッセージだけを非表示にする方法もあります。
プラグインのプログラムファイルやテーマのfunctions.phpへ以下を追加するだけです。
/* PHP8の警告回避 */
error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING);
ただ、これを使ってしまうと、サイト内のすべての機能(他のプラグインなども含む)に効いてしまい、気づくのが遅れて対処が大変になることもありますし、PHPプログラムとして警告や注意のないテーマやプラグインを選ぶことが難しくなってしまいますから、あまりおすすめはしません。
最後に補足として、WordPressを普通に使っていて、突然このようなメッセージが出た!なんとかしなきゃ!と思っている方、そもそもその表示が出てしまうことが問題かも知れませんから、以下のページを参考にしてみてください。
コメントを残す