WPの開発時は「Undefined index」に注意して@で解決する

WordPressのロゴ。

WordPress のテーマやプラグインを開発するとき、例えば配列によってカスタムフィールドやオプション値を参照することがあります。 このとき、ユーザによって設定されなかった値を参照して更新しようとすると、Undefined index エラーが発生していることがあります。

Undefined index エラーは厳密にはエラーではなく PHP Notice 警告程度で、また WP の開発においては多くの場合に問題なく動作しますが、 配布を予定しているテーマやプラグインの場合には、十分に注意してこのエラー通知が発生しないようにする必要があります。

また気が付かないうちに発生させてしまっていることも良くあります。外観上は問題ないのがこのエラー通知の恐ろしさです。 WordPress のデバッグモードを有効にして、debug.logなどに出力して確認するほうが良いでしょう。

エラーと原因の実例

次のログは実際に私が開発しているプラグインで確認した Undefined index エラーの例です。(現在はこの問題を解決しています。)

PHP Notice: Undefined index: karakuri_seo_post_page_settings_noindex in /home/xjine/xn--lcki7of.jp/public_html/wp-content/plugins/karakuri-seo-settings/karakuri-seo-settings-custom-fields.php on line 324

この問題が通知されていたのは次のようなコードです。

$karakuri_seo_post_page_settings_noindex
    = $_POST['karakuri_seo_post_page_settings_noindex'];

投稿・固定ページを保存する際に、プラグインから新たに追加したカスタムフィールドの値を取得して更新しようとして今回の問題が起きています。 ユーザが一度も編集しなかったカスタムフィールドであったため、$_POST['karakuri_seo_post_page_settings_noindex'] カスタムフィールドに値が入っていませんでした。

実際には、空の値で更新され、その後の処理は空の値であった場合を考慮して実装されているため、プラグインの動作に何も問題は起きないのですが、 内部では先のような PHP Notice が通知されていることになります。

問題の解決 @ エラー制御演算子

isset 関数を使うか、あるいはエラー制御演算子「@」を使って問題を解決することができあんす。isset 関数を使うほうが正規の解決法と言えますが、少々ソースコードが長くなります。 カスタムフィールドが大量にある場合などを考慮すれば、「@」を使った方が楽です。

先の問題を解決する場合には次のようなコードになります。

$karakuri_seo_post_page_settings_noindex
    = @$_POST['karakuri_seo_post_page_settings_noindex'];