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 宣言で直す
  • 配布プラグインやテーマは直接書き換えず、更新や作者への報告で対応する

お気軽にご相談ください

お見積りへ お問い合わせへ
▲