Warning: Undefined variable: 変数名 inエラーの発生原因と対処した方法

はじめに

以前PHPエラー関連の記事で下記を更新しました。

Undefined

Notice: Undefined variable: 変数名 inエラーの発生原因と対処した方法について記事にしています。

「Undefined variable 変数名エラー」についてnoticeエラーとして紹介しましたが、クライアント様のご依頼で「PHPのバージョンを7.3.3から8.2.1に変更作業」を行った時はwarningエラーとして「Undefined variable 変数名エラー」が表示されたので両者の違いについても触れながら記事にしていきたいと思います。

Warning: Undefined variableエラーメッセージ全文

Warning: Undefined variable $post in ファイルパス on line 14

Warning: Undefined variableエラー該当コード

下記の14行目「$post->ID」の「$post」の部分で「$post」が定義されていない変数のためエラーが発生しています。

ちなみに下記のソースコードはカスタム投稿タイプ「voice」の最新の3記事を表示するためのソースコードです。

function outputVoiceArchive($atts){
    $voice = '';
    $args = array(
        'post_type' => 'voice',
        'posts_per_page' => 3
    );
    query_posts($args);
    if(have_posts()):
    $voice = '<div class="voice__list">';
        while(have_posts()): the_post();
            $voice .= '<div class="voice__item"><a href="'.get_the_permalink().'">';
            $voice .= '<figure>';
            if(has_post_thumbnail()):
                $voice .= '<img src="'.get_the_post_thumbnail_url($post->ID, 'custom_thumbnail').'">';
            endif;
            $voice .= '</figure>';
            $voice .= '<h3>'.get_the_title().'</h3>';
            $voice .= '<p>'.get_the_excerpt().'</p>';
            $voice .= '</a></div>';
        endwhile;
    $voice .= '</div>';
    endif;
    wp_reset_query();
    return $voice;
}
add_shortcode('voice', 'outputVoiceArchive');

Warning: Undefined variableエラーを解決する方法

$postを宣言すれば良いです。

global $postを宣言する

エラー該当コードの関数内に「global $post」を追加してください。

$post->idをget_the_IDに変更

そもそもループ内で使用しているので「get_the_ID()」を使用した方が良いです。

またエラー該当コードは非推奨である「query_posts」を使用しているので「WP_Query」を使用したソースコードに変更した方が良いです。「query_posts」が非推奨な理由は下記記事で紹介しています。

query_postsは非推奨

query_postsは非推奨である理由とWP_Queryに変更する前後のソースコードを掲載しています。query_postsをWP_Queryに変更するのはソースコードを見てわかるように少しの変更しかないのでquery_postsを見つけ

なので「get_the_ID」と「WP_query」を使用したものに変更したソースコードを下記に示します。

Warning: Undefined variableエラー修正後のコード

function outputVoiceArchive($atts){
	$voice = '';
	$args = array(
		'post_type' => 'voice',
		'posts_per_page' => 3
	);
	$query = new WP_Query($args);
	if($query->have_posts()):
		$voice = '<div class="voice__list">';
		while($query->have_posts()): $query->the_post();
			$voice .= '<div class="voice__item"><a href="'.get_the_permalink().'">';
			$voice .= '<figure>';
			if(has_post_thumbnail()):
				$voice .= '<img src="'.get_the_post_thumbnail_url($query->post->ID, 'custom_thumbnail').'">';
			endif;
			$voice .= '</figure>';
			$voice .= '<h3>'.get_the_title().'</h3>';
			$voice .= '<p>'.get_the_excerpt().'</p>';
			$voice .= '</a></div>';
		endwhile;
		$voice .= '</div>';
	endif;
	wp_reset_postdata();
	return $voice;
}
add_shortcode('voice', 'outputVoiceArchive');

PHPの「Noticeエラー」と「Warningエラー」の違い

PHPの「Noticeエラー」について

Notice エラーは、PHPプログラムの実行中に発生した軽微なエラーを示すものです。
通常、変数が未定義である場合や、未定義の配列要素にアクセスしようとした場合、Notice エラーが発生します。
Notice エラーはプログラムの実行を中断させずに続行されます。
Notice エラーは致命的なエラーではありません。

PHPの「Warningエラー」について

Warning エラーは、Notice よりも重要なエラーで、プログラムの実行中に問題が発生したことを示します。
ファイルが見つからない場合や、無効な引数が関数に渡された場合、Warning エラーが発生します。
Warning エラーは、通常はプログラムの実行を中断しませんが、問題を示し、プログラムの正常な動作を妨げることがあります。

まとめ

「Undefined variable: 変数名 inエラー」はnoticeエラーでもwarningエラーでも発生する可能性がある。noticeエラーになるかwarningエラーになるかは、エラーの重要度による。

他のPHPエラーの記事

PHPエラー一覧

PHPのエラーの種類について解説しています。具体例や解決方法については順次更新していきます。

>お問い合わせはこちら

お問い合わせはこちら