WordPressの「Warning: Attempt to read property」の原因と対処方法

WordPress WordPress
この記事は約7分で読めます。

WordPressを利用していると、PHPのバージョンアップ後などに、次のようなWarningが表示されることがあります。

AH01071: Got error 'PHP message: PHP Warning: Attempt to read property "xxxx" on false in /xxx/xxx on line xx

このエラーは、PHPのプログラムでオブジェクトではない値からプロパティを取得しようとした場合などに発生します。

この記事では、「Attempt to read property」の意味と、WordPressで発生した場合の原因や対処方法についてまとめてみました。

広告

1.AH01071: Got error ‘PHP message: PHP Warning: Attempt to read property… とは?

1-1. 事象の再現確認

私も遭遇したことないエラーだったのでまず再現確認から実施しました。

再現方法としては、子カテゴリがある親カテゴリの値を存在しない値に書き換えた場合に起きるので、その状態にしました。

正確には以下の手順で再現できました。

  1. 「https://bonjiri-blog.com/other/wordpress/」という正しいURLではなく「https://bonjiri-blog.com/hogehoge/wordpress/」といった存在しない親カテゴリを指定してアクセスする
  2. 本来であれば、404NotFound が出てくるはずが、「Warning: Attempt to read property…」といったようなエラーが出る
広告

2.エラーの原因

WordPressでこのWarningが発生する原因として、次のようなものがあります。

  • テーマやプラグインのPHPコードに問題がある
  • PHPのバージョンアップによってWarningが表示されるようになった
  • データベースから取得したデータが存在しない
  • WordPress関数の戻り値が null になっている
  • オブジェクトが取得できていない
  • 古いテーマやプラグインを使用している

今回は「オブジェクトが取得できていない」に該当していました。

エラーの原因は存在しないオブジェクトに対して term_id プロパティを読むことに失敗してエラーとなっています。

今回、以下のようなエラー内容だったので、

AH01071: Got error 'PHP message: PHP Warning:  Attempt to read property "term_id" on false in ~~/functions.php on line 26

term_id というプロパティを読み込もうとしてエラーが発生しており、その場所は functions.php の中の 26 行目ということが分かります。

このエラーに関する背景をもう少し深堀すると、カテゴリーページで404NotFoundが出てしまうという以下の事象に対応したときのコードがよくなくて、今回のエラーが起きました。

【Wordpress】カテゴリーページで2ページ目以降に「 404 NOT FOUND 」エラーが出るときの解決法
カテゴリーページで2ページ目以降に「404 NOT FOUND 」エラーが出たときの解決方法です。テーマはcocoonを利用しているので他のテーマの内容と少し異なることがあるかもしれませんが同じ事象で困っている人の参考になれば幸いです。ちなみに子カテゴリーのページにアクセスした際に404エラーとなる事象も同じ原因です。

この部分のコードについては別のエラーも出ており、その際にも修正していたので、今回で2度目の修正となります。

【WordPress】Warning: Undefined array key…の対処方法
ある日、サイトを編集していてカテゴリーを選択して画面遷移した際に、画面上部にWarning: Undefined array key "xxxx" in /xxx/xxx on line xxというエラーが出てきました。少し焦ったところもありましたが、何とか解決できたのでエラーの原因と対処方法をまとめてみました。
広告

3.エラーの対処方法

上記の該当箇所に対して以下2つのチェックを追加します。

  1. $parent_category が false ではないことを確認
  2. $parent_category が WordPressのエラーオブジェクトではないことを確認

具体的には以下のようなif文を追加することで対処可能です。

if ($parent_category && !is_wp_error($parent_category)) {
 ・・・・
}

functions.phpを変更する際には必ずバックアップを取ってから実施してください。

エラーが起きた場合にすぐに元に戻せるようにしておくことが大切です。

3-1-1.修正前のプログラム

一度修正前のコードを確認します。

ハイライトの処理部分でエラーが出ていました。(エラーの Line 26 はこの中では16行目)

$child_categories = get_categories('child_of='.$parent_category->term_id);	
function category_link_custom( $query = array()) {

	// カテゴリーのページ送りを修正して404を回避
	if(isset($query['name']) && $query['name'] === 'page' && isset($query['page'])) {
		$paged = $query['page'];
		if(is_numeric($paged)) {
			$query['paged'] = (int) $paged;
			unset($query['name']);
			unset($query['page']);
		}
	}
	
	// 子カテゴリーの404を回避
	if (isset($query['category_name']) && strpos($query['category_name'], '/') === false && isset($query['name'])) {
		$parent_category = get_category_by_slug($query['category_name']);
		$child_categories = get_categories('child_of='.$parent_category->term_id);	
		foreach ($child_categories as $child_category) {
			if( isset($query['name']) ) {
                if ($query['name'] === $child_category->category_nicename) {
				    $query['category_name'] = $query['category_name'].'/'.$query['name'];
		        unset($query['name']);
                }
			}
		}
	}
	
	return $query;
}
add_filter('request', 'category_link_custom');

3-1-2.修正後のプログラム

修正後のプログラムです。

具体的には以下のif文を追加しています。

if ($parent_category && !is_wp_error($parent_category)) {
 ・・・・
}
function category_link_custom( $query = array()) {

	// カテゴリーのページ送りを修正して404を回避
	if(isset($query['name']) && $query['name'] === 'page' && isset($query['page'])) {
		$paged = $query['page'];
		if(is_numeric($paged)) {
			$query['paged'] = (int) $paged;
			unset($query['name']);
			unset($query['page']);
		}
	}
	
	// 子カテゴリーの404を回避
	if (isset($query['category_name']) && strpos($query['category_name'], '/') === false && isset($query['name'])) {
		$parent_category = get_category_by_slug($query['category_name']);
        if ($parent_category && !is_wp_error($parent_category)) {
            $child_categories = get_categories(['child_of' => $parent_category->term_id]);
            foreach ($child_categories as $child_category) {
                if ( isset($query['name']) ) {
                    if ($query['name'] === $child_category->category_nicename) {
                        $query['category_name'] = $query['category_name'].'/'.$query['name'];
                    unset($query['name']);
					}
				}
			}
		}
	}
	return $query;
}
add_filter('request', 'category_link_custom');