PHP の「Notice: Undefined index」「Warning: Undefined array key」の直し方:WordPress の post_type を例に

WordPress 6.4.3
広告WordPress・PHP を学べる本

Amazonのアソシエイトとして、WordPress functions.phpは適格販売により収入を得ています。

概要説明

WordPress のテーマやプラグインで出る「Notice: Undefined index: post_type」(PHP 8 では「Warning: Undefined array key "post_type"」)の原因と直し方。?? ・isset・get_query_var の書き方を、PHP 7.3 と 8.3 で確認した結果つきで。

ない値を読もうとしているのが原因

次のように、配列の中の値をそのまま読む書き方で出ます。

$post_type = $wp_query->query['post_type'];

一見問題なさそうですが、post_type という値がないとき(トップページや固定ページなど)のことを考えていません。ない値を読もうとすると、PHP が Notice(注意)を出します。

PHP のバージョン 出るメッセージ
PHP 7 まで Notice: Undefined index: post_type
PHP 8 から Warning: Undefined array key "post_type"

PHP 8 では「Notice(注意)」から「Warning(警告)」に上がっています。PHP を上げたら、ログに警告がたくさん出るようになった、というときによくある原因の 1 つです。

確認した結果

post_type のない配列で、前の書き方と直した書き方を、PHP 7.3 と 8.3 で動かしました。

試したコード
$query = array( 'name' => 'sample' ); // post_type がない

$a = $query['post_type'];                                        // 前の書き方
$b = isset( $query['post_type'] ) ? $query['post_type'] : false; // isset
$c = $query['post_type'] ?? false;                               // ??
書き方 PHP 7.3 PHP 8.3
前の書き方 Notice: Undefined index: post_type Warning: Undefined array key "post_type"
isset・?? Notice も Warning も出ない(false) Notice も Warning も出ない(false)

直し方:値があるかを確認してから読む

functions.php など
// 1. ?? (値がなければ右の値)。PHP 7.0 から使える、いちばん短い書き方
$post_type = $wp_query->query_vars['post_type'] ?? false;

// 2. isset で確認してから使う
$post_type = isset( $wp_query->query_vars['post_type'] ) ? $wp_query->query_vars['post_type'] : false;

// 3. WordPress の関数で取る(メインのクエリの値。なければ空の文字)
$post_type = get_query_var( 'post_type' );
書き方 向いているとき
?? いちばん短い。ないときの値も決められる(PHP 7.0 から)
isset() で分ける あるときとないときで、処理を大きく分けたいとき
get_query_var() WordPress のメインのクエリの値を読むとき。ないときは空の文字が返る

Undefined index・Undefined array key は、どちらも「ない値を読もうとした」というメッセージです。?? か isset で、値があるかを確認してから読めば出なくなります。

SiteBeacon(サイトビーコン)

サイトが止まったら、すぐに気づける。

ホームページを 5 分ごとにチェックして、止まったとき・エラーが出たとき・SSL やドメインの期限が近いときに、メールでお知らせします。2 サイトまでは、ずっと無料で使えます。

SiteBeacon を見る サイトを直す相談をする

監視で気づいたあとの直す作業も、同じ担当がお受けします。