2026年7月2日
2026年7月2日
WordPressで「PHP Notice: Undefined variable」が出たときの原因と解消方法
「PHP Notice: Undefined variable」は、PHPのコードが、まだ値を入れていない変数を読もうとしたときに出る通知です。サイトが止まるエラーではありませんが、画面に表示されるとデザインが崩れたり、REST APIや管理画面の通信を壊したりすることがあります。この記事では、メッセージから原因のファイルを特定する方法、よくある原因の順番、コードの直し方、そして直すまでの間に表示だけを止める方法を説明します。
メッセージの読み方
通知はおおむね次の形で出ます。
Notice: Undefined variable: price in /home/user/public_html/wp-content/themes/my-child/single.php on line 42
読むべき点は3つです。
- 変数名(例では
price): 値が入っていない変数 - ファイルのパス: どこのコードか。
wp-content/plugins/の下ならプラグイン、wp-content/themes/の下ならテーマ、wp-includes/やwp-admin/ならWordPress本体 - 行番号: その変数を読んでいる行
PHP 8.0以降では、同じ状況が「Notice」ではなく「Warning」として報告され、書式も少し変わります。WordPressの推奨環境はPHP 8系なので(2026年10月現在)、多くのサイトではこちらの形で見かけます。
Warning: Undefined variable $price in /home/user/public_html/wp-content/themes/my-child/single.php on line 42
検索するときは「Undefined variable」の部分で探すと、両方の書式が見つかります。同じ仲間として、配列の存在しないキーを読んだ「Undefined index」(PHP 8では「Undefined array key」)、オブジェクトの存在しないプロパティを読んだ「Undefined property」もあり、考え方は同じです。
画面に出さずにログで確認する
画面に通知が出ている状態は、訪問者にサーバーのフォルダー構成を見せていることになり、望ましくありません。作業の前に、wp-config.php の設定を「ログには残すが画面には出さない」形にします。wp-config.php を編集する前に、元のファイルをコピーして残しておいてください。
// wp-config.php の「編集が必要なのはここまでです」より上に書く
define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true ); // wp-content/debug.log に記録する
define( 'WP_DEBUG_DISPLAY', false ); // 画面には出さない
@ini_set( 'display_errors', 0 );
この状態で通知が出ていたページを開き、wp-content/debug.log を確認します。同じ通知が何度も記録されていれば、ページを表示するたびに起きていると分かります。debug.log はURLを直接入力すると外部から開けてしまう場合があるため、調査が終わったら WP_DEBUG を false に戻し、ログファイルを削除しておきます。
どのプラグインやテーマから出ているかを画面上で確かめたい場合は、Query Monitor プラグインが便利です。管理者でログインした状態でページを開くと、そのページで発生したPHPの通知・警告が、発生元のプラグインやテーマごとに表示されます。
よくある原因(多い順)
1. プラグインやテーマのコードが古い
パスが wp-content/plugins/プラグイン名/ や、配布されているテーマのフォルダーを指している場合、もっとも多いのは、そのプラグインやテーマが新しいPHPのバージョンを想定して作られていないケースです。サーバーのPHPを上げたあとに急に通知が出始めた、という場合はこれが疑われます。
確認と対処の順番は次のとおりです。
- 管理画面の「プラグイン」や「外観 > テーマ」で、更新が出ていないか確認し、出ていれば更新する(更新前にバックアップを取る)
- 最新版でも出る場合は、配布元のサポートフォーラムで同じ報告がないか調べ、なければ通知の全文(パスは伏せてよい)を添えて報告する
- 長く更新されていないプラグインなら、代わりのプラグインへの移行を検討する
プラグインのファイルを直接書き換えると、次の更新で元に戻ってしまいます。直接の修正は、作者の対応を待つ間の一時しのぎにとどめてください。
2. 自分で追加したカスタマイズのコード
パスが子テーマの functions.php やテンプレートを指している場合は、自分のコードを直します。典型的なのは、if の中でだけ変数に値を入れ、if の外で読んでいるパターンです。
<?php
// 問題のあるコード:条件に合わないと $label が作られない
if ( has_tag( 'sale' ) ) {
$label = 'セール中';
}
echo '<span class="label">' . esc_html( $label ) . '</span>';
最初に値を入れておけば、どの経路を通っても変数が存在します。
<?php
$label = ''; // 先に初期値を入れる
if ( has_tag( 'sale' ) ) {
$label = 'セール中';
}
if ( '' !== $label ) {
echo '<span class="label">' . esc_html( $label ) . '</span>';
}
外から渡ってくる値(配列のキーやフォームの入力)のように、あるか分からないものを読むときは、isset() で確かめるか、PHP 7.0以降で使える ?? 演算子で既定値を決めます。
<?php
$color = $settings['color'] ?? 'blue';
ただし、通知を消すために、すべての変数に @ を付けて警告を抑える書き方はおすすめしません。本当に起きている不具合まで見えなくなるためです。
3. テンプレートパーツに変数が渡っていない
テンプレートから get_template_part() で別のファイルを読み込むと、呼び出し元の変数は読み込み先では使えません。呼び出し元で $price を作っていても、読み込んだパーツの中では「Undefined variable」になります。WordPress 5.5以降では、3番目の引数に配列を渡し、読み込み先で $args から取り出せます。
<?php
// 呼び出し元(例:single.php)
get_template_part( 'template-parts/price', null, array( 'price' => $price ) );
// 読み込み先(template-parts/price.php)
$price = $args['price'] ?? 0;
echo esc_html( number_format( (int) $price ) );
4. グローバル変数を宣言せずに使っている
関数の中で $post や $wpdb を使うとき、global $post; のように宣言しないと、関数の中では未定義の変数として扱われます。
<?php
function my_show_post_id() {
global $post; // これが無いと「Undefined variable」になる
if ( $post instanceof WP_Post ) {
echo (int) $post->ID;
}
}
投稿のIDやタイトルが欲しいだけなら、get_the_ID() や get_the_title() を使うほうが、グローバル変数に頼らずに済みます。
5. WordPress本体のファイルが指されている
パスが wp-includes/ や wp-admin/ の場合でも、本体そのものの不具合はまれです。多くは、プラグインがWordPressの関数に想定外の値を渡した結果、本体の中で通知が出ています。Query Monitor の表示や、ログの前後に記録されている内容から、呼び出し元のプラグインを探します。本体のファイルが壊れている疑いがあるときは、バックアップを取ったうえで本体を再インストールします。
通知を放置すると起きること
通知はサイトを止めませんが、画面に出力されると次のような問題につながります。
- 本文やヘッダーの前に文字が出て、レイアウトが崩れる
- 出力のあとにリダイレクトやCookieの設定が行われると、「Cannot modify header information - headers already sent」という別の警告が出て、ログインやリダイレクトが失敗する
- ブロックエディターの保存やREST APIの応答に通知の文字が混ざると、JSONとして読めなくなり、保存に失敗する
逆に言えば、「更新に失敗しました」などの症状の裏に、この通知が隠れていることもあります。
本番サイトでの表示設定
本番サイトでは、通知があっても画面に出さない設定にしておくのが基本です。WP_DEBUG を false にすると、WordPressは報告するエラーの種類を絞り、Notice は報告の対象から外れます。ところが、PHP 8以降では同じ内容が Warning として出るため、WP_DEBUG が false でも、サーバー側の php.ini で display_errors が有効になっていると画面に表示されます。「デバッグモードは切っているのに表示される」という場合はこれが原因です。サーバー会社のコントロールパネルにPHPの表示設定がある場合は、エラーの表示を無効にしておきます。
表示を止めるのは、あくまで訪問者に見せないための措置です。原因のコードを直すか、プラグインの更新を待つ作業は別に進めてください。
まとめ
- 「Undefined variable」は、値の入っていない変数を読んだという通知で、PHP 8以降は Warning として出る
- メッセージのパスでプラグイン・テーマ・自作コードのどれかを見分け、行番号で該当箇所を見つける
- 調査中は
WP_DEBUG_LOGでログに残し、画面には出さない - 自作コードは初期値の設定、
isset()や??、get_template_part()の$args、global宣言で直す - 配布プラグインやテーマは直接書き換えず、更新や作者への報告で対応する